Cadence报错:&NftMarketPlace.saleCollection无purchase成员及交易代码求助
解决Cadence中
&NftMarketPlace.saleCollection{NftMarketPlace.saleCollectionPublic}?无purchase成员的报错 问题分析
报错核心是你当前获取的saleCollection公共引用类型(&NftMarketPlace.saleCollection{NftMarketPlace.saleCollectionPublic}?)没有暴露purchase方法,这是Cadence接口(Capability)权限控制导致的——只有接口显式声明的函数,才能通过该接口的引用调用。
解决方案
检查公共接口定义
打开NftMarketPlace合约,确认saleCollectionPublic接口是否包含purchase函数的签名。如果没有,需要补充:pub interface saleCollectionPublic { pub fun purchase(id: UInt64, receipientCollection: &NFTCollection{NftCollectionPublic}, payment: @FlowToken.Vault) // 保留其他已有的公共方法 }若
purchase属于单独的接口,需在借用引用时同时包含该接口。修正引用借用逻辑
确保借用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)验证资源接口绑定
确认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
相关产品推荐
相关产品推荐

