Token To Token Swap 구현
시나리오
1. 스왑을 도와줄 Factory 컨트랙트(Pool들을 관리한다)
- Factory 배포
2. 스왑을 위한 2개의 ERC20 토큰 컨트랙트 생성
- A Token 컨트랙트 배포(100개 토큰)
- B Token 컨트랙트 배포(100개 토큰)
3. 각각의 Pool 구성
- A Token - Liquidity 컨트랙트 배포
- 1번에서 배포한 Factory 컨트랙트의 createPool(2번에서 배포한 A Token 컨트랙트) 함수를 이용해 배포한다.
- B Token - Liquidity 컨트랙트 배포
- 1번에서 배포한 Factory 컨트랙트의 createPool(2번에서 배포한 B Token 컨트랙트) 함수를 이용해 배포한다.
4. 3번에서 배포한 Liquidity 컨트랙트 가져오기
- Factory 컨트랙트의 getLiquidity(A 토큰 Address)를 이용해 A토큰과 페어로 생성된 Liquidity 컨트랙트 주소를 가져온다
- Factory 컨트랙트의 getLiquidity(A 토큰 Address)를 이용해 B토큰과 페어로 생성된 Liquidity 컨트랙트 주소를 가져온다
5. 가져온 Liquidity 컨트랙트 주소를 사용해 해당 컨트랙트를 불러온다.
6. Liquidity Pool이 토큰을 가져갈 수 있도록 Approve 진행
- A Token 컨트랙트에서 A/Liquidity가 토큰을 가져갈 수 있도록 Approve 진행(50개)
- B Token 컨트랙트에서 B/Liquidity가 토큰을 가져갈 수 있도록 Approve 진행(50개)
7. 각 풀에 유동성 공급
- A Pool = 30토큰 /30이더 → 10개를 사용자에게서 가져온다. BPool에 보낼때는 7.5개
- B Polol = 40토큰 /10이더
8. 임의 풀에서 Token To Token 진행
-
최소 7.5개..
-
10개
-
y : 30토큰
-
x : 30이더
-
30 * 10 = 300
-
30 + 10 = 40
Token To Coin
시나리오
1. Factory 컨트랙트 배포
2. WEMEX Token 컨트랙트 배포
3. Factory 컨트랙트를 통해 WEMEX Pool 생성
4. WEMEX Pool에 유동성 공급(50토큰/30이더)
- WEMEX 토큰 컨트랙트 - Approve()
- WEMEX Pool 컨트랙트 - addLiquidity()
5. 10개 토큰 스왑 요청
- WEMEX 토큰 컨트랙트 - Approve()
tokenAmount : 10개
x : 50토큰
y : 30이더
받아야할 이더 = 30이더 x 10 / 50 토큰 +10
= 5개
Coin To Token
시나리오
1. Factory 컨트랙트 배포
2. WEMEX Token 컨트랙트 배포
3. Factory 컨트랙트를 통해 WEMEX Pool 생성
4.WEMEX Pool에 유동성 공급(50토큰/30이더)
- WEMEX 토큰 컨트랙트 - Approve()
- WEMEX Pool 컨트랙트 - addLiquidity()
5. 10개 이더 스왑 요청하기
- WEMEX 토큰 컨트랙트 - Approve()
coinAmount : 10개
x : 30이더
y : 50토큰
받아야할 토큰 = 50 * 10 / 30 + 10
12.5개
블록 탐색기, 모니터, 트레킹등 서비스에서 DB를 사용하여 블록 및 트랜잭션 정보를 저장하는 이유
RPC 병목 현상 방지
- 요구사항 : 사용자가 단순히 Block의 Height를 알고 싶어한다
- 서버가 DB에 블록의 정보를 가지고 있지 않으면 사용자에게 요청을 받았을 때마다 매번 블록체인 노드에 쿼리를 날려야한다.
- 단순 1회인 경우 상관없지만 많은 사용자가 동시에 요청할 경우 일시적으로 큐에 많은 요청이 전달되어 노드에 병목 현상이 나타난다
- 이는 노드의 과부하 발생 → 늦은 처리량
힘들었던 점
- emit, event를 잘쓰지 못하여 테스트하는데 어려웠다.
→ 날 잡아 정리해야겠다.
- Interface로 구현한 함수 사용
- 시나리오를 완벽히 이해하지 못한채로 테스트를 진행하다 보니 계속된 에러 발생
- 짧은 시간인 일주일간 디파이 프로젝트를 진행하다보니 uniswap v1을 레퍼런스로 코드를 작성하였다. 최대한 단순한 버전이라 생각하였음
- 해당 과정에서 솔리디티 코드에 대한 이해
- 컨트랙트간 상호 작용하는 법에 대한 이해
- js를 통한 테스트 코드 작성으로 web3 패키지도 뜯어볼 수 있었다
- 커스터마이징하며 솔리디티 언어 자체에 대한 이해도 생긴것 같다.
Github source