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是上一步的代币合约地址


最后可以执行MyContractbuyToken()函数了。

可以看到,在函数执行前,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 新手:方便地发送多笔交易

我的网页上的 Solidity 众筹功能失败,但直接发送时成功,但成功交易时不发送 ERC20

以系列值和丰富的文本格式发送警报通知。

对象作为 React 子对象无效。如果您打算渲染一组子项,请改用数组 - 错误 Solidity - React

Solidity极简入门#29. 函数选择器Selector

将表单值发送到 mysql 数据库