功能
转移压缩NFT
transferV2指令可用于将压缩NFT从一个所有者转移到另一个。要授权转移,当前所有者或委托权限(如果有)必须签署交易。委托权限可以是叶子委托人或集合的permanentTransferDelegate。
请注意,此指令更新压缩NFT,因此会替换Bubblegum树上的叶子。这意味着必须提供额外的参数来验证压缩NFT的完整性。由于这些参数对于所有改变叶子的指令都是通用的,它们在以下FAQ中有记录。幸运的是,我们可以使用辅助方法,该方法将使用Metaplex DAS API自动为我们获取这些参数。
交易大小
如果遇到交易大小错误,请考虑在getAssetWithProof中使用{ truncateCanopy: true }。详见FAQ。
转移Bubblegum V2压缩NFT
该指令接受以下参数:
- 叶子所有者:压缩NFT的当前所有者。默认为交易的付款人。
- 叶子委托人:压缩NFT的当前所有者及其委托权限(如果有)。其中一个必须签署交易。
- 权限:签署交易的可选权限。可以是叶子所有者或
permanentTransferDelegate,默认为交易的payer。 - 新叶子所有者:压缩NFT新所有者的地址
- 默克尔树:Bubblegum树的地址
- 根:Bubblegum树的当前根
- 数据哈希:压缩NFT元数据的哈希
- 创作者哈希:压缩NFT创作者的哈希
- Nonce:压缩NFT的nonce
- 索引:压缩NFT的索引
- 集合:压缩NFT的核心集合(如果cNFT是集合的一部分)
使用JavaScript时,我们建议首先使用getAssetWithProof函数获取参数,然后将它们传递给transferV2指令。
转移压缩NFT
import { getAssetWithProof, transferV2 } from '@metaplex-foundation/mpl-bubblegum';
const assetWithProof = await getAssetWithProof(umi, assetId, {
truncateCanopy: true,
})
// 然后leafOwnerA可以用它将NFT转移给leafOwnerB。
const leafOwnerB = generateSigner(umi)
await transferV2(umi, {
// 从带证明的资产传递参数。
...assetWithProof,
authority: leafOwnerA,
newLeafOwner: leafOwnerB.publicKey,
// 如果cNFT是集合的一部分,传递核心集合。
//coreCollection: coreCollection.publicKey,
}).sendAndConfirm(umi)
压缩NFT的可转移性检查
canTransfer函数可用于检查压缩NFT是否可以转移。如果NFT可以转移则返回true,否则返回false。已冻结和NonTransferable的cNFT不能转移。
import { canTransfer } from '@metaplex-foundation/mpl-bubblegum'
const assetWithProof = await getAssetWithProof(umi, assetId, {
truncateCanopy: true,
})
const canBeTransferred = canTransfer(assetWithProof)
console.log("canBeTransferred", canBeTransferred ? "Yes" : "No")
