NEAR中如何通过ext_contract从外部合约调用NonFungibleTokenCore?
错误原因
#[ext_contract] 宏默认只会扫描当前直接标记的 trait 内定义的方法,不会自动继承、提取父 trait 的成员方法。你现在定义的空 trait NFTCore 自身没有任何方法声明,所以宏生成的 ext_non_fungible_token 模块自然没有 nft_transfer 等方法,编译时就会报找不到函数的错误,rust-analyzer 也无法生成补全提示。
正确实现方案
有两种常用的实现方式,都可以解决这个问题:
方案1:手动声明需要用到的接口(兼容性最好)
直接在你用 #[ext_contract] 标记的 trait 里,把你需要调用的 NFT 方法完整声明即可,不需要继承父 trait:
use near_sdk::{ext_contract, AccountId}; use near_contract_standards::non_fungible_token::TokenId; #[ext_contract(ext_non_fungible_token)] trait NFTCore { fn nft_transfer( &mut self, receiver_id: AccountId, token_id: TokenId, approval_id: Option<u64>, memo: Option<String>, ); // 其他需要调用的NFT接口也按标准签名补充在这里 }
这种方式的签名完全可控,rust-analyzer 可以正常识别补全,适合只需要调用部分NFT接口的场景。
方案2:直接为外部NFT标准trait生成ext接口(near-sdk 4.0+ 支持)
如果你用的是 4.0 及以上版本的 near-sdk,可以直接对导入的标准 NonFungibleTokenCore trait 生成ext封装,不需要手动重写方法签名:
use near_sdk::ext_contract; use near_contract_standards::non_fungible_token::core::NonFungibleTokenCore; #[ext_contract(ext_non_fungible_token)] impl NonFungibleTokenCore for () {}
宏会自动提取该 trait 下所有公开的方法,生成对应的跨合约调用接口。
调用示例
调用时注意 nft_transfer 要求必须附加至少 1 yocto NEAR 的存款,标准调用写法如下:
ext_non_fungible_token::ext(nft_contract_address) .with_attached_deposit(1) // 必须附加1yocto NEAR .with_static_gas(Gas(5_000_000_000_000)) // 按需设置gas .nft_transfer( receiver_id.clone(), token_id.clone(), None, Some("staking deposit".to_string()) ) .then(/* 你的回调逻辑 */);
内容的提问来源于stack exchange,提问作者Rashi Abramson
相关产品推荐
相关产品推荐

