팀 프로젝트를 진행하면서 나의 역할은 Uniswap 풀에 초기 유동성을 제공한 사용자가 LP Token을 프로젝트에 다시 스테이킹할 경우, 보상을 지급하는 시스템을 구축하는 것이었다. 테스트를 위해 Hardhat의 로컬 환경을 활용하였다. 이 과정에서 Uniswap의 스마트 컨트랙트와 내가 직접 작성한 Staking Contract를 사용했고, Hardhat에서는 Ethers.js를 활용하였다.
문제 해결 방법을 설명하기 전에, 이번 프로젝트에서 사용된 Uniswap V2 코드에 대해 간략하게 요약해보았다. (V2 외 다른 버전에 대한 설명은 유니스왑 기초에서 확인할 수 있다.)
Uniswap V2 코드는 Uniswap/v2-core와 Uniswap/v2-periphery가 주로 사용된다.
프로젝트에서 활용한 주요 코드는 다음과 같으며, 이는 Uniswap V2에서 가장 중요한 스마트 컨트랙트들이다:
이들 코드의 상호작용은 아래의 다이어그램으로 시각화할 수 있다.

Hardhat은 이더리움 개발 환경에서 매우 강력한 도구이지만, Uniswap과 같은 복잡한 dApp, 특히 유동성 제공자(LP) 스테이킹 컨트랙트를 테스트할 때 몇 가지 어려움을 겪을 수 있다. 이 글에서는 그러한 문제들과 해결 방법을 다루고자 한다.
INIT_CODE_PAIR_HASH 문제Uniswap의 페어를 생성할 때, INIT_CODE_PAIR_HASH 값이 정확하지 않으면 페어 생성과 관련된 함수 호출이 실패할 수 있다. 이 값은 UniswapV2Factory 컨트랙트에서 사용된다.
Uniswap을 포크하거나 컨트랙트를 커스터마이징한 경우, INIT_CODE_PAIR_HASH 값이 변경될 수 있다. 이 값은 UniswapV2Library.sol에서 페어 주소를 계산할 때 필요하다.
INIT_CODE_PAIR_HASH 값을 확인하고, 필요 시 업데이트해야 한다. 다음과 같이 UniswapV2Factory의 INIT_CODE_PAIR_HASH 값을 출력하여 올바른 값을 사용하고 있는지 확인한다:
console.log("Factory Init Code: ", await uniswapFactory.INIT_CODE_PAIR_HASH());
이 값을 UniswapV2Library.sol의 pairFor 함수에서 사용되는 해시 값과 일치시켜야 한다.