基于near-contract-standards的NFT带价转账功能实现咨询
实现方案分两种场景对应你提到的两种选型:
场景1:做一级市场NFT发售(NFT还未铸造,用户付费后直接获得新铸的NFT)
这种情况直接修改nft_mint方法即可,不需要用到internal_transfer,实现逻辑如下:
- 合约里新增存储变量存发售价格,比如
pub mint_price: Balance - 在
nft_mint的开头加校验逻辑:- 校验调用者(
env::predecessor_account_id())附的押金env::attached_deposit()≥ 发售价格 + NFT所需存储费用 - 扣除掉存储费用后,把剩余对应发售价格的资金转账到发行方收款账户
- 校验调用者(
- 直接将铸造的NFT的所有者设置为当前调用的付款用户即可。
场景2:做二级市场NFT交易(NFT已经铸造完成,归现有用户所有,其他用户付费购买二手NFT)
这种情况必须调用internal_transfer实现,不能用铸造逻辑,实现步骤如下:
- 合约新增上架相关的存储结构,比如
token_listings: LookupMap<TokenId, Option<Balance>>,用来存对应NFT的挂牌售卖价格,没有挂牌的对应值为None - 新增公开的上架方法
nft_list,仅允许NFT所有者调用,传入要售卖的token_id和售价,把价格写入上面的token_listings结构 - 新增公开的付费购买方法
nft_buy,标注#[payable],参数传入要购买的token_id,内部逻辑按顺序执行:- 查询该token是否处于挂牌售卖状态,拿到对应的售卖价格
- 校验调用者附的押金 ≥ 售卖价格 + NFT转移所需的存储费用
- 调用
internal_transfer方法,将该NFT从原所有者账户转移到当前付款的调用者账户 - 扣除存储费后,将对应售价的资金通过Promise转账给原NFT所有者
- 清除该token的挂牌状态,避免重复售卖
注意事项
- 不要修改官方标准的
nft_transfer方法,该方法原生要求调用者是NFT所有者或授权账户,不符合你买家直接调用购买的需求 - 所有资金校验逻辑要写在状态修改逻辑之前,避免重入等安全问题
- 存储费用建议按NEAR官方标准预留0.01N左右的额度,避免存储不足导致交易失败
内容的提问来源于stack exchange,提问作者Amiya Behera
相关产品推荐
相关产品推荐

