ERC-7575 멀티 자산 ERC-4626 금고 (Multi-Asset ERC-4626 Vaults)

Final · 금고·DeFi · 2023-12-11 작성

하나의 지분 토큰에 여러 자산 입구를 연결할 수 있도록 ERC-4626을 확장한 금고 표준입니다. 금고와 지분 토큰을 분리해 두 외부 토큰 사이를 변환하는 금고도 만들 수 있습니다.

왜 필요한가

ERC-4626 표준은 금고(Vault) 컨트랙트 자신이 지분을 나타내는 ERC-20 토큰이어야 한다고 요구합니다. 그래서 자산 하나에 금고 하나가 짝이 되는 구조만 자연스럽게 지원됩니다. 유동성 공급자(liquidity provider, LP) 토큰처럼 여러 자산이나 여러 입구를 가진 금고를 만들려면 금고마다 별도의 지분 토큰이 생겨 다루기 불편해지거나, 아예 표준을 지킬 수 없게 됩니다. 이미 배포되어 있는 토큰을 지분으로 쓰거나, 서로 다른 두 외부 토큰 사이를 변환해 주는 컨트랙트를 ERC-4626 모양으로 만드는 것도 어렵습니다. ERC-7575는 금고에서 ERC-20 기능을 떼어 내고 지분 토큰의 주소를 알려 주는 share 메서드를 추가해서 이런 구조를 표준 안으로 끌어들입니다.

심층 설명

ERC-4626에서 ERC-20 부분만 뗀 금고

ERC-7575 금고는 ERC-4626을 반드시 구현하되, 그중 ERC-20에 해당하는 메서드와 이벤트는 구현하지 않습니다. 입출금과 환산을 다루는 ERC-4626의 나머지 기능은 그대로 두고 금고 자신이 지분 토큰이어야 한다는 요구만 없앤 것입니다. 대신 새로 추가된 view 함수 share가 입금 시 받게 되는 ERC-20 지분 토큰의 주소를 알려 줍니다. share는 금고 자신의 주소를 돌려줘도 되므로, 기존 ERC-4626 금고는 메서드 하나만 추가하면 이 표준을 따를 수 있습니다.

share 메서드의 의무 사항

share는 어떤 경우에도 revert하면 안 됩니다. 지분이 금고 밖의 별도 토큰이면(share != address(this)) 입장 함수는 receiver의 지분 잔액을 shares만큼 늘려야 하고(share.balanceOf(receiver) += shares), 퇴장 함수는 owner의 지분 잔액을 shares만큼 줄여야 합니다(share.balanceOf(owner) -= shares). 이 규칙 덕분에 지분 회계가 금고 바깥의 토큰에 있어도 입출금 결과는 ERC-4626과 같은 방식으로 나타납니다.

멀티 자산 금고의 구조

멀티 자산 금고는 서로 다른 asset으로 표시된 여러 입구가 하나의 share 토큰을 공유하는 구조입니다. 원문은 이를 특정 자산의 입구 역할을 하는 ERC-7575 컨트랙트들이 공통 share 토큰 하나에 연결된 묶음으로 정의합니다. 각 입구는 share 메서드를 반드시 구현해야 하고 입구 자체는 ERC-20이 아닌 것이 권장됩니다. 참조 구현에서는 TokenAVault와 TokenBVault가 각자 asset은 다르지만 같은 Share 컨트랙트 주소를 share로 돌려주는 모습을 보여 줍니다.

파이프: 두 외부 토큰 사이의 변환기

파이프는 금고 밖에 있는 ERC-20 토큰인 asset과 share 사이를 변환하는 금고로, 한 방향 또는 양방향일 수 있습니다. 한 방향 파이프는 입장 함수인 deposit이나 mint만 구현하고 redeem이나 withdraw는 구현하지 않는 것이 권장됩니다. 입장 시에는 msg.sender의 asset을 잠그거나 소각하고 receiver에게 share를 발행하거나 전송하는 것이 권장되며, 양방향 파이프의 퇴장 시에는 owner의 share를 잠그거나 소각하고 receiver에게 asset을 발행하거나 전송하는 것이 권장됩니다.

지분에서 금고를 찾는 vault 조회

share 토큰의 ERC-20 구현은 asset 주소를 받아 그 자산을 다루는 금고 주소를 돌려주는 vault 메서드를 구현하는 것이 권장됩니다. 지분에 연결된 금고가 바뀌면 VaultUpdate 이벤트를 내보내는 것이 권장됩니다. 이 조회 기능은 통합 서비스가 멀티 자산 금고를 쉽게 탐색하도록 돕지만 이미 배포되어 있는 기존 컨트랙트를 share로 쓰는 경우와의 호환을 위해 의무가 아닌 선택 사항으로 남겨 두었습니다.

ERC-165로 서로를 식별

ERC-7575 금고는 ERC-165의 supportsInterface 함수를 반드시 구현해야 하고 interfaceID로 0x2f0a18c5가 들어오면 true를 돌려줘야 합니다. share 컨트랙트는 supportsInterface 구현이 권장되며 구현했다면 0xf815c03d에 대해 true를 돌려줘야 합니다. 통합하는 쪽은 이 값으로 어떤 컨트랙트가 ERC-7575 금고이고 어떤 토큰이 그 지분인지 코드를 읽지 않고도 확인할 수 있습니다.

ERC-4626과 완전히 호환되지는 않음

ERC-20 기능이 제거되었기 때문에 ERC-7575 금고는 ERC-4626과 완전하게 호환되지는 않습니다. 지분 토큰이 금고와 분리된 경우 기존 ERC-4626을 기대하는 통합 코드는 금고 주소에서 바로 지분 잔액이나 전송을 다룰 수 없고 share가 알려 주는 토큰 주소를 거쳐야 합니다. 반대로 share가 금고 자신을 가리키게 구현하면 기존 ERC-4626 금고도 쉽게 이 표준을 따를 수 있습니다. 이 표준의 상태는 Final로 확정되어 있습니다.

쓸 때 주의할 점

ERC 원문 · ← ERCs