SDK
JavaScript SDK
Last updated February 25, 2026
Bubblegum V2 JavaScript SDK(@metaplex-foundation/mpl-bubblegum)は、Solanaで圧縮NFTを作成・管理するための推奨TypeScript/JavaScriptライブラリです。Umiフレームワークをベースに構築されており、すべてのBubblegum V2操作に対してタイプセーフな関数を提供し、DAS APIプラグインが自動的に含まれています。
学習内容
このSDKリファレンスでは以下を解説します:
- Bubblegum V2プラグインを使用したUmiのセットアップ
- cNFTを保存するためのマークルツリーの作成
- cNFTのミント、転送、バーン、更新
- 委任、フリーズ、クリエイターの検証
- DAS APIを使用したcNFTのフェッチ
- トランザクションサイズ制限と一般的なエラーへの対処
概要
Bubblegum V2 JavaScript SDKは、すべてのMPL-Bubblegum V2プログラム命令をタイプセーフなAPIでラップし、cNFTデータを読み取るためのDAS APIプラグインを含んでいます。
- インストール:
npm install @metaplex-foundation/mpl-bubblegum @metaplex-foundation/umi-bundle-defaults .use(mplBubblegum())を使用してUmiに登録 — DAS APIプラグインは自動的に含まれます- 書き込み操作(転送、バーン、更新、委任、フリーズ、検証)の前に
getAssetWithProofを使用する - Bubblegum V2(MPL-Bubblegum 5.x)対象 — V1ツリーとは互換性なし
Metaplex Foundationが管理 · February 2026最終確認 · MPL-Bubblegum 5.xに適用 · GitHubでソースを見る
クイックスタート
ジャンプ先: セットアップ · ツリー作成 · ミント · 転送 · バーン · 更新 · 委任 · コレクション · フリーズ · クリエイター検証 · フェッチ · エラー · クイックリファレンス
- 依存関係のインストール:
npm install @metaplex-foundation/mpl-bubblegum @metaplex-foundation/umi-bundle-defaults .use(mplBubblegum())を使用してUmiインスタンスを作成するcreateTreeでBubblegumツリーを作成するmintV2でcNFTをミントし、その後の書き込み操作の前にはgetAssetWithProofを使用する
インストール
npm install @metaplex-foundation/mpl-bubblegum @metaplex-foundation/umi-bundle-defaults
TypeDoc APIリファレンス
SDKの完全な生成APIドキュメント。
npmパッケージ
バージョン履歴付きのnpmjs.comのパッケージ。
Umiのセットアップ
mplBubblegumプラグインは、すべてのBubblegum V2命令とDAS APIプラグインをUmiインスタンスに登録します。
import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
import { mplBubblegum } from '@metaplex-foundation/mpl-bubblegum'
import { keypairIdentity } from '@metaplex-foundation/umi'
const umi = createUmi('https://api.devnet.solana.com')
.use(mplBubblegum())
.use(keypairIdentity(yourKeypair))
Bubblegumツリーの作成
createTreeは新しいマークルツリーをオンチェーンに割り当て、Bubblegum V2ツリーとして登録します。ツリーのパラメーターは永続的なので、作成前に慎重に選択してください。
import { createTree } from '@metaplex-foundation/mpl-bubblegum'
import { generateSigner } from '@metaplex-foundation/umi'
const merkleTree = generateSigner(umi)
await createTree(umi, {
merkleTree,
maxDepth: 14, // tree holds 2^14 = 16,384 cNFTs
maxBufferSize: 64, // concurrent writes per block
canopyDepth: 10, // cached upper nodes (reduces proof size in txs)
public: false, // false = only tree creator/delegate can mint
}).sendAndConfirm(umi)
console.log('Tree address:', merkleTree.publicKey)
public: falseはツリークリエイター(または承認されたツリーデリゲート)のみがツリーからミントできることを意味します。誰でもミントできるようにするにはpublic: trueを設定してください。ツリーサイズのコスト見積もりについてはツリーの作成を参照してください。
圧縮NFTのミント
コレクションなしでミント
mintV2は指定したツリーに新しいcNFTリーフを作成します。
import { mintV2 } from '@metaplex-foundation/mpl-bubblegum'
import { none } from '@metaplex-foundation/umi'
await mintV2(umi, {
leafOwner: umi.identity.publicKey,
merkleTree: merkleTree.publicKey,
metadata: {
name: 'My Compressed NFT',
uri: 'https://example.com/my-nft.json',
sellerFeeBasisPoints: 500, // 5% royalty
collection: none(),
creators: [{ address: umi.identity.publicKey, verified: false, share: 100 }],
},
}).sendAndConfirm(umi)
コレクションへのミント
coreCollectionを渡して、cNFTをMPL-Coreコレクションに関連付けます。コレクションにはBubblegumV2プラグインが有効になっている必要があります。
import { mintV2 } from '@metaplex-foundation/mpl-bubblegum'
import { publicKey } from '@metaplex-foundation/umi'
await mintV2(umi, {
leafOwner: umi.identity.publicKey,
merkleTree: merkleTree.publicKey,
metadata: {
name: 'My Collection cNFT',
uri: 'https://example.com/my-nft.json',
sellerFeeBasisPoints: 500,
collection: publicKey('YourCollectionAddressHere'),
creators: [{ address: umi.identity.publicKey, verified: false, share: 100 }],
},
coreCollection: publicKey('YourCollectionAddressHere'),
}).sendAndConfirm(umi)
ミント後のアセットIDの取得
ミントが確認された後、parseLeafFromMintV2Transactionを使用してリーフスキーマ(アセットIDを含む)を取得します。
import { mintV2, parseLeafFromMintV2Transaction } from '@metaplex-foundation/mpl-bubblegum'
import { none } from '@metaplex-foundation/umi'
const { signature } = await mintV2(umi, {
leafOwner: umi.identity.publicKey,
merkleTree: merkleTree.publicKey,
metadata: {
name: 'My Compressed NFT',
uri: 'https://example.com/my-nft.json',
sellerFeeBasisPoints: 500,
collection: none(),
creators: [],
},
}).sendAndConfirm(umi)
const leaf = await parseLeafFromMintV2Transaction(umi, signature)
console.log('Asset ID:', leaf.id)
console.log('Leaf index:', leaf.nonce)
圧縮NFTの転送
transferV2はcNFTの所有権を新しいウォレットに移動します。getAssetWithProofはDAS APIから必要なすべてのプルーフパラメーターを取得します。
import { getAssetWithProof, transferV2 } from '@metaplex-foundation/mpl-bubblegum'
import { publicKey } from '@metaplex-foundation/umi'
const assetWithProof = await getAssetWithProof(umi, assetId, { truncateCanopy: true })
await transferV2(umi, {
...assetWithProof,
leafOwner: umi.identity, // current owner as signer
newLeafOwner: publicKey('NewOwnerAddressHere'),
}).sendAndConfirm(umi)
圧縮NFTのバーン
burnV2はcNFTを永久に破壊し、ツリーからリーフを削除します。
import { getAssetWithProof, burnV2 } from '@metaplex-foundation/mpl-bubblegum'
const assetWithProof = await getAssetWithProof(umi, assetId, { truncateCanopy: true })
await burnV2(umi, {
...assetWithProof,
leafOwner: umi.identity, // owner must sign
}).sendAndConfirm(umi)
圧縮NFTの更新
updateMetadataV2はcNFTのメタデータを変更します。更新権限はcNFTがコレクションに属しているかどうかによって異なります。権限のルールについてはcNFTの更新を参照してください。
import {
getAssetWithProof,
updateMetadataV2,
UpdateArgsArgs,
} from '@metaplex-foundation/mpl-bubblegum'
import { some, publicKey } from '@metaplex-foundation/umi'
const assetWithProof = await getAssetWithProof(umi, assetId, { truncateCanopy: true })
const updateArgs: UpdateArgsArgs = {
name: some('Updated Name'),
uri: some('https://example.com/updated.json'),
}
await updateMetadataV2(umi, {
...assetWithProof,
leafOwner: assetWithProof.leafOwner,
currentMetadata: assetWithProof.metadata,
updateArgs,
// If cNFT belongs to a collection, pass the collection address:
coreCollection: publicKey('YourCollectionAddressHere'),
}).sendAndConfirm(umi)
圧縮NFTの委任
リーフデリゲートは、オーナーに代わってcNFTを転送、バーン、フリーズできます。デリゲートは転送後に新しいオーナーにリセットされます。
デリゲートの承認
import { getAssetWithProof, delegate } from '@metaplex-foundation/mpl-bubblegum'
import { publicKey } from '@metaplex-foundation/umi'
const assetWithProof = await getAssetWithProof(umi, assetId, { truncateCanopy: true })
await delegate(umi, {
...assetWithProof,
leafOwner: umi.identity,
previousLeafDelegate: umi.identity.publicKey, // current delegate (use owner if none)
newLeafDelegate: publicKey('DelegateAddressHere'),
}).sendAndConfirm(umi)
デリゲートの取り消し
新しいデリゲートをオーナー自身のアドレスに設定します。
import { getAssetWithProof, delegate } from '@metaplex-foundation/mpl-bubblegum'
const assetWithProof = await getAssetWithProof(umi, assetId, { truncateCanopy: true })
await delegate(umi, {
...assetWithProof,
leafOwner: umi.identity,
previousLeafDelegate: currentDelegatePublicKey,
newLeafDelegate: umi.identity.publicKey, // revoke by delegating to self
}).sendAndConfirm(umi)
コレクション
setCollectionV2はcNFTのMPL-Coreコレクションを設定、変更、または削除します。詳細についてはコレクションの管理を参照してください。
コレクションの設定または変更
import {
getAssetWithProof,
setCollectionV2,
MetadataArgsV2Args,
} from '@metaplex-foundation/mpl-bubblegum'
import { unwrapOption, publicKey } from '@metaplex-foundation/umi'
const assetWithProof = await getAssetWithProof(umi, assetId, { truncateCanopy: true })
const collection = unwrapOption(assetWithProof.metadata.collection)
const metadata: MetadataArgsV2Args = {
...assetWithProof.metadata,
collection: collection?.key ?? null,
}
await setCollectionV2(umi, {
...assetWithProof,
metadata,
newCollectionAuthority: newCollectionUpdateAuthority,
newCoreCollection: publicKey('NewCollectionAddressHere'),
}).sendAndConfirm(umi)
コレクションの削除
import { getAssetWithProof, setCollectionV2 } from '@metaplex-foundation/mpl-bubblegum'
import { unwrapOption } from '@metaplex-foundation/umi'
const assetWithProof = await getAssetWithProof(umi, assetId, { truncateCanopy: true })
const collection = unwrapOption(assetWithProof.metadata.collection)
await setCollectionV2(umi, {
...assetWithProof,
authority: collectionAuthoritySigner,
coreCollection: collection!.key,
}).sendAndConfirm(umi)
フリーズと解除
2つのフリーズメカニズムが利用可能です。アセットレベルとコレクションレベルのフリーズの詳細についてはcNFTのフリーズを参照してください。
cNFTのフリーズ(リーフデリゲート)
import {
getAssetWithProof,
delegateAndFreezeV2,
} from '@metaplex-foundation/mpl-bubblegum'
import { publicKey } from '@metaplex-foundation/umi'
const assetWithProof = await getAssetWithProof(umi, assetId, { truncateCanopy: true })
// Delegates and freezes in one instruction
await delegateAndFreezeV2(umi, {
...assetWithProof,
leafOwner: umi.identity,
newLeafDelegate: publicKey('FreezeAuthorityAddressHere'),
}).sendAndConfirm(umi)
cNFTの解除
import { getAssetWithProof, thawV2 } from '@metaplex-foundation/mpl-bubblegum'
const assetWithProof = await getAssetWithProof(umi, assetId, { truncateCanopy: true })
await thawV2(umi, {
...assetWithProof,
leafDelegate: umi.identity, // freeze authority must sign
}).sendAndConfirm(umi)
ソウルバウンドcNFTの作成
ソウルバウンドcNFTは永続的に転送不可能です。コレクションにはPermanentFreezeDelegateプラグインが有効になっている必要があります。セットアップの詳細についてはcNFTのフリーズを参照してください。
import { getAssetWithProof, setNonTransferableV2 } from '@metaplex-foundation/mpl-bubblegum'
const assetWithProof = await getAssetWithProof(umi, assetId, { truncateCanopy: true })
await setNonTransferableV2(umi, {
...assetWithProof,
// permanent freeze delegate must sign
}).sendAndConfirm(umi)
setNonTransferableV2は不可逆です。この呼び出し後、cNFTを再び転送可能にすることはできません。
クリエイターの検証
verifyCreatorV2はクリエイターエントリにverifiedフラグを設定します。検証されるクリエイターはトランザクションに署名する必要があります。詳細についてはクリエイターの検証を参照してください。
クリエイターの検証
import {
getAssetWithProof,
verifyCreatorV2,
MetadataArgsV2Args,
} from '@metaplex-foundation/mpl-bubblegum'
import { unwrapOption, none } from '@metaplex-foundation/umi'
const assetWithProof = await getAssetWithProof(umi, assetId, { truncateCanopy: true })
const collectionOption = unwrapOption(assetWithProof.metadata.collection)
const metadata: MetadataArgsV2Args = {
name: assetWithProof.metadata.name,
uri: assetWithProof.metadata.uri,
sellerFeeBasisPoints: assetWithProof.metadata.sellerFeeBasisPoints,
collection: collectionOption ? collectionOption.key : none(),
creators: assetWithProof.metadata.creators,
}
await verifyCreatorV2(umi, {
...assetWithProof,
metadata,
creator: umi.identity, // the creator being verified must sign
}).sendAndConfirm(umi)
クリエイターの検証解除
import {
getAssetWithProof,
unverifyCreatorV2,
MetadataArgsV2Args,
} from '@metaplex-foundation/mpl-bubblegum'
import { unwrapOption, none } from '@metaplex-foundation/umi'
const assetWithProof = await getAssetWithProof(umi, assetId, { truncateCanopy: true })
const metadata: MetadataArgsV2Args = {
name: assetWithProof.metadata.name,
uri: assetWithProof.metadata.uri,
sellerFeeBasisPoints: assetWithProof.metadata.sellerFeeBasisPoints,
collection: unwrapOption(assetWithProof.metadata.collection)?.key ?? none(),
creators: assetWithProof.metadata.creators,
}
await unverifyCreatorV2(umi, {
...assetWithProof,
metadata,
creator: umi.identity,
}).sendAndConfirm(umi)
cNFTのフェッチ
DAS APIプラグインはmplBubblegum()によって自動的に登録されます。利用可能なメソッドの詳細についてはcNFTのフェッチを参照してください。
単一cNFTのフェッチ
import { publicKey } from '@metaplex-foundation/umi'
const asset = await umi.rpc.getAsset(assetId)
console.log('Owner:', asset.ownership.owner)
console.log('Name:', asset.content.metadata.name)
オーナー別cNFTのフェッチ
import { publicKey } from '@metaplex-foundation/umi'
const result = await umi.rpc.getAssetsByOwner({
owner: publicKey('OwnerAddressHere'),
})
console.log('cNFTs owned:', result.items.length)
コレクション別cNFTのフェッチ
import { publicKey } from '@metaplex-foundation/umi'
const result = await umi.rpc.getAssetsByGroup({
groupKey: 'collection',
groupValue: publicKey('CollectionAddressHere'),
})
console.log('cNFTs in collection:', result.items.length)
ツリーとインデックスからリーフアセットIDを導出
import { findLeafAssetIdPda } from '@metaplex-foundation/mpl-bubblegum'
const [assetId] = await findLeafAssetIdPda(umi, {
merkleTree: merkleTree.publicKey,
leafIndex: 0,
})
トランザクションパターン
「Transaction Too Large」エラーへの対処
マークルプルーフはツリーの深さに比例して大きくなります。getAssetWithProofにtruncateCanopy: trueを渡すと、キャノピーにキャッシュされたプルーフノードを自動的に削除し、トランザクションサイズを削減します。
import { getAssetWithProof } from '@metaplex-foundation/mpl-bubblegum'
// truncateCanopy fetches tree config and removes redundant proof nodes
const assetWithProof = await getAssetWithProof(umi, assetId, { truncateCanopy: true })
非常に深いツリーで切り詰めたプルーフでもトランザクション制限を超える場合は、アドレスルックアップテーブル付きのバージョン管理されたトランザクションを使用してください。
送信と確認
const result = await mintV2(umi, { ... }).sendAndConfirm(umi)
console.log('Signature:', result.signature)
送信せずにビルド
const tx = await mintV2(umi, { ... }).buildAndSign(umi)
// send later: await umi.rpc.sendTransaction(tx)
一般的なエラー
Transaction too large
マークルプルーフが1232バイトのトランザクション制限を超えています。getAssetWithProofで{ truncateCanopy: true }を使用するか、アドレスルックアップテーブル付きのバージョン管理されたトランザクションを実装してください。
Invalid proof
プルーフが古くなっています — プルーフを取得した後にツリーが変更されました。書き込みトランザクションを送信する直前に必ずgetAssetWithProofを呼び出してください。
Leaf already exists / Invalid leaf
アセットIDまたはリーフインデックスが正しくありません。findLeafAssetIdPdaを使用してアセットIDを再導出するか、getAssetsByOwnerを使用して再フェッチしてください。
InvalidAuthority
この命令のオーナー、デリゲート、または必要な権限者ではありません。正しい署名者がleafOwnerまたはleafDelegateとして設定されていることを確認してください。
Tree is full
マークルツリーがmaxDepth容量(2^maxDepthリーフ)に達しました。ミントを続けるには新しいツリーを作成してください。
DASフェッチでのAccount not found
RPCプロバイダーがMetaplex DAS APIをサポートしていない可能性があります。互換性のあるRPCプロバイダーに切り替えてください。
注意事項
getAssetWithProofはほぼすべての書き込み命令の前に必要です。古いプルーフエラーを避けるために、送信する直前に呼び出してください。- DAS経由でフェッチされたプルーフは、フェッチと送信の間にツリーが変更されると古くなる場合があります。高並行性のシナリオでは、同じアトミックなフローでフェッチと送信を行う必要があります。
setNonTransferableV2(ソウルバウンド)は不可逆です。一度設定すると転送可能性を回復する方法はありません。- デリゲート権限は
transferV2の後に新しいオーナーにリセットされます。必要に応じて新しいオーナーが再委任する必要があります。 - このSDKはBubblegum V2(
LeafSchemaV2)を対象としています。Bubblegum V1ツリーや解凍ワークフローとは互換性がありません。 - cNFTで使用されるコレクションには
BubblegumV2プラグインが有効になっている必要があります。このプラグインのない標準的なMPL-Coreコレクションは使用できません。
クイックリファレンス
Bubblegum V2 関数
| 関数 | 目的 |
|---|---|
createTree | 新しいBubblegum V2マークルツリーを作成する |
mintV2 | 新しい圧縮NFTをミントする |
transferV2 | cNFTの所有権を転送する |
burnV2 | cNFTを永久に破壊する |
updateMetadataV2 | cNFTメタデータを更新する(名前、URI、クリエイター、ロイヤリティ) |
delegate | リーフデリゲートを承認または取り消す |
setTreeDelegate | ツリーデリゲートを承認または取り消す |
setCollectionV2 | MPL-Coreコレクションを設定、変更、または削除する |
freezeV2 | cNFTをフリーズする(既存のリーフデリゲートが必要) |
thawV2 | フリーズされたcNFTを解除する |
delegateAndFreezeV2 | 1つの命令で委任とフリーズを行う |
setNonTransferableV2 | cNFTを永続的にソウルバウンドにする(不可逆) |
verifyCreatorV2 | クリエイターエントリにverifiedフラグを設定する |
unverifyCreatorV2 | クリエイターエントリからverifiedフラグを削除する |
getAssetWithProof | 書き込み命令に必要なすべてのプルーフパラメーターをフェッチする |
findLeafAssetIdPda | ツリーアドレスとリーフインデックスからcNFTアセットIDを導出する |
parseLeafFromMintV2Transaction | ミントトランザクションからリーフスキーマ(アセットIDを含む)を抽出する |
最小依存関係
{
"dependencies": {
"@metaplex-foundation/mpl-bubblegum": "^5.0.0",
"@metaplex-foundation/umi": "^1.0.0",
"@metaplex-foundation/umi-bundle-defaults": "^1.0.0"
}
}
プログラムアドレス
| プログラム | アドレス |
|---|---|
| MPL-Bubblegum V2 | BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY |
| SPL Account Compression | cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK |
| SPL Noop | noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV |
ツリーサイズリファレンス
| 最大深度 | 容量 | 概算コスト |
|---|---|---|
| 14 | 16,384 | ~0.34 SOL |
| 17 | 131,072 | ~1.1 SOL |
| 20 | 1,048,576 | ~8.5 SOL |
| 24 | 16,777,216 | ~130 SOL |
| 30 | 1,073,741,824 | ~2,000 SOL |
よくある質問
Bubblegum V2 JavaScript SDKとは何ですか?
Bubblegum V2 JavaScript SDK(@metaplex-foundation/mpl-bubblegum)は、Solanaで圧縮NFTを作成・管理するためのTypeScriptライブラリです。Umiフレームワークをベースに構築されており、すべてのMPL-Bubblegum V2プログラム命令にタイプセーフなラッパーを提供し、DAS APIプラグインが自動的に含まれています。
このSDKを使用するために特別なRPCプロバイダーが必要ですか?
はい。圧縮NFTはcNFTデータをインデックス化・取得するためにMetaplex DAS APIをサポートするRPCプロバイダーが必要です。標準のSolana RPCはDASをサポートしていません。互換性のあるオプション(Helius、Triton、Shyftなど)についてはRPCプロバイダーページを参照してください。
ミント後にcNFTのアセットIDを取得するにはどうすればよいですか?
確認されたトランザクション署名とともにparseLeafFromMintV2Transactionを使用してください。ミントトランザクションをデコードして、leaf.id(アセットID)とleaf.nonce(リーフインデックス)を含む完全なリーフスキーマを返します。
「Transaction too large」エラーが発生するのはなぜですか?
マークルプルーフはツリーの深さに比例して大きくなります。getAssetWithProofに{ truncateCanopy: true }を渡すと、オンチェーンキャノピーにキャッシュされたプルーフノードを自動的に削除します。非常に深いツリーにはアドレスルックアップテーブル付きのバージョン管理されたトランザクションを使用してください。
このSDKをBubblegum V1ツリーで使用できますか?
いいえ。このSDKはLeafSchemaV2とV2マークルツリーを使用するBubblegum V2を対象としています。V1ツリーにはレガシーBubblegum SDKを使用してください。V2ツリーとV1ツリーはクロス互換性がありません。
getAssetWithProofとは何で、なぜ必要なのですか?
getAssetWithProofは、DAS APIでgetAssetとgetAssetProofの両方を呼び出し、Bubblegum V2書き込み命令が期待する正確なパラメーター形状にレスポンスを解析するヘルパーです。ほぼすべての変更命令(転送、バーン、更新、委任、フリーズ、検証)にこれらのパラメーターが必要です。古いプルーフエラーを避けるために、送信する直前に必ず呼び出してください。
用語集
| 用語 | 定義 |
|---|---|
| Umi | Solanaアプリケーション構築のためのMetaplexのフレームワーク。ウォレット接続、RPC、トランザクション構築を処理する |
| mplBubblegum | すべてのBubblegum V2命令とDAS APIプラグインを登録するUmiプラグイン |
| cNFT | 圧縮NFT — 専用アカウントではなく、オンチェーンマークルツリーのハッシュされたリーフとして保存される |
| マークルツリー | ハッシュされたNFTデータをリーフとして保存するオンチェーンアカウント。createTreeで作成される |
| リーフ | マークルツリーの単一のcNFTエントリ。リーフインデックスで識別される |
| プルーフ | リーフがツリーに属することを暗号学的に検証するための兄弟ハッシュのリスト |
| キャノピー | トランザクションで必要なプルーフサイズを削減するためにオンチェーンに保存されたマークルツリーの上位ノードのキャッシュ |
| LeafSchemaV2 | id、オーナー、デリゲート、ノンス、データハッシュ、クリエイターハッシュ、コレクションハッシュ、アセットデータハッシュ、フラグを含むV2リーフデータ構造 |
| getAssetWithProof | 書き込み命令に必要なすべてのDAS APIデータをフェッチ・解析するSDKヘルパー |
| DAS API | Digital Asset Standard API — cNFTデータのインデックス化とフェッチのためのRPC拡張 |
| TreeConfig | Bubblegumツリー設定を保存するマークルツリーアドレスから導出されるPDA |
| リーフデリゲート | cNFTオーナーによってcNFTの転送、バーン、フリーズが許可されたアカウント |
| ツリーデリゲート | プライベートツリーからcNFTをミントするためにツリークリエイターによって許可されたアカウント |
| ソウルバウンド | setNonTransferableV2で設定された永続的に転送不可能なcNFT — 不可逆 |
