ローンチタイプ

プロジェクトベスティング

Last updated August 24, 2026

Genesis のプロジェクトベスティングは、ClaimScheduleBucketV2 を使い、オンチェーンのクリフと定期線形スケジュールに従って 1 つのトークン割り当てを 1 人の受取人へ解放します。

構築するもの

このガイドは、10% クリフ、月次線形アンロック、任意の権限者制御を持つ 1 年のプロジェクトトークンベスティング割り当てを作成します。

概要

ClaimScheduleBucketV2 は、プロジェクト、チーム、アドバイザー、またはトレジャリーのトークンベスティング向けの第一級 Genesis アウトフローバケットです。受取人、割り当て、クレーム履歴、ベスティングカーブ、一時停止状態、ポリシー制御、任意のキャンセル動作をオンチェーンに保存します。

  • 1 つのバケットは 1 つのトークン割り当てを 1 人の現在の受取人へベストします
  • ClaimSchedule は独立したクリフと期間ベースの線形アンロックを組み合わせます
  • クレームは Permissionless ですが、常にバケットの受取人へ支払います
  • 任意ポリシーで権限者の一時停止、キャンセル、受取人によるキャンセル、受取人変更をサポートします

ジャンプ先: クイックスタート · ベスティングの仕組み · ランタイム制御 · キャンセル · リファレンス

ClaimScheduleBucketV2 と ClaimSchedule

ClaimScheduleBucketV2 はプロジェクト割り当てを所有するアカウントであり、ClaimSchedule はそのアカウントに埋め込まれた再利用可能なベスティングカーブです。

目的
ClaimScheduleBucketV21 人の受取人、割り当て、クレーム済み量、スケジュール、クレームゲート、一時停止状態、ポリシー、終了動作を保存します
ClaimScheduleクリフ量、クリフ条件、線形開始条件、期間、アンロック周期を定義します
ClaimScheduleV2Extensionsランタイムポリシーフラグと任意のバックエンドクレーム署名者を保存します

Genesis に ClaimScheduleBucketV1 はありません。プロジェクトベスティングには V2 のアカウントと命令名を使ってください。ClaimSchedule は他のバケット拡張でも使われるため、スケジュール型だけではプロジェクトベスティングバケットを識別できません。

クイックスタート

クイックスタートは、初期化済みだがまだファイナライズしていない Genesis V2 アカウントに、10% クリフと月次線形アンロックの 1 年ベスティングバケットを追加します。

先に Genesis セットアップ を完了し、ベーストークン供給からベスティング割り当てを確保してください。すべてのバケット割り当ての合計は Genesis アカウントの総供給量に収まる必要があります。

プロジェクトベスティングバケットの作成

addClaimScheduleBucketV2 は Genesis アカウントのファイナライズ前にバケットを作成します。

addClaimScheduleBucketV2.ts
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 は、現在ベスト済みで未クレームのトークンすべてをバケットに保存された受取人へ転送します。

claimClaimScheduleV2.ts
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 を返すことがあります。次の周期を待つか、送信前に取得したバケット状態を確認してください。

クレームスケジュールのベスティングの仕組み

クレームスケジュールは、クリフ割り当てを残りの線形割り当てから独立してアンロックします。

フィールド制約効果
startConditionTimeAbsoluteTimeRelative、または Never線形ベスティングのタイムラインを固定します
duration0 より大きく、10 年以下線形割り当てが完全にベストされる時点を定義します
period0 より大きく duration 以下線形ベスティングを離散ステップで進めます
cliffConditionTimeAbsoluteTimeRelative、または Never線形スケジュールから独立してクリフをアンロックします
cliffAmountBps0 から 10_000割り当ての 0% から 100% をクリフに割り当てます

割り当て A とクリフ basis points C に対し、クリフ量は A × C / 10,000 です。残り A - cliffAmountduration にわたる完全な period ステップで線形にベストされます。

クリフは線形スケジュールを自動的に遅らせません。startConditioncliffCondition を意図したタイムスタンプに明示的に設定してください。どちらの条件も他方の前、最中、後に発火し得ます。

クリフは startCondition + duration より後にしないでください。線形完了後の成功クレームはバケットの終了条件を発火します。それより遅いクリフは凍結された実効時刻を超え、クレーム可能にならなくなります。

クレームゲートとベスティングカーブ

claimStartCondition はトークン出金をゲートし、claimSchedule.startCondition は線形割り当てがいつ蓄積されるかを制御します。

この分離により、クレームが開く前に蓄積するスケジュールが可能です。たとえば雇用日にベスティングを開始し、claimStartCondition でトークン生成イベントまで出金を防げます。

TimeAbsolute 条件はクレームがそれらを確認したときに自身を更新します。TimeRelative 条件は受動的であり、参照される各バケットを writable remaining account として渡す triggerConditionsV2 が必要です。

triggerConditionsV2.ts
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 全体が終わったときにクレーム可能になります。

一時停止で調整されるベスティング時間

バケットを一時停止するとベスティング時間が止まり、再開すると実効タイムラインが一時停止合計時間だけずれます。

バケットは pausedAttotalSecondsPaused を記録します。一時停止中のキャンセルはスケジュールを pausedAt で凍結するため、一時停止中の時間はベスト量を増やしません。

プロジェクトベスティングのランタイム制御

ランタイム制御はデフォルトで無効であり、バケット作成時にポリシーフラグで有効にする必要があります。

ポリシーフラグ認可された役割命令結果
pausableGenesis 権限者setClaimSchedulePausedStateV2ベスティング蓄積を一時停止または再開します
cancelableGenesis 権限者cancelClaimScheduleBucketV2キャンセル時刻でベスティングを凍結します
cancelableByRecipient受取人cancelClaimScheduleBucketV2受取人がベスティングを凍結できます
transferableGenesis 権限者transferRecipientClaimScheduleBucketV2ベスティング受取人を変更します
transferableByRecipient受取人transferRecipientClaimScheduleBucketV2現在の受取人が割り当てを移転できます

プロジェクトのベスティング契約で必要な制御だけを有効にしてください。権限者のキャンセルまたは受取人変更権は、受取人に提供する保証を実質的に変えます。

プロジェクトベスティングの一時停止と再開

pausable が作成時に有効なとき、setClaimSchedulePausedStateV2 はバケットを一時停止または再開します。

pauseClaimScheduleBucketV2.ts
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 はベスティングを凍結しますが、すでにベストされたトークンは削除しません。

cancelClaimScheduleBucketV2.ts
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 は今後のすべてのクレームを受け取るウォレットを変更します。

transferClaimScheduleRecipientV2.ts
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.

認可される署名者は、transferabletransferableByRecipient のどちらが有効かによって決まります。

キャンセル後の未ベストトークンの再割り当て

ReallocateBaseTokensOnCancel はキャンセルされたバケットの未ベスト残りの 100% を UnlockedBucketV2 へ移します。

finalizeV2 を呼ぶ前に動作を設定してください。addClaimScheduleBucketV2.endBehaviors または setClaimScheduleBucketV2Behaviors で設定します。Genesis プログラムはファイナライズ後の動作設定を拒否します。

reallocateClaimScheduleOnCancelV2.ts
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 は割り当て、クレーム進捗、実効一時停止状態、ポリシー、終了動作を返します。

fetchClaimScheduleBucketV2.ts
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バケット終了後に利用できる動作

よくあるプロジェクトベスティングエラー

クレームスケジュールエラーは無効なスケジュール設定、無許可の制御、または誤ったライフサイクル段階での操作を識別します。

エラー原因対処
InvalidClaimSchedulePeriodperiod が 0正の period を使う
InvalidClaimScheduleDurationduration が 0 または 10 年超1 秒から 315,360,000 秒の duration を使う
ClaimScheduleDurationTooShortperiodduration を超えるperiod を減らすか duration を増やす
InvalidClaimScheduleCliffAmountcliffAmountBps10_000 を超える0 から 10,000 basis points を使う
NothingToClaim新しいクリフまたは完全な線形周期がベストされていない次のアンロックを待つかバケット状態を確認する
ClaimScheduleUpdateForbiddenクレームゲートまたはスケジュールが始まっている、トークンがクレーム済み、または関連条件が TimeRelative発火前に絶対時刻フィールドを設定する。相対スケジュールは更新できない
ClaimScheduleUnauthorized署名者がその制御を使えない有効ポリシーが要求する Genesis 権限者または受取人を使う
ClaimSchedulePolicyDisabled要求された一時停止、キャンセル、または移転ポリシーがオフバケット作成時にポリシーを有効にする
InvalidBackendSigner設定されたバックエンド署名者がクレームを承認しなかった設定されたバックエンド署名者を含める
ClaimScheduleConditionNotTriggeredキャンセル再割り当てが未解決の相対条件に依存する先に相対スケジュール条件をトリガーする

クイックリファレンス

プロジェクトベスティングは Genesis V2 と @metaplex-foundation/genesis で利用できます。

項目
ProgramGNS1S5J5AspKXgpjz6SvKL66kPaKWAhaGRhCqPRxii2B
Tested SDK@metaplex-foundation/[email protected]
Tested Umi compatibility@metaplex-foundation/umi@^1.4.1
Bucket PDA seeds"claim_schedule_v2"、Genesis アカウント、bucketIndexu8 として
Maximum vesting duration315,360,000 秒(10 年)
Cliff range0 から 10,000 basis points
Recipients per bucket1
Bucket creation fee0
Devnet validation追加、ファイナライズ、一時停止、移転、クレーム、キャンセル、再割り当ての全フローが 2026-08-24 に合格(テストアカウント
Sourcemetaplex-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 を作成してください。

用語集

プロジェクトベスティングの用語は、バケットアカウント、埋め込みスケジュール、ライフサイクル制御を区別します。

用語定義
ClaimScheduleBucketV21 つのベーストークン割り当てを 1 人の受取人へベストする Genesis アウトフローバケット
ClaimSchedule再利用可能なクリフと期間ベースの線形トークンアンロックカーブ
Claim gate出金開始を制御するバケットレベルの claimStartCondition
Cliff独立条件が発火したときにアンロックされる総割り当ての割合
Period線形ベスティングを離散ステップで進める間隔
Effective timeバケットの一時停止時間を除いたウォールクロック時間
Cancellation reallocationキャンセルされたバケットの未ベスト残りをロック解除バケットへ移す終了動作