Solidity 交易错误,如果您发送价值并且您发送的价值应小于您当前的余额,则应支付被调用的函数

Baa*_*ark 7 blockchain ethereum solidity 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);
    
      }
  }
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Pet*_*jda 5

首先,您需要部署ERC20Token.

在此输入图像描述

就我而言,它已部署到地址0xcD6a42782d230D7c13A74ddec5dD140e55499Df9

在此输入图像描述

该地址ERC20Token对于下一步很重要。


然后您部署MyContract. 不要忘记传递构造函数参数:

  • _wallet是 Remix JS VM 模拟器中的任何有效地址(来自Account选择框)

    为了回答这个问题,我选择了地址0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c,您也将在第三步中看到该地址。

  • _token是上一步中的代币合约地址

在此输入图像描述


最后就可以执行该buyToken()函数了MyContract

您可以看到,在函数执行之前,发送者有 89 ETH,并且即将通过交易发送 50 ETH。

在此输入图像描述

成功执行后,发送者现在有 39 ETH,并且wallet由于这一行而收到了 50 ETH:

wallet.transfer(msg.value);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

正如您在屏幕截图中看到的,交易成功了。

在此输入图像描述


Tru*_*rue 2

因为您当前的余额为0。您可以尝试使用低级交互来发送一些余额到合约地址。让我知道这是否有效!

在此输入图像描述

  • 我遇到了这个问题,这不起作用。当使用任何数量的 wei 或 ether 进行部署时,我都会遇到同样的错误。 (2认同)