ローンチタイプ
プロジェクトベスティング
Last updated August 24, 2026
Genesis のプロジェクトベスティングは、ClaimScheduleBucketV2 を使い、オンチェーンのクリフと定期線形スケジュールに従って 1 つのトークン割り当てを 1 人の受取人へ解放します。
構築するもの
このガイドは、10% クリフ、月次線形アンロック、任意の権限者制御を持つ 1 年のプロジェクトトークンベスティング割り当てを作成します。
概要
ClaimScheduleBucketV2 は、プロジェクト、チーム、アドバイザー、またはトレジャリーのトークンベスティング向けの第一級 Genesis アウトフローバケットです。受取人、割り当て、クレーム履歴、ベスティングカーブ、一時停止状態、ポリシー制御、任意のキャンセル動作をオンチェーンに保存します。
- 1 つのバケットは 1 つのトークン割り当てを 1 人の現在の受取人へベストします
ClaimScheduleは独立したクリフと期間ベースの線形アンロックを組み合わせます- クレームは Permissionless ですが、常にバケットの受取人へ支払います
- 任意ポリシーで権限者の一時停止、キャンセル、受取人によるキャンセル、受取人変更をサポートします
ジャンプ先: クイックスタート · ベスティングの仕組み · ランタイム制御 · キャンセル · リファレンス
ClaimScheduleBucketV2 と ClaimSchedule
ClaimScheduleBucketV2 はプロジェクト割り当てを所有するアカウントであり、ClaimSchedule はそのアカウントに埋め込まれた再利用可能なベスティングカーブです。
| 型 | 目的 |
|---|---|
ClaimScheduleBucketV2 | 1 人の受取人、割り当て、クレーム済み量、スケジュール、クレームゲート、一時停止状態、ポリシー、終了動作を保存します |
ClaimSchedule | クリフ量、クリフ条件、線形開始条件、期間、アンロック周期を定義します |
ClaimScheduleV2Extensions | ランタイムポリシーフラグと任意のバックエンドクレーム署名者を保存します |
Genesis に ClaimScheduleBucketV1 はありません。プロジェクトベスティングには V2 のアカウントと命令名を使ってください。ClaimSchedule は他のバケット拡張でも使われるため、スケジュール型だけではプロジェクトベスティングバケットを識別できません。
クイックスタート
クイックスタートは、初期化済みだがまだファイナライズしていない Genesis V2 アカウントに、10% クリフと月次線形アンロックの 1 年ベスティングバケットを追加します。
先に Genesis セットアップ を完了し、ベーストークン供給からベスティング割り当てを確保してください。すべてのバケット割り当ての合計は Genesis アカウントの総供給量に収まる必要があります。
プロジェクトベスティングバケットの作成
addClaimScheduleBucketV2 は Genesis アカウントのファイナライズ前にバケットを作成します。
1import {
2 addClaimScheduleBucketV2,
3 createClaimSchedule,
4 createTimeAbsoluteCondition,
5 findClaimScheduleBucketV2Pda,
6 genesis,
7} from '@metaplex-foundation/genesis'
8import { keypairIdentity, publicKey } from '@metaplex-foundation/umi'
9import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
10
11const umi = createUmi('https://api.mainnet-beta.solana.com').use(genesis())
12
13// umi.use(keypairIdentity(yourKeypair))
14
15const genesisAccount = publicKey('YOUR_GENESIS_ACCOUNT')
16const baseMint = publicKey('YOUR_PROJECT_TOKEN_MINT')
17const recipient = publicKey('VESTING_RECIPIENT')
18const bucketIndex = 0
19
20const [vestingBucket] = findClaimScheduleBucketV2Pda(umi, {
21 genesisAccount,
22 bucketIndex,
23})
24
25const DAY = 86_400n
26const vestingStart = BigInt(Math.floor(Date.now() / 1000)) + 7n * DAY
27const vestingEnd = vestingStart + 365n * DAY
28
29await addClaimScheduleBucketV2(umi, {
30 genesisAccount,
31 baseMint,
32 authority: umi.identity,
33 recipient,
34 bucketIndex,
35 baseTokenAllocation: 100_000_000_000_000n, // 100,000 tokens at 9 decimals
36 claimStartCondition: createTimeAbsoluteCondition(vestingStart),
37 claimSchedule: createClaimSchedule({
38 startTime: vestingStart,
39 endTime: vestingEnd,
40 period: 30n * DAY,
41 cliffTime: vestingStart,
42 cliffAmountBps: 1_000, // 10%
43 }),
44 pausable: true,
45 cancelable: true,
46 cancelableByRecipient: false,
47 transferable: true,
48 transferableByRecipient: false,
49 backendSigner: null,
50 endBehaviors: [],
51}).sendAndConfirm(umi)
52
53console.log('ClaimScheduleBucketV2:', vestingBucket)
他の配布バケットをすべて追加してから、Genesis セットアップ の通り finalizeV2 を呼び出します。ファイナライズは不可逆です。
ベスト済みプロジェクトトークンのクレーム
claimClaimScheduleV2 は、現在ベスト済みで未クレームのトークンすべてをバケットに保存された受取人へ転送します。
1import {
2 claimClaimScheduleV2,
3 findClaimScheduleBucketV2Pda,
4 genesis,
5} from '@metaplex-foundation/genesis'
6import { keypairIdentity, publicKey } from '@metaplex-foundation/umi'
7import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
8
9const umi = createUmi('https://api.mainnet-beta.solana.com').use(genesis())
10
11// umi.use(keypairIdentity(yourKeypair))
12
13const genesisAccount = publicKey('YOUR_GENESIS_ACCOUNT')
14const baseMint = publicKey('YOUR_PROJECT_TOKEN_MINT')
15const recipient = publicKey('VESTING_RECIPIENT')
16const [vestingBucket] = findClaimScheduleBucketV2Pda(umi, {
17 genesisAccount,
18 bucketIndex: 0,
19})
20
21await claimClaimScheduleV2(umi, {
22 genesisAccount,
23 bucket: vestingBucket,
24 baseMint,
25 recipient,
26}).sendAndConfirm(umi)
27
28// All currently vested, unclaimed tokens are sent to the stored recipient.
支払者は受取人である必要はありません。命令は必要に応じて受取人の associated token account を作成し、トークンを支払者へリダイレクトすることはできません。
前回のクレーム以降に完全なベスティング周期が経過していないとき、クレームは NothingToClaim を返すことがあります。次の周期を待つか、送信前に取得したバケット状態を確認してください。
クレームスケジュールのベスティングの仕組み
クレームスケジュールは、クリフ割り当てを残りの線形割り当てから独立してアンロックします。
| フィールド | 制約 | 効果 |
|---|---|---|
startCondition | TimeAbsolute、TimeRelative、または Never | 線形ベスティングのタイムラインを固定します |
duration | 0 より大きく、10 年以下 | 線形割り当てが完全にベストされる時点を定義します |
period | 0 より大きく duration 以下 | 線形ベスティングを離散ステップで進めます |
cliffCondition | TimeAbsolute、TimeRelative、または Never | 線形スケジュールから独立してクリフをアンロックします |
cliffAmountBps | 0 から 10_000 | 割り当ての 0% から 100% をクリフに割り当てます |
割り当て A とクリフ basis points C に対し、クリフ量は A × C / 10,000 です。残り A - cliffAmount は duration にわたる完全な period ステップで線形にベストされます。
クリフは線形スケジュールを自動的に遅らせません。startCondition と cliffCondition を意図したタイムスタンプに明示的に設定してください。どちらの条件も他方の前、最中、後に発火し得ます。
クリフは startCondition + duration より後にしないでください。線形完了後の成功クレームはバケットの終了条件を発火します。それより遅いクリフは凍結された実効時刻を超え、クレーム可能にならなくなります。
クレームゲートとベスティングカーブ
claimStartCondition はトークン出金をゲートし、claimSchedule.startCondition は線形割り当てがいつ蓄積されるかを制御します。
この分離により、クレームが開く前に蓄積するスケジュールが可能です。たとえば雇用日にベスティングを開始し、claimStartCondition でトークン生成イベントまで出金を防げます。
TimeAbsolute 条件はクレームがそれらを確認したときに自身を更新します。TimeRelative 条件は受動的であり、参照される各バケットを writable remaining account として渡す triggerConditionsV2 が必要です。
1import { genesis, triggerConditionsV2 } from '@metaplex-foundation/genesis'
2import { keypairIdentity, publicKey } from '@metaplex-foundation/umi'
3import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
4
5const umi = createUmi('https://api.mainnet-beta.solana.com').use(genesis())
6
7// umi.use(keypairIdentity(yourKeypair))
8
9const genesisAccount = publicKey('YOUR_GENESIS_ACCOUNT')
10const baseMint = publicKey('YOUR_PROJECT_TOKEN_MINT')
11const vestingBucket = publicKey('CLAIM_SCHEDULE_BUCKET_PDA')
12const referenceBucket = publicKey('REFERENCE_BUCKET_PDA')
13
14await triggerConditionsV2(umi, {
15 genesisAccount,
16 bucket: vestingBucket,
17 baseMint,
18})
19 .addRemainingAccounts([
20 { pubkey: referenceBucket, isSigner: false, isWritable: true },
21 ])
22 .sendAndConfirm(umi)
23
24// Eligible TimeRelative conditions on the vesting bucket are now triggered.
参照条件が満たされたあと、クレームまたはベスティング状態の評価の前に、この Permissionless クランクを実行してください。
期間ごとの線形アンロック
period フィールドは線形割り当てを連続ではなくステップでアンロックします。
365 日の duration と 30 日の period では、線形割り当ては完全な 30 日周期ごとに増えます。端数余りは duration 全体が終わったときにクレーム可能になります。
一時停止で調整されるベスティング時間
バケットを一時停止するとベスティング時間が止まり、再開すると実効タイムラインが一時停止合計時間だけずれます。
バケットは pausedAt と totalSecondsPaused を記録します。一時停止中のキャンセルはスケジュールを pausedAt で凍結するため、一時停止中の時間はベスト量を増やしません。
プロジェクトベスティングのランタイム制御
ランタイム制御はデフォルトで無効であり、バケット作成時にポリシーフラグで有効にする必要があります。
| ポリシーフラグ | 認可された役割 | 命令 | 結果 |
|---|---|---|---|
pausable | Genesis 権限者 | setClaimSchedulePausedStateV2 | ベスティング蓄積を一時停止または再開します |
cancelable | Genesis 権限者 | cancelClaimScheduleBucketV2 | キャンセル時刻でベスティングを凍結します |
cancelableByRecipient | 受取人 | cancelClaimScheduleBucketV2 | 受取人がベスティングを凍結できます |
transferable | Genesis 権限者 | transferRecipientClaimScheduleBucketV2 | ベスティング受取人を変更します |
transferableByRecipient | 受取人 | transferRecipientClaimScheduleBucketV2 | 現在の受取人が割り当てを移転できます |
プロジェクトのベスティング契約で必要な制御だけを有効にしてください。権限者のキャンセルまたは受取人変更権は、受取人に提供する保証を実質的に変えます。
プロジェクトベスティングの一時停止と再開
pausable が作成時に有効なとき、setClaimSchedulePausedStateV2 はバケットを一時停止または再開します。
1import {
2 genesis,
3 setClaimSchedulePausedStateV2,
4} from '@metaplex-foundation/genesis'
5import { keypairIdentity, publicKey } from '@metaplex-foundation/umi'
6import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
7
8const umi = createUmi('https://api.mainnet-beta.solana.com').use(genesis())
9
10// umi.use(keypairIdentity(yourKeypair))
11
12const genesisAccount = publicKey('YOUR_GENESIS_ACCOUNT')
13const vestingBucket = publicKey('CLAIM_SCHEDULE_BUCKET_PDA')
14
15await setClaimSchedulePausedStateV2(umi, {
16 genesisAccount,
17 bucket: vestingBucket,
18 signer: umi.identity,
19 paused: true,
20 padding: Array(6).fill(0),
21}).sendAndConfirm(umi)
22
23// Set paused to false and send again to resume vesting.
再開するには paused: false を設定します。この制御を使えるのは Genesis 権限者だけです。
プロジェクトベスティングのキャンセル
cancelClaimScheduleBucketV2 はベスティングを凍結しますが、すでにベストされたトークンは削除しません。
1import {
2 cancelClaimScheduleBucketV2,
3 genesis,
4} from '@metaplex-foundation/genesis'
5import { keypairIdentity, publicKey } from '@metaplex-foundation/umi'
6import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
7
8const umi = createUmi('https://api.mainnet-beta.solana.com').use(genesis())
9
10// umi.use(keypairIdentity(yourKeypair))
11
12const genesisAccount = publicKey('YOUR_GENESIS_ACCOUNT')
13const vestingBucket = publicKey('CLAIM_SCHEDULE_BUCKET_PDA')
14
15await cancelClaimScheduleBucketV2(umi, {
16 genesisAccount,
17 bucket: vestingBucket,
18 signer: umi.identity,
19 padding: Array(7).fill(0),
20}).sendAndConfirm(umi)
21
22// Vesting is frozen, but the recipient can still claim the vested remainder.
受取人はベスト済み残りを引き続きクレームできます。未ベストトークンは、ReallocateBaseTokensOnCancel 終了動作が設定されて起動されない限り Genesis の会計に残ります。
プロジェクトベスティング受取人の変更
transferRecipientClaimScheduleBucketV2 は今後のすべてのクレームを受け取るウォレットを変更します。
1import {
2 genesis,
3 transferRecipientClaimScheduleBucketV2,
4} from '@metaplex-foundation/genesis'
5import { keypairIdentity, publicKey } from '@metaplex-foundation/umi'
6import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
7
8const umi = createUmi('https://api.mainnet-beta.solana.com').use(genesis())
9
10// umi.use(keypairIdentity(yourKeypair))
11
12const genesisAccount = publicKey('YOUR_GENESIS_ACCOUNT')
13const vestingBucket = publicKey('CLAIM_SCHEDULE_BUCKET_PDA')
14
15await transferRecipientClaimScheduleBucketV2(umi, {
16 genesisAccount,
17 bucket: vestingBucket,
18 signer: umi.identity,
19 newRecipient: publicKey('NEW_RECIPIENT'),
20 padding: Array(7).fill(0),
21}).sendAndConfirm(umi)
22
23// Future claims are sent to the new stored recipient.
認可される署名者は、transferable と transferableByRecipient のどちらが有効かによって決まります。
キャンセル後の未ベストトークンの再割り当て
ReallocateBaseTokensOnCancel はキャンセルされたバケットの未ベスト残りの 100% を UnlockedBucketV2 へ移します。
finalizeV2 を呼ぶ前に動作を設定してください。addClaimScheduleBucketV2.endBehaviors または setClaimScheduleBucketV2Behaviors で設定します。Genesis プログラムはファイナライズ後の動作設定を拒否します。
1import {
2 genesis,
3 setClaimScheduleBucketV2Behaviors,
4 triggerBehaviorsV2,
5} from '@metaplex-foundation/genesis'
6import { findAssociatedTokenPda, mplToolbox } from '@metaplex-foundation/mpl-toolbox'
7import { keypairIdentity, publicKey } from '@metaplex-foundation/umi'
8import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
9
10const umi = createUmi('https://api.mainnet-beta.solana.com')
11 .use(mplToolbox())
12 .use(genesis())
13
14// umi.use(keypairIdentity(yourKeypair))
15
16const genesisAccount = publicKey('YOUR_GENESIS_ACCOUNT')
17const baseMint = publicKey('YOUR_PROJECT_TOKEN_MINT')
18const quoteMint = publicKey('So11111111111111111111111111111111111111112')
19const vestingBucket = publicKey('CLAIM_SCHEDULE_BUCKET_PDA')
20const destinationBucket = publicKey('UNLOCKED_BUCKET_PDA')
21const [destinationQuoteTokenAccount] = findAssociatedTokenPda(umi, {
22 owner: destinationBucket,
23 mint: quoteMint,
24})
25
26// Configure before finalizeV2.
27await setClaimScheduleBucketV2Behaviors(umi, {
28 genesisAccount,
29 bucket: vestingBucket,
30 authority: umi.identity,
31 padding: Array(3).fill(0),
32 endBehaviors: [
33 {
34 __kind: 'ReallocateBaseTokensOnCancel',
35 processed: false,
36 padding: Array(6).fill(0),
37 destinationBucket,
38 },
39 ],
40}).sendAndConfirm(umi)
41
42// Run after finalization and after cancelClaimScheduleBucketV2 ends the bucket.
43await triggerBehaviorsV2(umi, {
44 genesisAccount,
45 primaryBucket: vestingBucket,
46 baseMint,
47 quoteMint,
48})
49 .addRemainingAccounts([
50 { pubkey: destinationBucket, isSigner: false, isWritable: true },
51 {
52 pubkey: destinationQuoteTokenAccount,
53 isSigner: false,
54 isWritable: true,
55 },
56 ])
57 .sendAndConfirm(umi)
58
59// The unvested remainder is moved to the destination UnlockedBucketV2 balance.
動作は元の割り当て値ではなくバケット残高を変えます。クレームスケジュールバケットが終了したあとだけ実行でき、各クレームスケジュールバケットのキャンセル再割り当て動作は最大 1 つです。
TimeRelative の開始またはクリフ条件を使うスケジュールは、キャンセル再割り当てがベスト量を計算する前にそれらの条件がトリガーされている必要があります。先に必要な参照アカウント付きで triggerConditionsV2 を実行してください。
ローンチ前のプロジェクトベスティング更新
updateClaimScheduleBucketV2 は、ファイナライズ前かつベスティング開始前に限り、割り当て、スケジュール、またはクレーム開始条件を置き換えできます。
バケットは、トークンが 1 度でもクレームされたあと、claimStartCondition が満たされたあと、または線形開始やクリフ条件が満たされたあとに ClaimScheduleUpdateForbidden で更新を拒否します。それら 3 つのスロットのいずれかの TimeRelative 条件も、更新中に参照バケットを検証できないため直ちに更新を無効にします。ランタイムの一時停止、キャンセル、移転制御は更新命令ではなく専用命令を使います。
プロジェクトベスティング状態の取得
fetchClaimScheduleBucketV2 は割り当て、クレーム進捗、実効一時停止状態、ポリシー、終了動作を返します。
1import {
2 fetchClaimScheduleBucketV2,
3 findClaimScheduleBucketV2Pda,
4 genesis,
5} from '@metaplex-foundation/genesis'
6import { publicKey } from '@metaplex-foundation/umi'
7import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
8
9const umi = createUmi('https://api.mainnet-beta.solana.com').use(genesis())
10
11const genesisAccount = publicKey('YOUR_GENESIS_ACCOUNT')
12const [vestingBucket] = findClaimScheduleBucketV2Pda(umi, {
13 genesisAccount,
14 bucketIndex: 0,
15})
16
17const account = await fetchClaimScheduleBucketV2(umi, vestingBucket)
18
19console.log('Recipient:', account.recipient)
20console.log('Allocation:', account.bucket.baseTokenAllocation)
21console.log('Remaining balance:', account.bucket.baseTokenBalance)
22console.log('Claimed:', account.amountClaimed)
23console.log('Paused:', account.paused)
24console.log('Total seconds paused:', account.totalSecondsPaused)
会計の不変条件は、終了動作が未ベスト残高を再割り当てするまで baseTokenBalance = baseTokenAllocation - amountClaimed です。
ClaimScheduleBucketV2 アカウントフィールド
ClaimScheduleBucketV2 アカウントは固定ベスティング状態のあとに可変長の終了動作リストを保存します。
| フィールド | 説明 |
|---|---|
bucket | 割り当て、残高、mint、index、手数料データを含む共有バケットヘッダー |
recipient | ベスト済みトークンクレームをすべて受け取るウォレット |
amountClaimed | 受取人へ転送された累積トークン |
claimSchedule | クリフと期間ベースの線形ベスティングカーブ |
claimStartCondition | クレーム開始前に開く必要がある独立ゲート |
claimEndCondition | キャンセルまたは自然完了で発火するプログラム所有の終了条件 |
paused | ベスティング時間が現在止まっているか |
pausedAt | 現在の一時停止が始まったタイムスタンプ |
totalSecondsPaused | ベスティングから除外された累積一時停止時間 |
extensions | ランタイムポリシーと任意のバックエンド署名者 |
endBehaviors | バケット終了後に利用できる動作 |
よくあるプロジェクトベスティングエラー
クレームスケジュールエラーは無効なスケジュール設定、無許可の制御、または誤ったライフサイクル段階での操作を識別します。
| エラー | 原因 | 対処 |
|---|---|---|
InvalidClaimSchedulePeriod | period が 0 | 正の period を使う |
InvalidClaimScheduleDuration | duration が 0 または 10 年超 | 1 秒から 315,360,000 秒の duration を使う |
ClaimScheduleDurationTooShort | period が duration を超える | period を減らすか duration を増やす |
InvalidClaimScheduleCliffAmount | cliffAmountBps が 10_000 を超える | 0 から 10,000 basis points を使う |
NothingToClaim | 新しいクリフまたは完全な線形周期がベストされていない | 次のアンロックを待つかバケット状態を確認する |
ClaimScheduleUpdateForbidden | クレームゲートまたはスケジュールが始まっている、トークンがクレーム済み、または関連条件が TimeRelative | 発火前に絶対時刻フィールドを設定する。相対スケジュールは更新できない |
ClaimScheduleUnauthorized | 署名者がその制御を使えない | 有効ポリシーが要求する Genesis 権限者または受取人を使う |
ClaimSchedulePolicyDisabled | 要求された一時停止、キャンセル、または移転ポリシーがオフ | バケット作成時にポリシーを有効にする |
InvalidBackendSigner | 設定されたバックエンド署名者がクレームを承認しなかった | 設定されたバックエンド署名者を含める |
ClaimScheduleConditionNotTriggered | キャンセル再割り当てが未解決の相対条件に依存する | 先に相対スケジュール条件をトリガーする |
クイックリファレンス
プロジェクトベスティングは Genesis V2 と @metaplex-foundation/genesis で利用できます。
| 項目 | 値 |
|---|---|
| Program | GNS1S5J5AspKXgpjz6SvKL66kPaKWAhaGRhCqPRxii2B |
| Tested SDK | @metaplex-foundation/[email protected] |
| Tested Umi compatibility | @metaplex-foundation/umi@^1.4.1 |
| Bucket PDA seeds | "claim_schedule_v2"、Genesis アカウント、bucketIndex を u8 として |
| Maximum vesting duration | 315,360,000 秒(10 年) |
| Cliff range | 0 から 10,000 basis points |
| Recipients per bucket | 1 |
| Bucket creation fee | 0 |
| Devnet validation | 追加、ファイナライズ、一時停止、移転、クレーム、キャンセル、再割り当ての全フローが 2026-08-24 に合格(テストアカウント) |
| Source | metaplex-foundation/genesis |
注意事項
プロジェクトベスティングには、トークン配布設計に含めるべきライフサイクルと認可の制約があります。
finalizeV2を呼ぶ前にClaimScheduleBucketV2アカウントを追加して設定してください。- 受取人または独立管理の割り当てごとに 1 つのバケットを作成してください。
- 任意のバックエンド署名者拡張が設定されていない限り、クレームは Permissionless です。
- バックエンド署名者はクレーム認可を追加しますが、現在保存されている受取人からクレームをリダイレクトできません。
- キャンセルはベスト済みトークンを保持します。未ベストトークンの回収には
ReallocateBaseTokensOnCancelが必要です。 Neverスケジュールはトークンを永続的にロックし、主に ロックされた LP トークン に使われます。
FAQ
ClaimScheduleBucketV2 と ClaimSchedule の違いは何ですか?
ClaimScheduleBucketV2 は 1 人の受取人の割り当てとランタイム状態を保持する Genesis のアウトフローバケットです。ClaimSchedule はそのバケット内に保存される再利用可能なクリフと線形アンロックカーブです。
ベスティング受取人は毎回クレームを送信する必要がありますか?
いいえ。claimClaimScheduleV2 は Permissionless ですが、プログラムは常にバケットに保存された受取人へトークンを転送します。バックエンド署名者拡張が設定されている場合、その署名者も各クレームを承認する必要があります。
ベスティング開始後にプロジェクトはスケジュールを変更できますか?
いいえ。updateClaimScheduleBucketV2 はファイナライズ前、クレームゲートまたはいずれかのスケジュール条件が満たされる前、かつクレームが 1 回も行われていないときだけ動作します。TimeRelative のクレームゲート、線形開始、またはクリフも更新を直ちに無効にします。
ベスティングバケットがキャンセルされたとき、未ベストトークンはどうなりますか?
キャンセルはベスティングを凍結し、ベスト済み量は受取人のために保持します。バケットに ReallocateBaseTokensOnCancel 動作がある場合、誰でもその動作を起動して未ベスト残りを UnlockedBucketV2 へ移せます。
1 つの ClaimScheduleBucketV2 で複数の受取人へベストできますか?
いいえ。各バケットの受取人は 1 人です。独立した会計またはポリシー制御が必要な受取人または割り当てごとに ClaimScheduleBucketV2 を作成してください。
用語集
プロジェクトベスティングの用語は、バケットアカウント、埋め込みスケジュール、ライフサイクル制御を区別します。
| 用語 | 定義 |
|---|---|
| ClaimScheduleBucketV2 | 1 つのベーストークン割り当てを 1 人の受取人へベストする Genesis アウトフローバケット |
| ClaimSchedule | 再利用可能なクリフと期間ベースの線形トークンアンロックカーブ |
| Claim gate | 出金開始を制御するバケットレベルの claimStartCondition |
| Cliff | 独立条件が発火したときにアンロックされる総割り当ての割合 |
| Period | 線形ベスティングを離散ステップで進める間隔 |
| Effective time | バケットの一時停止時間を除いたウォールクロック時間 |
| Cancellation reallocation | キャンセルされたバケットの未ベスト残りをロック解除バケットへ移す終了動作 |
