私は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
。コンストラクター引数を渡すことを忘れないでください。
_wallet
Remix JS VM エミュレータ内の有効なアドレス(Account
選択ボックスから)この回答では、
0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c
3 番目のステップでも表示されるアドレスを選択しました。_token
前のステップのトークンコントラクトアドレスです
buyToken()
最後に、の機能を実行できますMyContract
。
関数の実行前、送信者は 89 ETH を保有しており、トランザクションで 50 ETH を送信しようとしていることがわかります。
正常に実行された後、送信者は 39 ETH を保有し、wallet
次の行により 50 ETH を受け取りました。
wallet.transfer(msg.value);
スクリーンショットでわかるように、取引は成功しました。