メインコンテンツまでスキップ

VM

vmについて学習します

vmとはテストコード実行におけるチートコードで、環境に対して通常のブロックチェーンでは引き起こせない変化を起こせます

vm.addr

アドレスを生成できる

function addr(uint256 privateKey) external returns (address);
address alice = vm.addr(1);
emit log_address(alice); // 0x7e5f4552091a69125d5dfcb7b8c2659029395bdf

なお、makeAddrでも生成可能

function makeAddr(string memory name) internal returns(address addr);
address alice = makeAddr("alice");
emit log_address(alice); // 0x328809bc894f92807417d2dad6b7c998c1afdac6

Reference

vm.deal

アドレスにETHを付与できる

function deal(address who, uint256 newBalance) external;
address alice = makeAddr("alice");
vm.deal(alice, 1 ether);
log_uint256(alice.balance); // 1000000000000000000

Reference

vm.prank

次のトランザクションの実行者を指定することができる

function prank(address) external;
/// function withdraw() public {
/// require(msg.sender == owner);
/// }

vm.prank(owner);
myContract.withdraw(); // [PASS]

vm.startPrank,vm.stopPrankを用いることでその範囲中の実行者を固定することができる

function startPrank(address) external;
function stopPrank() external;

Reference

vm.expectRevert

通常、関数がRevertするとそのテストは失敗扱いになる

Revertすることを確認するテストをしたい場合はexpectRevertでRevertをキャッチすることで正常であるとみなせる

function expectRevert() external;
function expectRevert(bytes calldata message) external;

引数がない場合、どのようなRevertでもキャッチする

引数がある場合、そのエラーメッセージを返すRevertのみをキャッチする

/// function failFunction() {
/// revert();
/// }

vm.expectRevert();
Sample.failFunction();
/// function failFunction() {
/// revert("Error");
/// }

vm.expectRevert("Error");
Sample.failFunction();

Reference

vm.expectEmit

次の関数呼び出しで特定のイベントが発行されるかをチェックできる

function expectEmit() external;
function expectEmit(address emitter) external;

引数がない場合はイベントの内容をチェックする

引数がある場合はイベントが指定した関数から発行されているかをチェックする

  1. expectEmitを呼び出し
  2. 発行を想定するイベントを呼び出し
  3. 関数の呼び出し

の順番で行う

event Transfer(address indexed from, address indexed to, uint256 amount);

function testERC20EmitsTransfer() public {
vm.expectEmit();

// We emit the event we expect to see.
emit MyToken.Transfer(address(this), address(1), 10);

// We perform the call.
myToken.transfer(address(1), 10);
}

Reference