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

在Solidity的ERC721合约中用UNI等ERC20代币设定NFT价格的方法

ERC721合约改ERC20代币计价问题说明

问题场景

  • 已完成ERC721类型NFT合约开发,原交易逻辑以原生ETH作为计价、支付媒介
  • 现有需求为调整交易逻辑,支持使用UNI、SUSHI这类标准ERC20代币设定NFT售价、完成交易支付,当前对智能合约开发的熟悉程度较低
  • 原定价模块的核心代码片段:
uint256 public constant NFT_PRICE = 1 ether;
  • 尝试直接替换计价单位的改写方案无法正常运行,改写的失效代码片段:
uint256 public constant NFT_PRICE = 1 UNI;

改写失效的核心原因

  • Solidity 内置的ether、gwei、wei是协议层针对原生ETH写死的单位换算规则,编译器能直接识别并完成数值转换,并没有内置对UNI、SUSHI这类外部代币的单位映射规则,直接写代币名编译器会识别为未定义的变量,自然无法正常编译
  • 所有ERC20代币的链上余额本质是无单位的大整数,代币的精度、单位换算规则完全由代币合约本身的decimals()方法决定,不存在通用的内置语法来直接表示“1个某代币”的数值。

可落地的调整方案

  • 定价数值适配:首先确认目标支付代币的精度(比如UNI、SUSHI的精度都是18位,和ETH一致),如果要设定“1个UNI”的售价,需要把定价常量改写为对应精度的数值:
// 对应1个完整UNI,和UNI代币18位精度匹配
uint256 public constant NFT_PRICE = 1 * 10 ** 18;
  • 配置支付代币标识:Solidity没法靠代币名称识别链上合约,需要硬编码或可配置支付代币的链上地址:
// 可替换为实际选用的支付代币(UNI/SUSHI等)的链上合约地址
address public constant PAYMENT_TOKEN = 目标代币的链上合约地址;
  • 替换收款校验逻辑:把原逻辑里判断用户是否付了足额ETH的msg.value校验,替换为ERC20标准的转账校验——在铸造NFT时,调用支付代币的transferFrom方法,从用户地址向合约地址划转足额的对应代币,校验划转成功后再给用户铸造NFT,完全替换原生ETH收款的逻辑分支。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 18:24:03