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 IDamount:NFT类资产默认为1memo:可选,可填写赎回备注
- 调用时需强制附1yocto NEAR的押金,同时附至少5T Gas,符合NEP-171的标准调用要求。
- 跨合约回调确认转账成功后,删除
nft_original_owners映射中对应的记录,避免重复赎回。
简化方案(仅适配合约A场景)
如果合约B仅需要处理合约A的NFT,可省略存储结构中的NFT合约地址字段,直接用TokenID作为映射的key即可。
内容的提问来源于stack exchange,提问作者gabbi
相关产品推荐
相关产品推荐

