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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:06:00