Solidityトランザクションエラー、呼び出された関数は、値を送信すると支払い可能になり、送信する値は現在の残高よりも少なくなるはずです。質問する

Solidityトランザクションエラー、呼び出された関数は、値を送信すると支払い可能になり、送信する値は現在の残高よりも少なくなるはずです。質問する

私はRemixでSolidityを学んでいます。YouTubeのチュートリアル動画に従っていたのですが、2つのコントラクトを構築しようとして行き詰まってしまいました。コントラクトERC20Tokenには残高を増やす関数があります。そしてMycontractはインスタンス化してmint関数を呼び出します。YouTubeの人と同じ方法で実行しましたが、buyToken関数を呼び出すときにエラーが発生しました。エラーは次のようになっています。

MyContract.buyToken へのトランザクションでエラーが発生しました: VM エラー: 元に戻します。

トランザクションは初期状態に戻されました。

注意: 値を送信する場合、呼び出された関数は支払い可能で、送信する値は現在の残高よりも少なくなければなりません。詳細情報を取得するには、トランザクションをデバッグしてください。

私を助けてください。

ここにコードがあります。

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);
    
      }
  }

ここに画像の説明を入力してください

ベストアンサー1

まず、 を展開する必要がありますERC20Token

ここに画像の説明を入力してください

私の場合は、アドレス に展開されました0xcD6a42782d230D7c13A74ddec5dD140e55499Df9

ここに画像の説明を入力してください

のアドレスはERC20Token次のステップにとって重要です。


次に、 をデプロイしますMyContract。コンストラクター引数を渡すことを忘れないでください。

  • _walletRemix JS VM エミュレータ内の有効なアドレス(Account選択ボックスから)

    この回答では、0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c3 番目のステップでも表示されるアドレスを選択しました。

  • _token前のステップのトークンコントラクトアドレスです

ここに画像の説明を入力してください


buyToken()最後に、の機能を実行できますMyContract

関数の実行前、送信者は 89 ETH を保有しており、トランザクションで 50 ETH を送信しようとしていることがわかります。

ここに画像の説明を入力してください

正常に実行された後、送信者は 39 ETH を保有し、wallet次の行により 50 ETH を受け取りました。

wallet.transfer(msg.value);

ここに画像の説明を入力してください

スクリーンショットでわかるように、取引は成功しました。

ここに画像の説明を入力してください

おすすめ記事