在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
相关产品推荐
相关产品推荐

