solidity 交易错误,如果您发送值并且您发送的值应该小于您当前的余额,则应该支付调用的函数
Posted
技术标签:
【中文标题】solidity 交易错误,如果您发送值并且您发送的值应该小于您当前的余额,则应该支付调用的函数【英文标题】:solidity transaction error, The called function should be payable if you send value and the value you send should be less than your current balance 【发布时间】:2020-08-06 20:49:57 【问题描述】:我正在学习 remix 的稳定性。 我在 youtube 上关注一些教程视频,但我一直在尝试建立 2 个合同。 合约 ERC20Token 具有增加余额的功能。 Mycontract 实例化并调用 mint 函数。我的做法和 youtube 上的那个人一样,但是当我调用 buyToken 函数时我遇到了错误。错误是说
交易到 MyContract.buyToken 出错:VM 错误:还原。
revert 交易已经恢复到初始状态。
注意:如果您发送值并且您发送的值应该小于您当前的余额,则调用的函数应该是应付的。调试事务以获取更多信息。
请帮帮我。
这里是代码。
pragma solidity 0.5.1;
contract ERC20Token
string public name;
mapping(address => uint256) public balances;
function mint() public
balances[tx.origin] ++;
contract MyContract
address payable wallet;
address public token;
constructor(address payable _wallet, address _token) public
wallet = _wallet;
token = _token;
function buyToken() public payable
ERC20Token _token = ERC20Token(address(token));
_token.mint();
wallet.transfer(msg.value);
【问题讨论】:
这个评论有点晚了,你在调用buyToken的时候是在发送以太币吗? 【参考方案1】:你应该在你的构造函数中使用payable,如下所示:
constructor(address payable _wallet) public payable
...
【讨论】:
它只在构造函数中工作为什么我们不能在另一个函数中使用函数 enter() public pay 【参考方案2】:首先,您需要部署ERC20Token
。
在我的例子中,它被部署到地址0xcD6a42782d230D7c13A74ddec5dD140e55499Df9
。
ERC20Token
的地址对于下一步很重要。
然后部署MyContract
。不要忘记传递构造函数参数:
_wallet
是 Remix JS VM 模拟器中的任何有效地址(来自 Account
选择框)
为了回答这个问题,我选择了地址0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c
,您也会在第三步中看到。
_token
是上一步的代币合约地址
最后可以执行MyContract
的buyToken()
函数了。
可以看到,在函数执行前,sender有89 ETH,即将随交易发送50 ETH。
成功执行后,发送方现在有 39 个 ETH,wallet
收到了 50 个 ETH,因为这行:
wallet.transfer(msg.value);
从截图中可以看出,交易成功了。
【讨论】:
【参考方案3】:因为您当前的余额为 0。您可以尝试使用低级交互将一些余额发送到合约地址。 让我知道这是否有效!
【讨论】:
我遇到了这个问题,这不起作用。使用任何数量的 wei 或 ether 部署时,我都会遇到同样的错误。【参考方案4】:我在其他任何地方都没有看到的答案是,如果您通过浏览器运行 Remix,只需刷新页面/浏览器
【讨论】:
【参考方案5】:使用 balanceOf() 函数检查您的余额,例如, 平衡(所有者)。因为,你创造的代币就是你的余额,如果你没有东西,你就不能买东西。您在此处编写的智能合约具有与您拥有的代币数量相同的余额。我的智能合约也有这样的错误,一天后发现了。
要克服这个问题,请执行以下操作,
添加程序以从买方和所有者的个人余额中增加和减少余额。 如果您想为新手提供一些入门级余额以开始购买。【讨论】:
【参考方案6】:如果您正在使用混音,请检查您的环境并确保您选择了 Injected web3for cool guys who using this environment!
【讨论】:
【参考方案7】:确保首先部署 ERC20Token。然后在部署的 ERC20Token 旁边是一个剪贴板,用于复制 ER20Token 的地址。将该地址复制到 MyContract 的 _token 字段中,并将帐户中的一个钱包地址也复制到 _wallet 字段中。
切换账户,看到不同的钱包地址,然后点击MyContract buyToken按钮,应该不会再出现错误了。
您的代码是正确的,但您的钱包/代币地址出错了。
【讨论】:
【参考方案8】:尝试使用 O wei,因为您使用的是测试环境
【讨论】:
以上是关于solidity 交易错误,如果您发送值并且您发送的值应该小于您当前的余额,则应该支付调用的函数的主要内容,如果未能解决你的问题,请参考以下文章
我的网页上的 Solidity 众筹功能失败,但直接发送时成功,但成功交易时不发送 ERC20
对象作为 React 子对象无效。如果您打算渲染一组子项,请改用数组 - 错误 Solidity - React