求助:为Metaplex Candy Machine UI添加剩余NFT计数器与已铸NFT展示
解决Candy Machine UI剩余NFT计数器与铸造区块展示问题
一、获取剩余/已铸造NFT数量的核心方法
Metaplex的Candy Machine合约本身存储了关键铸造数据,可通过官方SDK直接从链上读取:
- 使用
@metaplex-foundation/jsSDK获取Candy Machine状态:
这段代码直接读取合约的import { Metaplex, keypairIdentity } from "@metaplex-foundation/js"; import { Connection, clusterApiUrl } from "@solana/web3.js"; // 初始化链连接与Metaplex实例 const connection = new Connection(clusterApiUrl("mainnet-beta")); const metaplex = Metaplex.make(connection).use(keypairIdentity(yourKeypair)); // 通过Candy Machine地址拉取数据 const candyMachine = await metaplex.candyMachines().findByAddress({ address: candyMachineAddress, }); // 提取并计算核心数值 const totalSupply = candyMachine.data.itemsAvailable.toNumber(); const mintedCount = candyMachine.itemsRedeemed.toNumber(); const remainingCount = totalSupply - mintedCount;itemsAvailable(总供应量)和itemsRedeemed(已铸造数量),计算后即可在UI中渲染剩余NFT计数。Candy Machine v2/v3字段命名一致,SDK会自动兼容版本差异。
二、获取已铸造NFT的区块信息
每个NFT的铸造交易都关联区块数据,可通过两种方式获取:
1. 通过NFT地址回溯铸造交易区块
拿到NFT的mint地址后,查询其metadata地址的创建交易:
// 假设已获取目标NFT的mint地址 const nft = await metaplex.nfts().findByMint({ mintAddress: nftMintAddress }); const metadataAddress = nft.metadataAddress; // 查询该metadata地址的首个交易(即铸造交易) const transactions = await connection.getSignaturesForAddress(metadataAddress, { limit: 1, order: "desc", }); if (transactions.length > 0) { const txSignature = transactions[0].signature; const txDetails = await connection.getTransaction(txSignature); const blockNumber = txDetails?.slot; // 区块号 const blockTime = txDetails?.blockTime; // 区块时间戳 }
2. 监听铸造事件实时获取区块
若需实时展示最新铸造的NFT区块,可订阅Candy Machine的Mint事件:
// 订阅Candy Machine的铸造事件 metaplex.candyMachines().subscribeToMintEvents({ candyMachineAddress, onEvent: (event) => { const { mintAddress, slot } = event; // slot即为区块号 // 在此更新UI展示区块信息与新铸造NFT }, });
三、UI集成注意事项
- 数据缓存:链上读取存在延迟,建议对
totalSupply、mintedCount做10秒左右的短缓存,减少节点请求频率。 - 错误处理:交易未确认时
getTransaction可能返回null,需添加加载状态判断。 - 环境适配:测试网(devnet/testnet)与主网需切换对应节点URL,可使用
clusterApiUrl或自定义节点地址。
四、官方参考依据
Metaplex官方SDK的candyMachines与nfts模块,详细定义了状态获取与交易查询的方法。此外,Candy Machine合约的核心结构体也明确了关键字段:
// Candy Machine v3合约核心结构体示例 pub struct CandyMachine { pub authority: Pubkey, pub wallet: Pubkey, pub token_mint: Option<Pubkey>, pub items_available: u64, pub items_redeemed: u64, // 其他字段... }
内容的提问来源于stack exchange,提问作者Stephane E
相关产品推荐
相关产品推荐

