> ## Documentation Index
> Fetch the complete documentation index at: https://stablelabs.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Bank

> Stable에서 ERC-20 호환 토큰 전송, 위임, 승인 기능을 제공하는 Bank 프리컴파일.

## 개요

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

## 목차

1. **[개념](#concepts)**
2. **[설정](#configuration)**
3. **[메서드](#methods)**
4. **[이벤트](#events)**

## 개념

이 precompile 컨트랙트는 ERC20 표준 메서드를 제공합니다 - 전송을 위한 `transfer`와 `balanceOf`, 위임을 위한 `transferFrom`, `approve`, `allowance` 등이 있습니다. 이러한 메서드는 컨트랙트 주소 등록 없이 직접 호출할 수 있습니다.

그러나 `mint`와 `burn` 메서드는 `x/precompile` 모듈에 의해 등록된 컨트랙트 주소가 화이트리스트에 포함되어야 합니다.

```go theme={"dark"}
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` 모듈의 화이트리스트에 등록하려면 거버넌스 제안이 필요합니다.

## 설정

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

### 컨트랙트 주소

* `0x0000000000000000000000000000000000001003` - STABLE (거버넌스 토큰)

## 메서드

### `mint`

요청된 수량의 새로운 토큰을 발행하고 계정으로 전송합니다.
발행할 토큰의 수량은 0보다 커야 합니다.

토큰이 성공적으로 발행되고 계정으로 전송되면 `PrecompiledBankMint`가 발생합니다.

주의사항:

* 거버넌스 토큰 발행은 금지되어 있습니다.
* mint 메서드를 호출하는 컨트랙트는 x/precompile 모듈에 등록되어 있어야 합니다.

#### 입력

| 이름     | 타입      | 설명            |
| ------ | ------- | ------------- |
| to     | address | 발행된 토큰을 받을 주소 |
| amount | uint256 | 발행할 토큰의 수량    |

#### 출력

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

### `burn`

계정에서 요청된 수량의 토큰을 소각합니다.
소각할 토큰의 수량은 0보다 커야 합니다.

토큰이 성공적으로 소각되면 `PrecompiledBankBurn`이 발생합니다.

주의사항:

* 거버넌스 토큰 소각은 금지되어 있습니다.
* mint 메서드를 호출하는 컨트랙트는 x/precompile 모듈에 등록되어 있어야 합니다.

#### 입력

| 이름     | 타입      | 설명         |
| ------ | ------- | ---------- |
| from   | address | 토큰을 소각할 주소 |
| amount | uint256 | 소각할 토큰의 수량 |

#### 출력

| 이름      | 타입   | 설명                  |
| ------- | ---- | ------------------- |
| success | bool | 토큰이 성공적으로 소각되면 true |

### `transfer`

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

토큰이 성공적으로 전송되면 `PrecompiledBankTransfer`가 발생합니다.

#### 입력

| 이름     | 타입      | 설명         |
| ------ | ------- | ---------- |
| to     | address | 토큰을 받을 주소  |
| amount | uint256 | 전송할 토큰의 수량 |

#### 출력

| 이름      | 타입   | 설명                  |
| ------- | ---- | ------------------- |
| success | bool | 토큰이 성공적으로 전송되면 true |

### `transferFrom`

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

토큰이 성공적으로 전송되면 `PrecompiledBankTransfer`가 발생합니다.

#### 입력

| 이름     | 타입      | 설명         |
| ------ | ------- | ---------- |
| from   | address | 토큰을 전송할 주소 |
| to     | address | 토큰을 받을 주소  |
| amount | uint256 | 전송할 토큰의 수량 |

#### 출력

| 이름      | 타입   | 설명                  |
| ------- | ---- | ------------------- |
| success | bool | 토큰이 성공적으로 전송되면 true |

### `multiTransfer`

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

토큰이 성공적으로 전송되면 각 수신자마다 `PrecompiledBankTransfer`가 발생합니다.

#### 입력

| 이름     | 타입         | 설명                 |
| ------ | ---------- | ------------------ |
| to     | address\[] | 전송된 토큰을 받을 주소들     |
| amount | uint256\[] | 각 수신자에게 전송할 토큰의 수량 |

#### 출력

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

### `approve`

spender가 소유자의 계정에서 토큰을 전송할 수 있도록 승인합니다.
승인할 토큰의 수량은 0보다 커야 합니다.

승인이 성공적으로 설정되면 `PrecompiledBankApproval`이 발생합니다.

#### 입력

| 이름      | 타입      | 설명         |
| ------- | ------- | ---------- |
| spender | address | 승인할 주소     |
| value   | uint256 | 승인할 토큰의 수량 |

#### 출력

| 이름      | 타입   | 설명                  |
| ------- | ---- | ------------------- |
| success | bool | 승인이 성공적으로 설정되면 true |

### `revoke`

소유자로부터 토큰을 전송할 수 있는 spender의 승인을 취소합니다.

승인이 성공적으로 취소되면 `PrecompiledBankRevoke`가 발생합니다.

#### 입력

| 이름      | 타입      | 설명     |
| ------- | ------- | ------ |
| spender | address | 취소할 주소 |

#### 출력

| 이름      | 타입   | 설명                  |
| ------- | ---- | ------------------- |
| success | bool | 승인이 성공적으로 취소되면 true |

### `balanceOf`

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

#### 입력

| 이름      | 타입      | 설명            |
| ------- | ------- | ------------- |
| account | address | 토큰 잔액을 조회할 주소 |

#### 출력

| 이름      | 타입      | 설명        |
| ------- | ------- | --------- |
| balance | uint256 | 계정의 토큰 수량 |

### `totalSupply`

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

#### 입력

없음

#### 출력

| 이름          | 타입      | 설명       |
| ----------- | ------- | -------- |
| totalSupply | uint256 | 토큰의 총 수량 |

### `allowance`

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

#### 입력

| 이름      | 타입      | 설명          |
| ------- | ------- | ----------- |
| owner   | address | 소유자의 주소     |
| spender | address | spender의 주소 |

#### 출력

| 이름     | 타입      | 설명         |
| ------ | ------- | ---------- |
| amount | uint256 | 승인된 토큰의 수량 |

## 이벤트

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

### PrecompiledBankMint

| 이름     | 타입      | 인덱싱 | 설명            |
| ------ | ------- | --- | ------------- |
| from   | address | Y   | 토큰을 발행한 주소    |
| to     | address | Y   | 발행된 토큰을 받을 주소 |
| amount | uint256 | N   | 발행된 토큰의 수량    |

### PrecompiledBankBurn

| 이름     | 타입      | 인덱싱 | 설명               |
| ------ | ------- | --- | ---------------- |
| from   | address | Y   | 토큰을 소각한 주소       |
| to     | address | Y   | 이 메서드에서는 사용되지 않음 |
| amount | uint256 | N   | 소각된 토큰의 수량       |

### PrecompiledBankTransfer

| 이름     | 타입      | 인덱싱 | 설명            |
| ------ | ------- | --- | ------------- |
| from   | address | Y   | 토큰을 전송한 주소    |
| to     | address | Y   | 전송된 토큰을 받을 주소 |
| amount | uint256 | N   | 전송된 토큰의 수량    |

### PrecompiledBankApproval

| 이름      | 타입      | 인덱싱 | 설명         |
| ------- | ------- | --- | ---------- |
| owner   | address | Y   | 토큰을 승인한 주소 |
| spender | address | Y   | 승인할 주소     |
| value   | uint256 | N   | 승인된 토큰의 수량 |

### PrecompiledBankRevoke

| 이름      | 타입      | 인덱싱 | 설명         |
| ------- | ------- | --- | ---------- |
| owner   | address | Y   | 토큰을 취소한 주소 |
| spender | address | Y   | 취소할 주소     |
| value   | uint256 | N   | 승인된 토큰의 수량 |
