NFT接受出价场景下nft_transfer_call的receiver_id应为市场还是新买家?
结论
nft_transfer_call的receiver_id必须填写市场合约地址。
原因
按照NEP-171标准的设计逻辑,nft_transfer_call会先将NFT转移给你填写的receiver_id地址,再主动调用该地址的nft_on_transfer接口执行后续自定义逻辑:
- 如果你填出价人地址作为
receiver_id,NFT会直接转移给普通用户地址,普通地址没有实现nft_on_transfer接口,你需要的收益分发、移除出价等逻辑完全无法执行,流程直接中断。 - 填市场合约地址作为
receiver_id,NFT会先临时归属到市场合约名下,再触发市场合约的nft_on_transfer接口,你可以在这个接口内完成份额打款、移除出价等所有交易校验和执行逻辑。
后续流程优化建议
你的nft_resolve_transfer入参里的receiver_id直接填最开始传入的市场合约地址即可,不需要填写出价人地址。
等市场合约逻辑全部执行成功后,你有两种方式完成NFT最终归属:
- 直接在
nft_on_transfer逻辑末尾,由市场合约调用NFT合约的普通nft_transfer方法,将名下的对应NFT转移给出价人 - 把出价人地址信息通过
msg参数或者NFT合约的临时存储传递给nft_resolve_transfer接口,校验市场逻辑执行成功后,直接在NFT合约内部修改NFT所有者为出价人,省掉一次跨合约调用,降低Gas消耗。
内容的提问来源于stack exchange,提问作者Yassine S.
相关产品推荐
相关产品推荐

