You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:43:13