메인 콘텐츠로 건너뛰기

개요

Stable SDK의 x/bank 모듈은 기본적인 토큰 관리 기능만 제공합니다. 모든 토큰은 제한 없이 다른 계정으로 전송될 수 있으며, 사용자는 다른 계정에 토큰 전송 권한을 위임할 수 없습니다. 이러한 이유로, bank precompile 컨트랙트는 Stable SDK의 기존 x/bank 모듈 위에 추가적인 권한 부여 및 위임 기능을 제공합니다.

목차

  1. 개념
  2. 설정
  3. 메서드
  4. 이벤트

개념

이 precompile 컨트랙트는 ERC20 표준 메서드를 제공합니다 - 전송을 위한 transferbalanceOf, 위임을 위한 transferFrom, approve, allowance 등이 있습니다. 이러한 메서드는 컨트랙트 주소 등록 없이 직접 호출할 수 있습니다. 그러나 mintburn 메서드는 x/precompile 모듈에 의해 등록된 컨트랙트 주소가 화이트리스트에 포함되어야 합니다.
func (p *Precompile) mint(
  ctx sdk.Context,
  contract *vm.Contract,
  denom string,
  method *abi.Method,
  stateDB vm.StateDB,
  args []interface{},
) ([]byte, error) {
  // ...

  // mint method is only allowed for the registered caller contract
  if _, err := precompilecommon.CheckPermissions(ctx, p.precompileKeeper, contract.CallerAddress, CallerPermissions); err != nil {
    return nil, err
  }
추가적인 검증 프로세스는 이 precompile 컨트랙트를 호출하는 토큰 컨트랙트가 승인되었음을 보장할 수 있습니다. 토큰 컨트랙트 주소와 해당 denom을 x/precompile 모듈의 화이트리스트에 등록하려면 거버넌스 제안이 필요합니다.

설정

컨트랙트 주소와 가스 비용은 사전 정의되어 있습니다.

컨트랙트 주소

  • “0x0000000000000000000000000000000000001000” - 가스 토큰
  • “0x0000000000000000000000000000000000001003” - 거버넌스 토큰

메서드

mint

요청된 수량의 새로운 토큰을 발행하고 계정으로 전송합니다. 발행할 토큰의 수량은 0보다 커야 합니다. 토큰이 성공적으로 발행되고 계정으로 전송되면 PrecompiledBankMint가 발생합니다. 주의사항:
  • 거버넌스 토큰 발행은 금지되어 있습니다.
  • mint 메서드를 호출하는 컨트랙트는 x/precompile 모듈에 등록되어 있어야 합니다.

입력

이름타입설명
toaddress발행된 토큰을 받을 주소
amountuint256발행할 토큰의 수량

출력

이름타입설명
successbool토큰이 성공적으로 발행되고 계정으로 전송되면 true

burn

계정에서 요청된 수량의 토큰을 소각합니다. 소각할 토큰의 수량은 0보다 커야 합니다. 토큰이 성공적으로 소각되면 PrecompiledBankBurn이 발생합니다. 주의사항:
  • 거버넌스 토큰 소각은 금지되어 있습니다.
  • mint 메서드를 호출하는 컨트랙트는 x/precompile 모듈에 등록되어 있어야 합니다.

입력

이름타입설명
fromaddress토큰을 소각할 주소
amountuint256소각할 토큰의 수량

출력

이름타입설명
successbool토큰이 성공적으로 소각되면 true

transfer

발신자로부터 수신자에게 요청된 수량의 토큰을 전송합니다. 토큰은 전송 가능하도록 설정되어 있어야 합니다. 전송할 토큰의 수량은 0보다 커야 합니다. 토큰이 성공적으로 전송되면 PrecompiledBankTransfer가 발생합니다.

입력

이름타입설명
toaddress토큰을 받을 주소
amountuint256전송할 토큰의 수량

출력

이름타입설명
successbool토큰이 성공적으로 전송되면 true

transferFrom

승인된 spender가 allowance 한도 내에서 소유자로부터 수신자에게 요청된 수량의 토큰을 전송합니다. 토큰은 전송 가능하도록 설정되어 있어야 합니다. 전송할 토큰의 수량은 0보다 크고 현재 allowance보다 작거나 같아야 합니다. 토큰이 성공적으로 전송되면 PrecompiledBankTransfer가 발생합니다.

입력

이름타입설명
fromaddress토큰을 전송할 주소
toaddress토큰을 받을 주소
amountuint256전송할 토큰의 수량

출력

이름타입설명
successbool토큰이 성공적으로 전송되면 true

multiTransfer

단일 계정에서 여러 계정으로 토큰을 전송합니다. 토큰은 전송 가능하도록 설정되어 있어야 합니다. 각 수신자에게 전송할 토큰의 수량은 0보다 커야 합니다. 토큰이 성공적으로 전송되면 각 수신자마다 PrecompiledBankTransfer가 발생합니다.

입력

이름타입설명
toaddress[]전송된 토큰을 받을 주소들
amountuint256[]각 수신자에게 전송할 토큰의 수량

출력

이름타입설명
successbool모든 수신자에게 토큰이 성공적으로 전송되면 true

approve

spender가 소유자의 계정에서 토큰을 전송할 수 있도록 승인합니다. 승인할 토큰의 수량은 0보다 커야 합니다. 승인이 성공적으로 설정되면 PrecompiledBankApproval이 발생합니다.

입력

이름타입설명
spenderaddress승인할 주소
valueuint256승인할 토큰의 수량

출력

이름타입설명
successbool승인이 성공적으로 설정되면 true

revoke

소유자로부터 토큰을 전송할 수 있는 spender의 승인을 취소합니다. 승인이 성공적으로 취소되면 PrecompiledBankRevoke가 발생합니다.

입력

이름타입설명
spenderaddress취소할 주소

출력

이름타입설명
successbool승인이 성공적으로 취소되면 true

balanceOf

계정의 토큰 잔액을 반환합니다.

입력

이름타입설명
accountaddress토큰 잔액을 조회할 주소

출력

이름타입설명
balanceuint256계정의 토큰 수량

totalSupply

토큰의 총 공급량을 반환합니다.

입력

없음

출력

이름타입설명
totalSupplyuint256토큰의 총 수량

allowance

spender가 owner로부터 여전히 인출할 수 있는 수량을 반환합니다.

입력

이름타입설명
owneraddress소유자의 주소
spenderaddressspender의 주소

출력

이름타입설명
amountuint256승인된 토큰의 수량

이벤트

이 precompile 컨트랙트에서 발생하는 모든 이벤트는 PrecompiledBank 접두사가 붙습니다. 모호함을 피하기 위해, 이 precompile 컨트랙트를 호출하는 토큰 컨트랙트는 동일한 접두사를 가진 이벤트 이름 사용을 피해야 합니다.

PrecompiledBankMint

이름타입인덱싱설명
fromaddressY토큰을 발행한 주소
toaddressY발행된 토큰을 받을 주소
amountuint256N발행된 토큰의 수량

PrecompiledBankBurn

이름타입인덱싱설명
fromaddressY토큰을 소각한 주소
toaddressY이 메서드에서는 사용되지 않음
amountuint256N소각된 토큰의 수량

PrecompiledBankTransfer

이름타입인덱싱설명
fromaddressY토큰을 전송한 주소
toaddressY전송된 토큰을 받을 주소
amountuint256N전송된 토큰의 수량

PrecompiledBankApproval

이름타입인덱싱설명
owneraddressY토큰을 승인한 주소
spenderaddressY승인할 주소
valueuint256N승인된 토큰의 수량

PrecompiledBankRevoke

이름타입인덱싱설명
owneraddressY토큰을 취소한 주소
spenderaddressY취소할 주소
valueuint256N승인된 토큰의 수량