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

NEAR区块链中如何通过合约B调用nft_transfer将NFT转回原持有人

NEAR 合约B NFT转回功能实现方案

核心逻辑说明

你需要让作为NFT当前持有者的合约B,主动响应原所有者的赎回请求,调用对应NFT合约的nft_transfer方法完成转回,整体实现分为3个部分:


1. 合约B新增存储结构

你需要在合约B中新增映射记录,存储每一笔转入NFT对应的原所有者信息,避免不同NFT合约的TokenID冲突,推荐结构如下(以Rust实现为例):

use near_sdk::collections::UnorderedMap;
use near_sdk::{AccountId, TokenId};

// 合约B的存储结构中新增字段
pub nft_original_owners: UnorderedMap<(AccountId, TokenId), AccountId>,

其中key为(NFT合约地址, 对应NFT的TokenID),value为该NFT的原所有者账户地址。


2. 原有NFT转入逻辑补充记录

在合约B之前调用nft_transfer从合约A拉取NFT的逻辑中,新增写入映射的操作:当确认NFT成功转入合约B地址后,将该NFT对应的(合约A地址, TokenID)和发起授权的原所有者地址写入上述nft_original_owners映射。


3. 新增用户可调用的赎回方法

在合约B中新增名为return_nft_to_owner的公开方法,参数为nft_contract_id: AccountId、token_id: TokenId,逻辑如下:

  • 校验调用者predecessor_account_id是否和映射中存储的该NFT对应原所有者一致,不一致直接抛出异常。
  • 校验合约B当前确实持有该NFT:可通过跨合约调用对应NFT合约的nft_token接口查询持有者,也可以在NFT转入时同步记录持有状态减少跨合约调用开销。
  • 校验通过后,合约B作为NFT持有者,跨合约调用目标NFT合约的nft_transfer接口,参数如下:
    • receiver_id:当前方法的调用者地址(即原所有者)
    • token_id:传入的对应NFT ID
    • amount:NFT类资产默认为1
    • memo:可选,可填写赎回备注
  • 调用时需强制附1yocto NEAR的押金,同时附至少5T Gas,符合NEP-171的标准调用要求。
  • 跨合约回调确认转账成功后,删除nft_original_owners映射中对应的记录,避免重复赎回。

简化方案(仅适配合约A场景)

如果合约B仅需要处理合约A的NFT,可省略存储结构中的NFT合约地址字段,直接用TokenID作为映射的key即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:06:08