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でソースを見る

クイックスタート

ジャンプ先: セットアップ · ツリー作成 · ミント · 転送 · バーン · 更新 · 委任 · コレクション · フリーズ · クリエイター検証 · フェッチ · エラー · クイックリファレンス

  1. 依存関係のインストール:npm install @metaplex-foundation/mpl-bubblegum @metaplex-foundation/umi-bundle-defaults
  2. .use(mplBubblegum())を使用してUmiインスタンスを作成する
  3. createTreeでBubblegumツリーを作成する
  4. mintV2でcNFTをミントし、その後の書き込み操作の前にはgetAssetWithProofを使用する

インストール

Terminal
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インスタンスに登録します。

setup.ts
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ツリーとして登録します。ツリーのパラメーターは永続的なので、作成前に慎重に選択してください。

create-tree.ts
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リーフを作成します。

mint-cnft.ts
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プラグインが有効になっている必要があります。

mint-to-collection.ts
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を含む)を取得します。

parse-mint.ts
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の所有権を新しいウォレットに移動します。getAssetWithProofDAS APIから必要なすべてのプルーフパラメーターを取得します。

transfer.ts
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を永久に破壊し、ツリーからリーフを削除します。

burn.ts
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の更新を参照してください。

update.ts
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を転送、バーン、フリーズできます。デリゲートは転送後に新しいオーナーにリセットされます。

デリゲートの承認

approve-delegate.ts
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)

デリゲートの取り消し

新しいデリゲートをオーナー自身のアドレスに設定します。

revoke-delegate.ts
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コレクションを設定、変更、または削除します。詳細についてはコレクションの管理を参照してください。

コレクションの設定または変更

set-collection.ts
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)

コレクションの削除

remove-collection.ts
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のフリーズ(リーフデリゲート)

freeze.ts
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の解除

thaw.ts
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のフリーズを参照してください。

soulbound.ts
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フラグを設定します。検証されるクリエイターはトランザクションに署名する必要があります。詳細についてはクリエイターの検証を参照してください。

クリエイターの検証

verify-creator.ts
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)

クリエイターの検証解除

unverify-creator.ts
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のフェッチ

fetch-asset.ts
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のフェッチ

fetch-by-owner.ts
import { publicKey } from '@metaplex-foundation/umi'
const result = await umi.rpc.getAssetsByOwner({
owner: publicKey('OwnerAddressHere'),
})
console.log('cNFTs owned:', result.items.length)

コレクション別cNFTのフェッチ

fetch-by-collection.ts
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を導出

find-asset-id.ts
import { findLeafAssetIdPda } from '@metaplex-foundation/mpl-bubblegum'
const [assetId] = await findLeafAssetIdPda(umi, {
merkleTree: merkleTree.publicKey,
leafIndex: 0,
})

トランザクションパターン

「Transaction Too Large」エラーへの対処

マークルプルーフはツリーの深さに比例して大きくなります。getAssetWithProoftruncateCanopy: trueを渡すと、キャノピーにキャッシュされたプルーフノードを自動的に削除し、トランザクションサイズを削減します。

truncate-canopy.ts
import { getAssetWithProof } from '@metaplex-foundation/mpl-bubblegum'
// truncateCanopy fetches tree config and removes redundant proof nodes
const assetWithProof = await getAssetWithProof(umi, assetId, { truncateCanopy: true })

非常に深いツリーで切り詰めたプルーフでもトランザクション制限を超える場合は、アドレスルックアップテーブル付きのバージョン管理されたトランザクションを使用してください。

送信と確認

send-and-confirm.ts
const result = await mintV2(umi, { ... }).sendAndConfirm(umi)
console.log('Signature:', result.signature)

送信せずにビルド

build-only.ts
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をミントする
transferV2cNFTの所有権を転送する
burnV2cNFTを永久に破壊する
updateMetadataV2cNFTメタデータを更新する(名前、URI、クリエイター、ロイヤリティ)
delegateリーフデリゲートを承認または取り消す
setTreeDelegateツリーデリゲートを承認または取り消す
setCollectionV2MPL-Coreコレクションを設定、変更、または削除する
freezeV2cNFTをフリーズする(既存のリーフデリゲートが必要)
thawV2フリーズされたcNFTを解除する
delegateAndFreezeV21つの命令で委任とフリーズを行う
setNonTransferableV2cNFTを永続的にソウルバウンドにする(不可逆)
verifyCreatorV2クリエイターエントリにverifiedフラグを設定する
unverifyCreatorV2クリエイターエントリからverifiedフラグを削除する
getAssetWithProof書き込み命令に必要なすべてのプルーフパラメーターをフェッチする
findLeafAssetIdPdaツリーアドレスとリーフインデックスからcNFTアセットIDを導出する
parseLeafFromMintV2Transactionミントトランザクションからリーフスキーマ(アセットIDを含む)を抽出する

最小依存関係

package.json
{
"dependencies": {
"@metaplex-foundation/mpl-bubblegum": "^5.0.0",
"@metaplex-foundation/umi": "^1.0.0",
"@metaplex-foundation/umi-bundle-defaults": "^1.0.0"
}
}

プログラムアドレス

プログラムアドレス
MPL-Bubblegum V2BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY
SPL Account CompressioncmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK
SPL Noopnoopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV

ツリーサイズリファレンス

最大深度容量概算コスト
1416,384~0.34 SOL
17131,072~1.1 SOL
201,048,576~8.5 SOL
2416,777,216~130 SOL
301,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でgetAssetgetAssetProofの両方を呼び出し、Bubblegum V2書き込み命令が期待する正確なパラメーター形状にレスポンスを解析するヘルパーです。ほぼすべての変更命令(転送、バーン、更新、委任、フリーズ、検証)にこれらのパラメーターが必要です。古いプルーフエラーを避けるために、送信する直前に必ず呼び出してください。

用語集

用語定義
UmiSolanaアプリケーション構築のためのMetaplexのフレームワーク。ウォレット接続、RPC、トランザクション構築を処理する
mplBubblegumすべてのBubblegum V2命令とDAS APIプラグインを登録するUmiプラグイン
cNFT圧縮NFT — 専用アカウントではなく、オンチェーンマークルツリーのハッシュされたリーフとして保存される
マークルツリーハッシュされたNFTデータをリーフとして保存するオンチェーンアカウント。createTreeで作成される
リーフマークルツリーの単一のcNFTエントリ。リーフインデックスで識別される
プルーフリーフがツリーに属することを暗号学的に検証するための兄弟ハッシュのリスト
キャノピートランザクションで必要なプルーフサイズを削減するためにオンチェーンに保存されたマークルツリーの上位ノードのキャッシュ
LeafSchemaV2id、オーナー、デリゲート、ノンス、データハッシュ、クリエイターハッシュ、コレクションハッシュ、アセットデータハッシュ、フラグを含むV2リーフデータ構造
getAssetWithProof書き込み命令に必要なすべてのDAS APIデータをフェッチ・解析するSDKヘルパー
DAS APIDigital Asset Standard API — cNFTデータのインデックス化とフェッチのためのRPC拡張
TreeConfigBubblegumツリー設定を保存するマークルツリーアドレスから導出されるPDA
リーフデリゲートcNFTオーナーによってcNFTの転送、バーン、フリーズが許可されたアカウント
ツリーデリゲートプライベートツリーからcNFTをミントするためにツリークリエイターによって許可されたアカウント
ソウルバウンドsetNonTransferableV2で設定された永続的に転送不可能なcNFT — 不可逆