Foundry

Test

Assert

  • assertApproxEqAbs: 유사값 확인. 오차 범위 내의 값인지 확인한다. 오차는 앞뒤 절대값으로 계산
    • Lt, Gt 로 오차 범위 체크하는 것보다 이게 깔끔함. 다만 앞뒤 범위가 다르다면 직접 해야
  • assertApproxEqRel: 유사값 확인. 오차 범위 내의 값인지 확인한다. 오차는 앞뒤 비율로 계산. 1e18 를 100%로 하는 퍼센테이지 계산
  • Foundry는 StdError를 제공한다. 만약 StdError를 사용하지 않고 직접 캐치하려면 다음과 같이 처리한다.
    • vm.expectRevert(abi.encodeWithSignature("Panic(uint256)", 0x11)); : 언더플로우/오버플로우 계산 오류 (unchecked 밖에서 발생한)
    • vm.expectRevert(abi.encodeWithSignature("Panic(uint256)", 0x12)); : 0 으로 나누기 에러
    • 기타 패닉 코드는 panic-via-assert-and-error-via-require 참고

Vm

  • prank: 호출자를 변경한다. address 인자 두개를 넣으면 tx.origin도 변경 가능하다.
  • deal: 계정에게 네이티브 토큰(ETH) 양 설정하기
  • etch: 특정 주소에 컨트랙트 셋팅하기
  • roll: block.number 조작하기. 해당 값으로 설정하기 때문에, 블록 넘버의 증가를 시뮬레이션하기 위해서는 vm.roll(block.number + 1) 과 같이 사용해야 한다.
  • warp: block.timestamp 조작하기. 해당 값으로 설정하기 때문에, 시간의 흐름을 시뮬레이션하기 위해서는 vm.warp(block.timestamp + 1) 와 같이 사용해야 한다.

주의할 점

ZKSync

zksync 체인의 컨트랙트 개발에는 foundry-zksync를 이용하는 게 좋다.


tags: blockchain, smart contract