mepublic
v0.1.0
Published
## 권장사항
Downloads
2
Readme
Hardhat & Foundry 보일러플레이트
권장사항
기본적으로 테스트는 foundry test를 활용할 것을 권장합니다.
- 다만, 백엔드와 관련된 테스트는 hardhat을 통해서 하는 것이 좋습니다.
- ex: 백엔드에서 ethers로 호출하는 함수가 있을 경우
- 다만, 백엔드와 관련된 테스트는 hardhat을 통해서 하는 것이 좋습니다.
hardhat.config.ts에서 solidity compiler 버전을 설정해도, solidity extension을 Juan Blanco의 것을 사용하면 vscode 단에서 compiler version을 인식 못해 pragma 에러가 발생합니다. Nomic Foundation의 solidity를 설치해서 사용하시면 vscode단에서 hardhat config와의 호환이 더 잘됩니다.
mocha test explorer extension을 사용하시면, hardhat test시 에러가 발생한 라인에 하이라이트가 되는 등의 소소한 지원이 됩니다.
Hardhat
환경변수 설정
- *.env 파일에 환경변수 추가후 process-env.d.ts에 반영 요망
테스트
주의사항
- 이전 보일러플레이트와 비교해서 테스트에서 가장 크게 달라진 부분은 블록체인 상태값을 관리하는 로직과 setup.ts의 존재 여부입니다.
- 이전 보일러플레이트에서는 before를 비롯한 여러 훅에서 직접 스냅샷을 조작하는 방식이었습니다.
- 이 보일러플레이트에서는 fixture로 snapshot을 조작합니다.
/hardhat/test/Lock.ts
를 보시면, 최상단에deloyOneYearLockFixture
라는 함수가 있습니다. 이전 보일러플레이트의 setup.ts에 해당한다고 봐주시면 됩니다.- 이 함수는 createFixture함수로 생성하는데, 이 함수를 통해 매 테스트(it)마다 fixture에 정의된 블록체인 상태값을 보장합니다.
- 해당 함수의 첫줄은
await hre.deployments.fixture()
인데, 이는 네트워크에서 아직 배포되지 않은 모든 배포 스크립트를 실행하는 구문입니다. - 로컬 테스트에서는 하드햇 네트워크를 매번 새로 생성하므로, 모든 컨트랙이 배포되지 않은 상태이고, 따라서
/hardhat/deploy_scripts/hardhat/todo
에 정의된 모든 배포 스크립트를 실행합니다. - 따라서,
await hre.deployments.fixture()
이후 모든 컨트랙은 배포된 상태이므로 그 아래줄에서는ethers.getContract
등의 함수로 배포된 컨트랙을 가져올 수 있습니다. - 이 setup함수(
deployOneYearLockFixture
)에서 테스트에서 사용할 값들을 return하면 이 setup함수를 사용하는 구문에서는 반환값을 사용하면 됩니다.(이전에 최상단 describe에 변수를 선언하고 setup함수의 반환값을 할당하는 방식보다 직관적이라고 판단하여 이렇게 구성하였습니다.) - 한 테스트 파일에서 이와 같은 setup함수가 하나일 필요는 없습니다. 테스트 계층이 깊다면 각 describe에 맞게 setup함수를 구성해서 사용하면 될 것입니다.
전제
- 로컬에서의 테스트가 주로 배포 이후의 정상 동작에 대한 것이라고 한다면, 포크 테스트는 주로 특정 시점(블록)에서 특정 액션에 관한 것일 가능성이 높을 것입니다.
- 즉, 포크 테스트에서는 이미 배포된 컨트랙의 주소를 참조하는 등 파일의 구성이 로컬 테스트의 그것과는 다소 다를 것이므로 파일을 달리 정의하는 것이 일반적이라고 판단했습니다.
- 따라서,
/hardhat/test/fork_test
라는 별도의 디렉토리에 fork 테스트를 따로 정의합니다. - 다만, fork test로 간주하는 로직은
describe
과it
의 식별자 안에서 특정 문구가 있느냐입니다. - 따라서 로컬 테스트 중 fork test로 실행하고 싶은 것이 있다면, 굳이 따로 파일을 만들지 않고 해당 테스트 식별자에 포크할 네트워크명('테스트넷', '메인넷')을 포함시켜주시면 되겠습니다.
로컬 테스트
- 커맨드:
yarn hardhat:test:local
describe
과it
의 식별자 중 '테스트넷', '메인넷'이라는 문구가 없는 테스트만 실행이 됩니다.- foundry와 유사하게
--vvv
처럼 플래그를 전달하면 스택 트레이싱 레벨을 조정할 수 있습니다.
- 커맨드:
테스트넷 포크 테스트
- 커맨드:
yarn hardhat:test:testnet
describe
과it
의 식별자 중 '테스트넷'이라는 문구가 있는 테스트만 실행이 됩니다.- 식별자는
describe
과it
문구의 합이므로 상위describe
에 '테스트넷'이 포함되어 있다면 해당 그룹의it
은 모두 실행됩니다.
- 식별자는
- foundry와 유사하게
--vvv
처럼 플래그를 전달하면 스택 트레이싱 레벨을 조정할 수 있습니다.
- 커맨드:
메인넷 포크 테스트
- 커맨드:
yarn hardhat:test:mainnet
describe
과it
의 식별자 중 '메인넷'이라는 문구가 있는 테스트만 실행이 됩니다.- 식별자는
describe
과it
문구의 합이므로 상위describe
에 '메인넷'이 포함되어 있다면 해당 그룹의it
은 모두 실행됩니다.
- 식별자는
- foundry와 유사하게
--vvv
처럼 플래그를 전달하면 스택 트레이싱 레벨을 조정할 수 있습니다.
- 커맨드:
스크립트 실행
- 권장사항
- 정말 급한 경우가 아니라면, 테스트넷과 메인넷에 실행할 스크립트는 fork 테스트를 작성하여 통과 여부 확인후 실행해주시길 바랍니다.
- hardhat 스크립트의 경우 따로 시뮬레이션 과정이 없기 때문에 스크립트 중간에 실패하게 된다면, 스크립트의 원자성을 보장할 수 없습니다.(불필요한 가스비의 사용도 방지하기 위함)
- 이것이 번거롭다고 생각될 경우 foundry의 스크립트 실행을 추천합니다. 기본적으로 로컬 시뮬레이션을 통과한 경우에만 실행이 되며, fork url을 옵션으로 줄 경우 해당 네트워크의 시뮬레이션까지 통과한 경우에만 실제 네트워크에 전파됩니다.
배포
- 이전 보일러플레이트와 크게 다른 점이 없습니다.
Foundry
테스트
- 로컬 테스트
- forge test
-vvv
와 같은 플래그로 스택 트레이싱 레벨 조정
- fork 테스트
- forge test --fork-url
해당 네트워크 노드 주소
-vvv
와 같은 플래그로 스택 트레이싱 레벨 조정
스크립트 실행
- 온체인 시뮬레이션
- forge script
스크립트 경로
--rpc-url해당 네트워크 노드 주소
--private-key비밀키
- 트랜잭션 전파
- forge script
스크립트 경로
--rpc-url해당 네트워크 노드 주소
--private-key비밀키
--with-gas-price해당 네트워크 가스비
--broadcast