Hardhat 연재의 후속으로, 배포를 돕는 hardhat-deploy 플러그인과 typechain 을 붙여 ERC20 토큰을 작성하고 테스트넷까지 배포하고 verify 하는 과정을 다룬다. 배포 결과가 로컬에 JSON 으로 남아 배포 이후 컨트랙트와 상호작용하기 쉬워지는 게 이 플러그인의 핵심 이점이다.
핵심 포인트- hardhat-deploy 는 배포를 편하게 할 뿐 아니라 배포된 컨트랙트 정보를 로컬에 저장해 이후 상호작용을 돕는다.
- named account 기능으로 accounts[0] 같은 인덱스 대신 계정에 이름을 붙여 쓸 수 있다.
- deploy 함수는 컨트랙트 이름과 옵션을 받아 배포한 뒤 address, abi, transactionHash 를 담은 DeployResult 를 반환하고, 결과는 deployments 폴더에 JSON 으로 남는다.
- typechain 으로 컨트랙트 타입을 정의해두면 불러온 컨트랙트의 메서드를 타입이 잡힌 상태로 호출할 수 있다.
- 예전에는 flatten 후 수동으로 하던 etherscan verify 를 etherscan-verify task 로 배포 스크립트 안에서 자동화한다.
상세 정리- 설치 패키지는 hardhat, typescript, ts-node, typechain 과 @typechain/hardhat, @typechain/ethers-v5, 테스트용으로 hardhat-waffle, ethereum-waffle, chai, hardhat-ethers, ethers 다. 프로젝트 초기화 때는 빈 hardhat.config 를 고른다.
- 컨트랙트는 openzeppelin 의 ERC20 을 상속한 SimpleToken 이다. 이름과 심볼을 constructor 인자로 받고 총 발행량 10의 12제곱 개를 decimal 18 로 컨트랙트 주소에 발행한다.
- faucet 함수는 발행 컨트랙트에서 호출한 sender 에게 10,000 개를 전송한다. 작성 후 hardhat compile 로 컴파일한다.
- 환경변수는 dotenv 로 관리하며 ETHERSCAN_API_KEY, INFURA_API_KEY, ADMIN, DEPOSITOR private key 를 둔다.
- 배포 스크립트는 script 대신 deploy 폴더에 두고 tsconfig.json 의 include 옵션도 그에 맞춰 바꾼다.
- getNamedAccounts 는 public key 만 반환한다. 다만 deploy 의 from 옵션에 public key 가 들어가면 hardhat.config 의 network 설정에 있는 private key 로 Wallet 객체를 만들어준다.
- 컨트랙트 호출은 DeployResult 의 abi 와 address 로 객체를 만들고, getSigner 로 얻은 depositor Signer 를 connect 해 faucet 을 실행하는 식이다.
- 웹앱이나 디앱을 만들 때 abi 를 따로 export 할 필요 없이 deployments 폴더에 접근해 컨트랙트 객체를 불러오면 된다.
- 실행 순서는 먼저 hardhat 로컬 네트워크에 배포해 스크립트 동작을 확인한 뒤, 각 계정에 테스트 이더를 채우고 ropsten 등 테스트넷에 배포한다. 글 작성 시점에 ropsten faucet 이 멈춰 kovan 이나 rinkeby 를 쓰라고 안내한다.
- task 는 hardhat 런타임에서 실행하는 작업 단위로 배포, 상호작용, 조회를 자동화할 수 있다. verify 도 이 task 로 배포 스크립트 안에서 네트워크 이름만 넘겨 실행한다.
- hardhat-deploy 는 이 밖에도 library linking, proxy deploy, deploy function tag 등을 제공한다.
왜 읽나Hardhat 으로 스마트 컨트랙트를 배포하며 스크립트와 verify 를 손으로 돌리던 개발자에게 hardhat-deploy 와 typechain 조합의 설정 흐름을 짚어주는 실습 가이드.