컨트랙트
Duel은 Robinhood Chain의 Uniswap V4 배포 위에 만들어진 여섯 개의 컨트랙트로, 그중 다섯 개는 Robinhood Chain에 배포되고 하나는 배포되지 않습니다. Solidity 0.8.26, Foundry, OpenZeppelin, v4-core를 사용합니다. 대결은 체인 위에 있습니다. 앱은 사이트 서버를 통해 또는 직접 체인을 읽고, 대결의 기록은 체인 이벤트를 색인하는 인덱서에서 읽습니다.
| 컨트랙트 | 역할 |
|---|---|
DuelFactory | 트랜잭션 한 번으로 대결을 런칭합니다. 두 토큰, 세 개의 풀, 잠긴 포지션, 크리에이터의 런칭 매수. 앞으로의 대결에 적용될, 한도가 정해진 설정을 소유합니다. 런칭은 런칭하는 사람이 읽은 설정(configHash)에 묶이며, 그사이 다른 설정이 적용되면 실패합니다. |
DuelHook | 모든 대결의 세 풀이 공유하는 Uniswap V4 훅입니다. 수수료, 안티 스나이프 세금, 전환 소각, 재정렬, 비율 평균, 라운드와 바이백, 그리고 대결마다의 팟, 크리에이터 수수료, 프로토콜 수수료를 담당합니다. |
DuelToken | 모든 진영의 평범한 ERC-20입니다. 10억 개, 소각 가능, 소유자 없음, permit(EIP-2612) 지원. |
DuelRouter | 앱이 거래할 때 쓰는 정확한 입력량 라우터로, 매도의 permit도 함께 받습니다. ETH 풀이 매도를 한 번에 받아 주지 못할 때 한 진영을 여러 번에 나눠 팔고(SALE_PASSES), 그래도 그 풀이 되사지 못하는 만큼을 다른 진영을 거쳐 파는(sell) 것은 이 라우터뿐입니다. 어떤 V4 라우터든 스왑 한 번으로 똑같이 쓸 수 있습니다. |
DuelLens | 앱을 위해 대결의 상태를 모아 주는 읽기 전용 뷰입니다. |
DuelSimulator | 배포되지 않습니다. 앱이 읽기 전용 호출 한 번 동안 이 코드를 사용자의 주소에 올려(state override), 사용자가 보낼 때와 똑같이 거래를 실행해 보고, 받게 될 양과 풀 재정렬 후 비율이 어디에 닿을지를 알려 줍니다. |
버전
이 런치패드는 코드명 Petunia인 Duel V1입니다. 모든 컨트랙트가 이를 알려 주고(팩토리, 훅, 라우터, 렌즈의 VERSION()과 CODENAME()), 이 런치패드로 런칭한 토큰은 모두 이 정보를 영구히 간직합니다(LAUNCHPAD_VERSION()과 LAUNCHPAD_CODENAME()). 대결의 정보 섹션은 토큰에 기록된 대로 이를 보여 줍니다. 나중에 따로 배포하는 런치패드는 다음 번호와 자체 코드명을 쓰고, 그 토큰은 그 정보를 간직하게 됩니다.
주소
| 컨트랙트 | Robinhood Chain 주소 |
|---|---|
DuelFactory | 0x3c6e7f9Bc507a442237AF1721B2294686495BD54 |
DuelHook | 0x5F746B7B1722e9bb3849EEa97061Df50F715AAEc |
DuelRouter | 0x9e484C17E7d263F084Ab226a72FCdf301145d6D1 |
DuelLens | 0x1677d3C0a1F9Ae00519AD08C68674f63fe945389 |
Duel은 다음 Robinhood Chain 컨트랙트에 의존합니다.
| Uniswap V4 PoolManager | 0x8366a39CC670B4001A1121B8F6A443A643e40951 |
| Universal Router (메인넷) | 0x204FAca1764B154221e35c0d20aBb3c525710498 |
| V4 Quoter | 0x8Dc178eFB8111BB0973Dd9d722ebeFF267c98F94 |
| Permit2 | 0x000000000022D473030F116dDEE9F6B43aC78BA3 |
훅
V4 훅의 주소에는 구현한 콜백 목록이 담겨 있습니다. Duel의 훅은 다음 콜백을 씁니다.
| 콜백 | 하는 일 |
|---|---|
beforeInitialize | 훅 위에 풀을 열 수 있는 것은 팩토리뿐이며, 등록된 대결의 풀만 가능합니다. |
beforeAddLiquidity | 유동성을 더할 수 있는 것은 런칭 때의 팩토리뿐입니다. |
beforeRemoveLiquidity | 항상 되돌립니다. 유동성은 영구히 잠겨 있습니다. |
beforeDonate | 항상 되돌립니다. |
beforeSwap | 끝난 라운드를 정산하고, 평균을 갱신하고, 수수료와 세금을 받습니다. |
afterSwap | 스왑이 지정하지 않은 쪽 금액에 붙는 수수료를 받고, 미리 수수료를 낸 스왑이 전부 체결되었는지 확인한 뒤, 세 풀을 재정렬합니다. |
수수료는 훅의 return delta로 받으므로, 누가 스왑을 라우팅하든 적용됩니다.
누가 무엇을 할 수 있나
| 주체 | 할 수 있는 일 |
|---|---|
| 누구나 | 런칭, 거래, 끝난 라운드 정산, 크리에이터 또는 재무 청구 실행, 48시간이 지난 제안된 조건 적용 |
| 대결 크리에이터 | 해당 대결의 크리에이터 수수료 수령, 수락하는 주소에 수수료와 함께 역할 넘기기 |
| 팩토리 소유자 | 새 런칭 일시 중지, 48시간 뒤 앞으로의 대결에 한도 안의 조건 적용 또는 프로토콜 재무 주소 변경. 누적 프로토콜 수수료는 청구 시 현재 재무 주소로 지급됨. 모든 대결의 스왑 수수료에서 프로토콜 몫을 즉시 낮추거나 다시 올리기(조건을 넘을 수는 없음). |
| 누구도 | 유동성 인출, 토큰 민팅, 팟 이동, 기존 대결에서 트레이더가 내는 수수료나 크리에이터 몫 변경, 프로토콜 몫을 대결의 조건보다 높이기, 대결의 크리에이터 역할 빼앗기, 컨트랙트 업그레이드 |
더 보기
- 보안: 자금을 지키는 장치와 검증 방법.
- Duel 위에서 개발하기: 내 코드에서 대결을 읽고 거래하기.