无法从DriverzNFT合约获取Genesis系列NFT元数据求助
问题原因及解决办法
第一个问题:调用了接口外的自定义方法
你写的脚本里用了collection.borrowDriverzNFT(id: id),但你借用来的集合引用,只声明了要实现NonFungibleToken.CollectionPublic、NonFungibleToken.Receiver、MetadataViews.ResolverCollection这三个接口。borrowDriverzNFT是合约自己加的方法,不在这三个接口的权限范围内,所以当前引用根本调用不了这个方法,脚本自然无法正常执行。
正确的做法是使用标准接口里的borrowNFT方法,再将其转换为&DriverzNFT.NFT类型:
let nftRef = collection.borrowNFT(id: id) as! &DriverzNFT.NFT returnVals.append(nftRef)
第二个问题:返回类型不对,无法直接获取元数据
你脚本返回的是[&DriverzNFT.NFT],但这个类型本身不带元数据访问逻辑。要获取Genesis系列的NFT元数据,得通过MetadataViews接口解析,不能直接返回NFT引用。
下面是调整后的脚本,直接返回元数据内容:
import DriverzNFT from 0xa039bd7d55a96c0c import NonFungibleToken from 0x1d7e57aa55817448 import MetadataViews from 0x1d7e57aa55817448 pub fun main(address: Address): [MetadataViews.Display] { let collection = getAccount(address).getCapability(DriverzNFT.CollectionPublicPath) .borrow<&DriverzNFT.Collection{NonFungibleToken.CollectionPublic, MetadataViews.ResolverCollection}>() ?? panic("无法获取NFT集合") var metadataList: [MetadataViews.Display] = [] let ids = collection.getIDs() for id in ids { // 先通过标准方法借取NFT,再转换为带Resolver接口的引用 if let nft = collection.borrowNFT(id: id) as? &DriverzNFT.NFT{MetadataViews.Resolver} { // 解析常用的Display元数据视图 if let displayView = nft.resolveView(type: MetadataViews.Display.self) { metadataList.append(displayView) } } } return metadataList }
额外排查点
- 确认
DriverzNFT.NFT合约是否实现了MetadataViews.Resolver接口,没实现的话调用resolveView会失败 - 如果只需要Genesis系列的NFT,可在循环中增加筛选逻辑,比如合约里有
series字段的话,用nft.series == "Genesis"判断后再获取元数据
内容的提问来源于stack exchange,提问作者RMT Books
相关产品推荐
相关产品推荐

