有没有办法使用 ext_contract 从 NEAR 的外部合约调用 NonFungibleTokenCore?

Is there a way to call NonFungibleTokenCore from an external contract in NEAR using ext_contract?

我正在使用在依赖特征 NonFungibleTokenCore 上调用的函数,我想使用 ext_contract 的便利包装器来简化交叉合约调用。

这是我添加它的尝试:

#[ext_contract(ext_non_fungible_token)]
trait NFTCore: NonFungibleTokenCore {}

来自:https://github.com/roshkins/sputnik-dao-contract/blob/nft-tokensv4/sputnik-nft-staking/src/lib.rs#L18

我使用 rust-analyzer 完成的代码没有提供任何完成。当我构建它时出现此错误:

error[E0425]: cannot find function `nft_transfer` in module `ext_non_fungible_token`
   --> sputnik-nft-staking/src/lib.rs:151:33
    |
151 |         ext_non_fungible_token::nft_transfer(sender_id.clone(), token_id.clone(), 0, None,
    |                                 ^^^^^^^^^^^^ not found in `ext_non_fungible_token`

你知道如何正确使用宏吗?

不幸的是,ext_contract proc 宏只知道该块内的代码,不能根据此处 NonFungibleTokenCore 的 Supertrait 定义的方法生成代码 https://github.com/roshkins/sputnik-dao-contract/blob/bc8398257cdbee248fdd6301af0dc41a9b7c5236/sputnik-nft-staking/src/lib.rs#L18

目前,您必须重新定义界面,但我会四处询问是否有更简洁的方法来执行此操作。

这样的事情可能会解决您眼前的问题:

#[ext_contract(ext_non_fungible_token)]
trait NonFungibleTokenCore {
    fn nft_transfer(
        &mut self,
        receiver_id: AccountId,
        token_id: TokenId,
        approval_id: Option<u64>,
        memo: Option<String>,
    );
    fn nft_transfer_call(
        &mut self,
        receiver_id: AccountId,
        token_id: TokenId,
        approval_id: Option<u64>,
        memo: Option<String>,
        msg: String,
    ) -> PromiseOrValue<bool>;
    fn nft_token(&self, token_id: TokenId) -> Option<Token>;
}