Brownie测试ERC20支付ERC1155 NFT mint报超出授权额度错误求助
问题修复方案
1. 核心报错原因:授权逻辑错误
你收到的transfer amount exceeds allowance报错完全是测试脚本中的授权逻辑写错导致的:transferFrom是NFT合约作为第三方操作你的ERC20代币,必须由代币持有者给NFT合约地址授权,你当前的测试代码是让account2给自己授权,完全不生效。同时你没有指定approve调用的发起方为代币持有者account2,默认会用部署合约的account1发起调用,也是错误的。
将测试脚本中的授权代码:
tx2 = robo_token.approve(account2.address, robo_token.balanceOf(account2.address))
修改为:
tx2 = robo_token.approve(pomobot_token.address, robo_token.balanceOf(account2.address), {"from": account2})
2. 隐藏问题:ERC20精度不匹配
你的ERC20代币设置了18位小数,当前mintPomoBot中transferFrom转账数额写的是1,对应实际金额是0.000000000000000001个POMO,如果你想设置1个POMO作为铸造费,需要修改ERC1155合约中的转账逻辑:
// 建议先定义常量 uint256 public constant MINT_FEE = 1 * 10 ** 18; require(_roboToken.transferFrom(msg.sender, address(this), MINT_FEE));
3. payable修饰符相关问题
不需要给mintPomoBot加payable修饰符。payable仅用于需要接收链原生币(如ETH、BNB)的函数,你全程使用ERC20代币结算,没有原生币转账逻辑,不需要加该修饰符。
额外优化建议
- 你ERC20合约中写的
approveNFTContract是仅owner可调用的函数,只能给owner持有的代币授权给NFT合约,普通用户铸造时还是需要自行发起授权,该函数在当前业务逻辑中无作用,可以删除。 - 建议给
mintPomoBot加上NFT ID、铸造数量的合法性校验,避免无效mint操作。
内容的提问来源于stack exchange,提问作者Cromewar
相关产品推荐
相关产品推荐

