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

Cadence报错:&NftMarketPlace.saleCollection无purchase成员及交易代码求助

解决Cadence中&NftMarketPlace.saleCollection{NftMarketPlace.saleCollectionPublic}?无purchase成员的报错

问题分析

报错核心是你当前获取的saleCollection公共引用类型(&NftMarketPlace.saleCollection{NftMarketPlace.saleCollectionPublic}?)没有暴露purchase方法,这是Cadence接口(Capability)权限控制导致的——只有接口显式声明的函数,才能通过该接口的引用调用。

解决方案

  1. 检查公共接口定义
    打开NftMarketPlace合约,确认saleCollectionPublic接口是否包含purchase函数的签名。如果没有,需要补充:

    pub interface saleCollectionPublic {
        pub fun purchase(id: UInt64, receipientCollection: &NFTCollection{NftCollectionPublic}, payment: @FlowToken.Vault)
        // 保留其他已有的公共方法
    }
    

    若purchase属于单独的接口,需在借用引用时同时包含该接口。

  2. 修正引用借用逻辑
    确保借用saleCollection时指定的接口包含purchase方法,同时处理可选类型的解包(避免?带来的空引用问题):

    // 正确获取并解包saleCollection引用
    let saleCollection = getAccount(marketplaceAddress).getCapability(/public/saleCollection)
        .borrow<&NftMarketPlace.saleCollection{NftMarketPlace.saleCollectionPublic}>()
        ?? panic("无法借用售卖集合引用")
    
    // 保留原支付逻辑,确保payment类型正确
    let payment <- acct.borrow<&FlowToken.Vault>(from: /storage/flowTokenVault)!.withdraw(amount: price) as! @FlowToken.Vault
    saleCollection.purchase(id: id, receipientCollection: recipientCollection, payment: <- payment)
    
  3. 验证资源接口绑定
    确认saleCollection资源创建时,已正确绑定到包含purchase的公共接口,比如合约中发布资源到公共路径的代码:

    pub fun createSaleCollection(): @saleCollection {
        let collection <- create saleCollection()
        self.account.save(<- collection, to: /storage/saleCollection)
        self.account.link<&saleCollection{saleCollectionPublic}>(/public/saleCollection, target: /storage/saleCollection)
        return <- collection
    }
    

    若这里绑定的接口不包含purchase,需更新接口类型。

内容的提问来源于stack exchange,提问作者Wiswa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:55:12