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

基于near-contract-standards的NFT带价转账功能实现咨询

实现方案分两种场景对应你提到的两种选型:

场景1:做一级市场NFT发售(NFT还未铸造,用户付费后直接获得新铸的NFT)

这种情况直接修改nft_mint方法即可,不需要用到internal_transfer,实现逻辑如下:

  1. 合约里新增存储变量存发售价格,比如pub mint_price: Balance
  2. 在nft_mint的开头加校验逻辑:
    • 校验调用者(env::predecessor_account_id())附的押金env::attached_deposit() ≥ 发售价格 + NFT所需存储费用
    • 扣除掉存储费用后,把剩余对应发售价格的资金转账到发行方收款账户
  3. 直接将铸造的NFT的所有者设置为当前调用的付款用户即可。

场景2:做二级市场NFT交易(NFT已经铸造完成,归现有用户所有,其他用户付费购买二手NFT)

这种情况必须调用internal_transfer实现,不能用铸造逻辑,实现步骤如下:

  1. 合约新增上架相关的存储结构,比如token_listings: LookupMap<TokenId, Option<Balance>>,用来存对应NFT的挂牌售卖价格,没有挂牌的对应值为None
  2. 新增公开的上架方法nft_list,仅允许NFT所有者调用,传入要售卖的token_id和售价,把价格写入上面的token_listings结构
  3. 新增公开的付费购买方法nft_buy,标注#[payable],参数传入要购买的token_id,内部逻辑按顺序执行:
    • 查询该token是否处于挂牌售卖状态,拿到对应的售卖价格
    • 校验调用者附的押金 ≥ 售卖价格 + NFT转移所需的存储费用
    • 调用internal_transfer方法,将该NFT从原所有者账户转移到当前付款的调用者账户
    • 扣除存储费后,将对应售价的资金通过Promise转账给原NFT所有者
    • 清除该token的挂牌状态,避免重复售卖

注意事项

  • 不要修改官方标准的nft_transfer方法,该方法原生要求调用者是NFT所有者或授权账户,不符合你买家直接调用购买的需求
  • 所有资金校验逻辑要写在状态修改逻辑之前,避免重入等安全问题
  • 存储费用建议按NEAR官方标准预留0.01N左右的额度,避免存储不足导致交易失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 06:39:03