> ## 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.

# Distribution

> EVM 환경에서 수수료 수집 및 보상 인출을 위한 x/distribution 연결 Distribution 프리컴파일.

## 개요

`distribution` precompile 컨트랙트는 Stable SDK의 `x/distribution` 모듈 기능을 EVM 환경에서 사용할 수 있도록 브리지 역할을 합니다.

## 목차

1. **[개념](#개념)**
2. **[구성](#구성)**
3. **[메서드](#메서드)**
4. **[이벤트](#이벤트)**

## 개념

`distribution` precompile 컨트랙트에서는 위임자 또는 예치자가 호출자인지 확인하는 추가 검사가 수행됩니다.

## 구성

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

### 컨트랙트 주소

* `0x0000000000000000000000000000000000000801`

## 메서드

### `setWithdrawAddress`

위임자가 검증자에게 위임한 토큰에 대한 rewards를 받을 주소를 설정합니다.
때로는 위임자가 자기 위임(self-delegated)일 때 검증자 주소가 위임자로 사용됩니다.

`SetWithdrawAddress`는 출금 주소가 성공적으로 설정되었을 때 발생합니다.

#### 입력

| 이름                | 타입      | 설명                    |
| ----------------- | ------- | --------------------- |
| delegatorAddress  | address | 위임자의 주소               |
| withdrawerAddress | address | 위임에 대한 rewards를 받을 주소 |

#### 출력

| 이름      | 타입   | 설명                     |
| ------- | ---- | ---------------------- |
| success | bool | 출금 주소가 성공적으로 설정되면 true |

### `withdrawDelegatorRewards`

검증자로부터 위임자가 받을 rewards를 출금합니다.
검증자가 위임자에게 지급하는 모든 유형의 토큰이 단일 트랜잭션으로 출금됩니다.

`WithdrawDelegatorRewards`는 rewards가 성공적으로 출금되었을 때 발생합니다.

#### 입력

| 이름               | 타입      | 설명      |
| ---------------- | ------- | ------- |
| delegatorAddress | address | 위임자의 주소 |
| validatorAddress | address | 검증자의 주소 |

#### 출력

| 이름     | 타입      | 설명                      |
| ------ | ------- | ----------------------- |
| amount | Coin\[] | 위임자가 받을 다양한 토큰의 rewards |

`Coin`은 다음 필드를 가진 구조체입니다:

| 이름     | 타입      | 설명            |
| ------ | ------- | ------------- |
| denom  | string  | reward의 denom |
| amount | uint256 | reward의 수량    |

### `withdrawValidatorCommission`

검증자의 수수료를 출금합니다.
검증자가 수수료로 받는 모든 유형의 토큰이 단일 트랜잭션으로 출금됩니다.

`WithdrawValidatorCommission`은 수수료가 성공적으로 출금되었을 때 발생합니다.

#### 입력

| 이름               | 타입      | 설명      |
| ---------------- | ------- | ------- |
| validatorAddress | address | 검증자의 주소 |

#### 출력

| 이름     | 타입      | 설명                  |
| ------ | ------- | ------------------- |
| amount | Coin\[] | 검증자가 받을 다양한 토큰의 수수료 |

### `validatorDistributionInfo`

검증자가 받을 reward를 나타내는 분배 정보를 반환합니다. 검증자는 자신의 주소로 토큰을 위임하여 자기 결합(self-bonded)이라고 하는 위임자 역할을 할 수 있습니다.

#### 입력

| 이름               | 타입      | 설명      |
| ---------------- | ------- | ------- |
| validatorAddress | address | 검증자의 주소 |

#### 출력

| 이름               | 타입                        | 설명         |
| ---------------- | ------------------------- | ---------- |
| distributionInfo | ValidatorDistributionInfo | 검증자의 분배 정보 |

`ValidatorDistributionInfo`는 다음 필드를 가진 구조체입니다:

| 이름              | 타입         | 설명            |
| --------------- | ---------- | ------------- |
| operatorAddress | address    | 검증자의 운영자 주소   |
| selfBondRewards | DecCoin\[] | 검증자의 자기 결합 수량 |
| commission      | DecCoin\[] | 검증자의 수수료      |

`DecCoin`은 다음 필드를 가진 구조체입니다:

| 이름        | 타입      | 설명            |
| --------- | ------- | ------------- |
| denom     | string  | reward의 denom |
| amount    | uint256 | reward의 수량    |
| precision | uint8   | reward의 정밀도   |

### `validatorOutstandingRewards`

검증자의 미지급 rewards를 반환합니다. 미지급 rewards는 검증자의 수수료와 자기 결합 rewards, 그리고 위임자들의 총 rewards로 구성된 총 reward 금액을 나타냅니다. 검증자 A가 있고 위임자 B, C, D가 A에게 위임하는 경우, 검증자의 미지급 rewards는 A의 수수료와 자기 결합 rewards + B, C, D의 rewards의 합계입니다.

#### 입력

| 이름               | 타입      | 설명      |
| ---------------- | ------- | ------- |
| validatorAddress | address | 검증자의 주소 |

#### 출력

| 이름      | 타입         | 설명               |
| ------- | ---------- | ---------------- |
| rewards | DecCoin\[] | 검증자의 미지급 rewards |

### `validatorCommission`

검증자의 수수료를 반환합니다. 이 메서드는 `withdrawValidatorCommission` 메서드를 호출하기 전에 검증자의 수수료를 조회하는 데 사용됩니다.

#### 입력

| 이름               | 타입      | 설명      |
| ---------------- | ------- | ------- |
| validatorAddress | address | 검증자의 주소 |

#### 출력

| 이름         | 타입         | 설명       |
| ---------- | ---------- | -------- |
| commission | DecCoin\[] | 검증자의 수수료 |

### `validatorSlashes`

시작 높이와 종료 높이 사이에 검증자의 슬래시 이력을 반환합니다. 슬래싱은 검증자가 악의적으로 행동하거나 이중 서명, 잘못된 행동, 체인 규칙을 따르지 않는 등의 네트워크 규칙을 위반했을 때 부과되는 벌금입니다.

#### 입력

| 이름               | 타입      | 설명        |
| ---------------- | ------- | --------- |
| validatorAddress | address | 검증자의 주소   |
| startingHeight   | uint64  | 시작 높이     |
| endingHeight     | uint64  | 종료 높이     |
| pageRequest      | PageReq | 페이지네이션 요청 |

`PageReq`는 다음 필드를 가진 구조체입니다:

| 이름         | 타입     | 설명                 |
| ---------- | ------ | ------------------ |
| key        | bytes  | 페이지네이션의 키          |
| offset     | uint64 | 페이지네이션의 오프셋        |
| limit      | uint64 | 페이지네이션의 제한         |
| countTotal | bool   | 총 페이지 수를 계산할지 여부   |
| reverse    | bool   | 페이지네이션을 역순으로 할지 여부 |

#### 출력

| 이름         | 타입                     | 설명        |
| ---------- | ---------------------- | --------- |
| slashes    | ValidatorSlashEvent\[] | 검증자의 슬래시  |
| pagination | PageResp               | 페이지네이션 응답 |

`ValidatorSlashEvent`는 다음 필드를 가진 구조체입니다:

| 이름              | 타입     | 설명      |
| --------------- | ------ | ------- |
| validatorPeriod | uint64 | 검증자의 기간 |
| fraction        | Dec    | 슬래시의 비율 |

`Dec`은 다음 필드를 가진 구조체입니다:

| 이름        | 타입     | 설명       |
| --------- | ------ | -------- |
| value     | uint64 | Dec의 값   |
| precision | uint8  | Dec의 정밀도 |

`PageResp`는 다음 필드를 가진 구조체입니다:

| 이름      | 타입     | 설명           |
| ------- | ------ | ------------ |
| nextKey | bytes  | 페이지네이션의 다음 키 |
| total   | uint64 | 총 페이지 수      |

### `delegationRewards`

위임자가 검증자로부터 받는 rewards를 반환합니다.

#### 입력

| 이름               | 타입      | 설명          |
| ---------------- | ------- | ----------- |
| delegatorAddress | address | 위임자의 hex 주소 |
| validatorAddress | address | 검증자의 주소     |

#### 출력

| 이름      | 타입         | 설명                     |
| ------- | ---------- | ---------------------- |
| rewards | DecCoin\[] | 위임자가 검증자로부터 받는 rewards |

### `delegationTotalRewards`

위임자가 모든 검증자로부터 받는 총 rewards를 반환합니다.

#### 입력

| 이름               | 타입      | 설명          |
| ---------------- | ------- | ----------- |
| delegatorAddress | address | 위임자의 hex 주소 |

#### 출력

| 이름      | 타입                           | 설명                          |
| ------- | ---------------------------- | --------------------------- |
| rewards | DelegationDelegatorReward\[] | 위임자가 모든 검증자로부터 받는 총 rewards |
| total   | DecCoin\[]                   | rewards의 총 수량               |

`DelegationDelegatorReward`는 다음 필드를 가진 구조체입니다:

| 이름               | 타입         | 설명                     |
| ---------------- | ---------- | ---------------------- |
| validatorAddress | address    | 검증자의 주소                |
| reward           | DecCoin\[] | 위임자가 검증자로부터 받는 rewards |

### `delegatorValidators`

위임자가 결합된 검증자들을 반환합니다.

#### 입력

| 이름               | 타입      | 설명          |
| ---------------- | ------- | ----------- |
| delegatorAddress | address | 위임자의 hex 주소 |

#### 출력

| 이름         | 타입        | 설명            |
| ---------- | --------- | ------------- |
| validators | string\[] | 위임자가 결합된 검증자들 |

### `delegatorWithdrawAddress`

`setWithdrawAddress` 메서드로 설정한 위임 rewards를 받을 주소를 반환합니다.

#### 입력

| 이름               | 타입      | 설명          |
| ---------------- | ------- | ----------- |
| delegatorAddress | address | 위임자의 hex 주소 |

#### 출력

| 이름              | 타입      | 설명                |
| --------------- | ------- | ----------------- |
| withdrawAddress | address | 위임 rewards를 받을 주소 |

## 이벤트

### SetWithdrawAddress

| 이름              | 타입      | 인덱스 | 설명                |
| --------------- | ------- | --- | ----------------- |
| caller          | address | Y   | 호출자(위임자)의 주소      |
| withdrawAddress | address | N   | 위임 rewards를 받을 주소 |

### WithdrawDelegatorRewards

| 이름               | 타입      | 인덱스 | 설명         |
| ---------------- | ------- | --- | ---------- |
| delegatorAddress | address | Y   | 위임자의 주소    |
| validatorAddress | address | Y   | 검증자의 주소    |
| amount           | uint256 | N   | reward의 수량 |

### WithdrawValidatorCommission

| 이름               | 타입      | 인덱스 | 설명        |
| ---------------- | ------- | --- | --------- |
| validatorAddress | address | Y   | 검증자의 주소   |
| commission       | uint256 | N   | 수수료의 총 수량 |
