【问题标题】:solidity transaction error, The called function should be payable if you send value and the value you send should be less than your current balancesolidity 交易错误,如果您发送值并且您发送的值应该小于您当前的余额,则应该支付调用的函数
【发布时间】: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的时候是在发送以太币吗?

标签: blockchain ethereum solidity remix


【解决方案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,因为您使用的是测试环境

            【讨论】:

              猜你喜欢
              • 2021-11-04
              • 2022-01-23
              • 2023-01-21
              • 2020-03-08
              • 2019-01-30
              • 1970-01-01
              • 2014-10-01
              • 1970-01-01
              • 2019-03-20
              相关资源
              最近更新 更多