ERC-7291 목적구속형 화폐(PBM) (Purpose bound money)

Final · 토큰 · 2023-06-24 작성

스테이블코인 같은 디지털 화폐를 ERC-1155 래퍼로 감싸, 정해진 조건을 채우고 지정된 가맹점에 전달될 때만 원래 화폐로 풀리는 '목적이 정해진 돈'을 만드는 표준입니다.

왜 필요한가

정부 바우처나 교육비 지원금처럼 '정해진 곳에서만 쓸 수 있는 돈'을 디지털로 만들려면, 돈 자체에 사용 조건을 심는 프로그래머블 머니와 조건 충족 시 자동으로 지급되는 프로그래머블 페이먼트가 모두 필요합니다. 표준이 없으면 발행 주체마다 서로 다른 방식으로 구현해 기술이 파편화되고 지갑과 결제 시스템 간 호환이 되지 않아 각자의 닫힌 생태계(walled garden)가 생깁니다. 새로 진입하는 사업자는 기존 시스템과 연동하기 어려워 비용이 커지고 결국 이용자는 비싸고 불편한 서비스를 쓰게 됩니다. 이 표준은 PBM 명세를 공개 표준으로 만들어 플랫폼, 지갑, 결제 레일 간 상호운용성을 확보하고 진입 장벽을 낮추는 것을 목표로 합니다.

구현해야 하는 것

심층 설명

PBM의 구성: sovToken과 PBM 래퍼

유효한 PBM 토큰은 기초 sovToken과 PBM 래퍼로 구성되어야 합니다(MUST). sovToken은 ERC-20 또는 ERC-20 호환 토큰(ERC-777, ERC-1363 등)으로, 가치 저장 수단 역할을 합니다. PBM 래퍼는 ERC-1155 호환 컨트랙트로, 언래핑 전에 충족해야 할 조건을 담습니다. 래핑은 PBM 생성 시점에 할 수도 있고 나중에 할 수도 있습니다. 완전히 언래핑되어 사용된 PBM 토큰은 반드시 소각되어야 하며(MUST), 만료 시각은 PBM 생성자가 정하되 만료가 필요 없으면 type(uint256).max로 설정하는 것이 권장됩니다(SHOULD). 하나의 PBM 래퍼는 여러 종류의 sovToken을 래핑할 수 있어야 합니다(SHOULD).

화이트리스트와 블랙리스트 검증

PBM 래퍼는 기초 sovToken을 언래핑하기 전에 목적지 주소가 가맹점·수취인 화이트리스트에 있고 차단 블랙리스트에는 없는지 반드시 확인해야 합니다(MUST). 화이트리스트는 PBM이 목적구속형이기 위한 필수 요건이고 블랙리스트는 계정 재등록, 정지, 법 집행 등의 사유로 차단된 주소를 배제하기 위해 필요합니다. 화이트리스트만 쓰면 한 명을 차단할 때마다 목록 전체를 다시 배포해야 해서 가스 비용이 비효율적이고 블랙리스트만 쓰면 배제할 모든 주소를 관리해야 해서 비현실적이므로 둘 다 요구합니다. 이 검증은 PBM 래퍼 안에 구현하거나 별도의 컴플라이언스 가드 컨트랙트로 분리할 수 있습니다.

모듈형 아키텍처: 코어, 플러그인, 훅

제안된 PBM 아키텍처는 세 부분으로 나뉩니다. 코어 컴포넌트는 모든 PBM이 가져야 할 기본 기능(가맹점 화이트리스트 로직, 화이트리스트 주소 전송 시 언래핑, 발행·소각, 토큰 등록·조회를 맡는 토큰 매니저)을 담습니다. 플러그인 컴포넌트는 특정 PBM만 필요로 하는 추가 기능(외부 API 호출로 조건 검증, 사용 패턴 추적 등)을 구현합니다. 훅 컴포넌트는 일부 PBM에만 적용되는 추가 검증(만료 확인, 일일 지출 한도 등)을 구현합니다. 예를 들어 같은 래퍼와 sovToken을 쓰면서 A 시리즈에만 '슈퍼마켓 지출 50% 제한' 플러그인과 훅을 등록하는 식으로 재사용성을 높일 수 있습니다.

토큰 상세 정보와 PBMToken 구조체

ERC-1155의 토큰 ID마다 고유한 PBM 유형을 정의하며, 각 유형은 필수 필드로 name(이름), faceValue(기초 sovToken 기준 액면가), expiry(유닉스 시각 기준 만료), uri(ERC-1155 표시용 메타데이터 URI)를 가져야 합니다(MUST). 한번 정의된 토큰 상세는 불변이어야 합니다(MUST). 선택 확장 구조체 PBMTokenExt에는 isTransferable, burnable, decimals, creator, tokenAddress, totalSupply, currencySymbol, tokenSymbol 같은 필드를 둘 수 있습니다. 토큰 유형 생성 시 NewPBMTypeCreated 이벤트를 발생시켜야 하고(SHOULD), getTokenDetails로 상세를 조회하는 메서드를 반드시 제공해야 합니다(MUST).

기본 인터페이스 IPBMRC1의 수명주기

IPBMRC1은 IERC173(소유권)과 IERC5679Ext1155(발행·소각)를 상속합니다. safeMint와 safeMintBatch는 호출자의 sovToken을 컨트랙트로 가져와 래핑하며 사전에 ERC-20 approve가 필요하고 TokenWrap 이벤트를 발생시켜야 합니다(MUST). 또한 컨트랙트가 일시정지 상태가 아니고 토큰이 만료되지 않았고 수신자가 블랙리스트에 없어야 합니다. 내부 함수 unwrap은 조건 충족 시 기초 토큰을 가맹점에 전달하고 TokenUnwrapForTarget 이벤트를 발생시킵니다(MUST). revokePBM은 토큰 유형 생성자나 컨트랙트 소유자만 호출할 수 있으며 잠긴 sovToken을 회수하고 PBMrevokeWithdraw 이벤트를 발생시킵니다(MUST). 전송은 송신자가 시작하는 푸시 모델을 따르며 언래핑 로직을 ERC-1155 safeTransfer 계열 함수에 심을 수 있습니다.

확장: 수신 콜백과 선적립 없는 PBM(PBMRC2)

언래핑 알림을 받으려는 수신 컨트랙트는 PBMRC1_TokenReceiver 인터페이스의 onPBMRC1Unwrap과 onPBMRC1BatchUnwrap을 모두 구현하고 ERC-165 supportsInterface로 지원을 표시해야 합니다. 이 콜백은 unwrap 함수의 맨 끝에서만 호출되어야 합니다(MUST). 선택 확장인 PBMRC2(Non Preloaded PBM)는 발행 시점이 아니라 나중에 sovToken을 채워 넣는 방식입니다. PBM을 빈 용기로 먼저 발행한 뒤 load로 sovToken을 넣고(TokenLoad 이벤트), underlyingBalanceOf로 잔액을 조회하며 unload로 본인이 넣은 만큼을 다시 꺼낼 수 있습니다(TokenUnload 이벤트).

왜 sovToken은 ERC-20, 래퍼는 ERC-1155인가

PBM은 돈의 기능을 해야 하므로 가치가 안정적인 대체가능 토큰이어야 하는데, 시장의 주요 스테이블코인이 ERC-20 기반이고 지갑·디파이 앱 지원도 가장 넓어 sovToken은 ERC-20 호환이어야 합니다. ERC-721은 대체불가 토큰이라 돈의 기능에 맞지 않고, ERC-1155 스테이블코인은 시장에 드물어 제외했습니다. 래퍼를 ERC-1155로 한 이유는 하나의 컨트랙트로 액면가, 만료, 비즈니스 로직이 다른 여러 토큰을 발행할 수 있고 배치 전송으로 대량 지급 시 가스를 아낄 수 있으며 만료 후 수집품으로 전환할 수 있는 준대체가능 토큰을 지원하고 기존 지갑 UI에서 바로 표시되기 때문입니다.

쓸 때 주의할 점

ERC 원문 · ← ERCs