# Hub

The Hub contract acts as the central hub for all minted stSei. Native Sei tokens received from users are delegated from here, and undelegations from stSei unbond requests are also handled from this contract. Rewards generated from delegations are withdrawn to the Reward contract, later restaking to validators, and update exchange rate.

## Config

<table><thead><tr><th width="274">Key</th><th width="169">Type</th><th>Description</th></tr></thead><tbody><tr><td>creator</td><td>CanonicalAddr</td><td>Address of contract creator</td></tr><tr><td>update_reward_index_addr</td><td>CanonicalAddr</td><td>The address allowed to call <a href="#updateglobalindex">UpdateGlobalIndex</a></td></tr><tr><td>reward_dispatcher_contract</td><td>Option&#x3C;CanonicalAddr></td><td>Contract address of <a href="broken-reference"> Rewards Dispatcher</a></td></tr><tr><td>validators_registry_contract</td><td>Option&#x3C;CanonicalAddr></td><td>Contract address of  <a href="broken-reference">Validators Registry</a></td></tr><tr><td>bsei_token_contract</td><td>Option&#x3C;CanonicalAddr></td><td>Contract address of bSei's Cw20 token contract</td></tr><tr><td>stsei_token_contract</td><td>Option&#x3C;CanonicalAddr></td><td>Contract address of stSei's Cw20 token contract</td></tr><tr><td>rewards_contract</td><td>Option&#x3C;CanonicalAddr></td><td>Contract address of <a href="broken-reference">Reward</a></td></tr></tbody></table>

##

## Parameters

<table><thead><tr><th width="257">Key</th><th width="145">Type</th><th>Description</th></tr></thead><tbody><tr><td>epoch_period</td><td>u64</td><td>Minimum time delay between undelegation batches <strong>[seconds]</strong></td></tr><tr><td>underlying_coin_denom</td><td>String</td><td>Underlying asset denomination of stAsset (Sei)</td></tr><tr><td>unbonding_period</td><td>u64</td><td>Time required for the Hub contract to consider an undelegation batch to be fully undelegated (past the unbonding period) <strong>[seconds]</strong></td></tr><tr><td>peg_recovery_fee</td><td>Decimal</td><td>Fee applied to stSei generation and redemption</td></tr><tr><td>er_threshold</td><td>Decimal</td><td>Minimum stSei exchange rate before peg recovery fee is applied</td></tr><tr><td>reward_denom</td><td>String</td><td>Native token denomination for distributed bSei rewards (kUSD)</td></tr><tr><td>paused</td><td>Option&#x3C;bool></td><td>The pause system operation switch to facilitate smooth contract upgrades and data migration</td></tr></tbody></table>

## InitMsg

Instantiates the stSei Hub contract. Adds a specified validator to whitelist and bonds the creator's initial Sei deposit. The creator's initial Sei deposit ensures the stSei supply always be a high enough value to prevent rounding errors in the stSei exchange rate calculation.

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct InstantiateMsg {
    pub epoch_period: u64,
    pub underlying_coin_denom: String,
    pub unbonding_period: u64,
    pub peg_recovery_fee: Decimal,
    pub er_threshold: Decimal,
    pub reward_denom: String,
    pub update_reward_index_addr: String,
}

```

<table><thead><tr><th width="281">Key</th><th width="125">Type</th><th>Description</th></tr></thead><tbody><tr><td>epoch_period</td><td>u64</td><td>Minimum time delay between undelegation batches <strong>[seconds]</strong></td></tr><tr><td>underlying_coin_denom</td><td>String</td><td>Underlying asset denomination of stAsset (Sei)</td></tr><tr><td>unbonding_period</td><td>u64</td><td>Time required for the Hub contract to consider an undelegation batch to be fully undelegated (past the unbonding period) <strong>[seconds]</strong></td></tr><tr><td>peg_recovery_fee</td><td>Decimal</td><td>Fee applied to stSei generation and redemption</td></tr><tr><td>er_threshold</td><td>Decimal</td><td>Minimum stSei exchange rate before peg recovery fee is applied</td></tr><tr><td>reward_denom</td><td>String</td><td>Native token denomination for distributed bSei rewards (kUSD)</td></tr><tr><td>update_reward_index_addr</td><td>String</td><td>The address allowed to call UpdateGlobalIndex</td></tr></tbody></table>

## ExecuteMsg

### Receive

Can be called during a Cw20 token transfer when the Hub contract is the recipient. Allows the token transfer to execute a [Receive Hook ](#receive-hooks)as a subsequent action within the same transaction.

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ExecuteMsg {
    Receive {
        sender: String,
        amount: Uint128,
        msg: Binary,
    },
}
```

<table><thead><tr><th>Key</th><th width="145">Type</th><th>Description</th></tr></thead><tbody><tr><td>sender</td><td>String</td><td>Sender of token transfer</td></tr><tr><td>amount</td><td>Uint128</td><td>Amount of tokens received</td></tr><tr><td>msg</td><td>Binary</td><td>Base64-encoded string of JSON of <a href="#receive-hooks">Receive Hook</a></td></tr></tbody></table>

### BondForStSei

Bonds sei by delegating the sei amount equally between validators from the registry and mints stSei tokens to the message sender. Requires native Sei tokens to be sent to `Hub`.

The platform tries to distribute the stake evenly across all validators. Given a single delegation, the exact number of validators that will receive delegations and the amount that they will receive depends on the current distribution of stake. We take a sorted (ASC) list of validators, calculate the desired amount that each validator should have `target_stake = (total delegated + delegation_amount) / num_validators` and begin adding stake up to the desired amount, starting from the validator with the least stake. The exact amount of a single delegation is calculated as `target_stake - validator_stake`, and you'll have as many delegations as it takes to "drain" the delegation\_amount.

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ExecuteMsg {
    BondForStSei {},
}
```

| Key | Type | Description |
| --- | ---- | ----------- |
|     |      |             |
|     |      |             |
|     |      |             |

### UpdateGlobalIndex

Distributes Sei delegation rewards to stSei holders. Withdraws all accrued delegation rewards to the `Reward Dispatcher` contract and requests the `Reward` contract to update the global reward index value. Can be issued by the specific address .

<pre class="language-rust"><code class="lang-rust"><strong>#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
</strong>#[serde(rename_all = "snake_case")]
pub enum ExecuteMsg {
    UpdateGlobalIndex {
       airdrop_hooks: Option&#x3C;Vec&#x3C;Binary>>,
    },
}
</code></pre>

<table><thead><tr><th width="192">Key</th><th width="200">Type</th><th>Description</th></tr></thead><tbody><tr><td>airdrop_hooks</td><td>Vec&#x3C;Binary></td><td>Not currently enabled</td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr></tbody></table>

### WithdrawUnbonded

Withdraws unbonded Sei. Requires an unbonding entry to have been made before the unbonding period.

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ExecuteMsg {
    WithdrawUnbonded {},
}
```

| Key | Type | Description |
| --- | ---- | ----------- |
|     |      |             |
|     |      |             |
|     |      |             |

### CheckSlashing

Checks whether a slashing event occurred and updates state accordingly.

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ExecuteMsg {
    CheckSlashing {},
}
```

| Key | Type | Description |
| --- | ---- | ----------- |
|     |      |             |
|     |      |             |
|     |      |             |

### UpdateParams

Updates parameter values of the Hub contract. Can only be issued by the creator.

```rust

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ExecuteMsg {
    UpdateParams {
        epoch_period: Option<u64>,
        unbonding_period: Option<u64>,
        peg_recovery_fee: Option<Decimal>,
        er_threshold: Option<Decimal>,
        paused: Option<bool>,
        reward_denom: Option<String>,
    },
}
```

<table><thead><tr><th width="232">Key</th><th width="152">Type</th><th>Description</th></tr></thead><tbody><tr><td>epoch_period</td><td>u64</td><td>Minimum time delay between undelegation batches <strong>[seconds]</strong></td></tr><tr><td>unbonding_period</td><td>u64</td><td>Time required for the Hub contract to consider an undelegation batch to be fully undelegated (past the unbonding period) <strong>[seconds]</strong></td></tr><tr><td>peg_recovery_fee</td><td>Decimal</td><td>Fee applied to stSei generation and redemption</td></tr><tr><td>et_threshold</td><td>Decimal</td><td>Minimum stSei exchange rate before peg recovery fee is applied</td></tr><tr><td>paused</td><td>bool</td><td>The pause system operation switch to facilitate smooth contract upgrades and data migration</td></tr><tr><td>reward_denom</td><td>String</td><td>Native token denomination for distributed bSei rewards (kUSD)</td></tr></tbody></table>

### UpdateConfig

Updates the `Hub` contract configuration. Can only be issued by the creator.

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ExecuteMsg {
  UpdateConfig {
        rewards_dispatcher_contract: Option<String>,
        validators_registry_contract: Option<String>,
        bsei_token_contract: Option<String>,
        stsei_token_contract: Option<String>,
        airdrop_registry_contract: Option<String>,
        rewards_contract: Option<String>,
        update_reward_index_addr: Option<String>,
    },
}
```

<table><thead><tr><th width="297">Key</th><th width="106">Type</th><th>Description</th></tr></thead><tbody><tr><td>rewards_dispatcher_contract</td><td>String</td><td>Contract address of <a href="broken-reference"> Rewards Dispatcher</a></td></tr><tr><td>validators_registry_contract</td><td>String</td><td>Contract address of  <a href="broken-reference">Validators Registry</a></td></tr><tr><td>bsei_token_contract</td><td>String</td><td>Contract address of bSei's Cw20 token contract</td></tr><tr><td>stsei_token_contract</td><td>String</td><td>Contract address of stSei's Cw20 token contract</td></tr><tr><td>airdrop_registry_contract</td><td>String</td><td>Not currently enabled</td></tr><tr><td>rewards_contract</td><td>String</td><td>Contract address of <a href="broken-reference">Reward</a></td></tr><tr><td>update_reward_index_addr</td><td>String</td><td>The address allowed to call <a href="#updateglobalindex">UpdateGlobalIndex</a></td></tr></tbody></table>

### \[Internal] RedelegateProxy

A proxy handler to execute redelegations from Hub address.

Can only be executed by[ Validators Registry ](https://docs.kryptonite.finance/developer/staking/broken-reference)or by the owner of the Hub.

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ExecuteMsg {
 RedelegateProxy {
        // delegator is automatically set to address of the calling contract
        src_validator: String,
        redelegations: Vec<(String, Coin)>, //(dst_validator, amount)
    },

}
```

<table><thead><tr><th width="148">Key</th><th width="176">Type</th><th>Description</th></tr></thead><tbody><tr><td>src_validator</td><td>String</td><td>Address of source vaildator in redelegation pair</td></tr><tr><td>redelegations</td><td>Vec&#x3C;(String, Coin)></td><td>List of(destination validator, redelegation amount)</td></tr><tr><td></td><td></td><td></td></tr></tbody></table>

### \[Internal] BondRewards

Bonds sei by delegating the sei amount equally between validators from the registry.

No stSei tokens have been minted.

Can only be executed by [Rewards Dispatcher](https://docs.kryptonite.finance/developer/staking/broken-reference).

Requires native Sei tokens to be sent to `Hub`.

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ExecuteMsg {
    BondRewards {},
}
```

| Key | Type | Description |
| --- | ---- | ----------- |
|     |      |             |
|     |      |             |
|     |      |             |

## Receive Hooks

### Unbond

Burns received stSei and equally unbonds a corresponding amount of Sei from a validator from the registry.

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum Cw20HookMsg {
    Unbond {},
}
```

| Key | Type | Description |
| --- | ---- | ----------- |
|     |      |             |
|     |      |             |
|     |      |             |

## QueryMsg

### Config

Gets the `Hub` contract's configuration.

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
    Config {},
}
```

| Key | Type | Description |
| --- | ---- | ----------- |
|     |      |             |
|     |      |             |
|     |      |             |

### ConfigResponse

```rust

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct ConfigResponse {
    pub owner: String,
    pub update_reward_index_addr: String,
    pub reward_dispatcher_contract: Option<String>,
    pub validators_registry_contract: Option<String>,
    pub bsei_token_contract: Option<String>,
    pub stsei_token_contract: Option<String>,
    pub airdrop_registry_contract: Option<String>,

    // #[deprecated]
    pub token_contract: Option<String>,
}
```

<table><thead><tr><th width="259">Key</th><th width="143">Type</th><th>Description</th></tr></thead><tbody><tr><td>owner</td><td>String</td><td>Address of the owner</td></tr><tr><td>update_reward_index_addr</td><td>String</td><td>The address allowed to call <a href="#updateglobalindex">UpdateGlobalIndex</a></td></tr><tr><td>reward_dispatcher_contract</td><td>String</td><td>Contract address of <a href="broken-reference"> Rewards Dispatcher</a></td></tr><tr><td>validators_registry_contract</td><td>String</td><td>Contract address of  <a href="broken-reference">Validators Registry</a></td></tr><tr><td>bsei_token_contract</td><td>String</td><td>Contract address of bSei's Cw20 token contract</td></tr><tr><td>stsei_token_contract</td><td>String</td><td>Contract address of stSei's Cw20 token contract</td></tr><tr><td>airdrop_registry_contract</td><td>String</td><td>Not currently enabled</td></tr><tr><td>token_contract</td><td>String</td><td>Not currently enabled</td></tr></tbody></table>

### State

```rust

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
    State {},
}
```

### StateResponse

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct StateResponse {
    pub bsei_exchange_rate: Decimal,
    pub stsei_exchange_rate: Decimal,
    pub total_bond_bsei_amount: Uint128,
    pub total_bond_stsei_amount: Uint128,
    pub last_index_modification: u64,
    pub prev_hub_balance: Uint128,
    pub last_unbonded_time: u64,
    pub last_processed_batch: u64,

    // #[deprecated]
    pub total_bond_amount: Uint128,
    // #[deprecated]
    pub exchange_rate: Decimal,
}

```

<table><thead><tr><th width="264">Key</th><th width="112">Type</th><th>Description</th></tr></thead><tbody><tr><td>bsei_exchange_rate</td><td>Decimal</td><td>Current bSei &#x3C;> Sei exchange rate</td></tr><tr><td>stset_exchange_rate</td><td>Decimal</td><td>Current stSei &#x3C;> Sei exchange rate</td></tr><tr><td>total_bond_bsei_amount</td><td>Uint128</td><td>Total amount of Sei currently bonded by Hub via bSei logic</td></tr><tr><td>total_bond_stsei_amount</td><td>Uint128</td><td>Total amount of Sei currently bonded by Hub via stSei logic</td></tr><tr><td>last_index_modification</td><td>u64</td><td>Unix block timestamp when the global reward index was last updated</td></tr><tr><td>prev_hub_balance</td><td>Uint128</td><td>Hub's sei balance when WithdrawUnbonded was lasted executed. Used to calcutate the actual amount of unbonded Sei</td></tr><tr><td>last_unbonded_time</td><td>u64</td><td>Unix block timestamp when a batch was last undelegated</td></tr><tr><td>last_processed_batch</td><td>u64</td><td>Batch ID of the most recently released batch</td></tr></tbody></table>

### CurrentBatch

Gets information about the current undelegation batch.

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
    CurrentBatch {},
}
```

| Key | Type | Description |
| --- | ---- | ----------- |
|     |      |             |
|     |      |             |
|     |      |             |

### CurrentBatchResponse

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct CurrentBatchResponse {
    pub id: u64,
    pub requested_bsei_with_fee: Uint128,
    pub requested_stsei: Uint128,

    // #[deprecated]
    pub requested_with_fee: Uint128,
}
```

<table><thead><tr><th width="240">Key</th><th width="107">Type</th><th>Description</th></tr></thead><tbody><tr><td>id</td><td>u64</td><td>Batch ID of the current undelegation batch</td></tr><tr><td>requested_bsei_with_fee</td><td>Uint128</td><td>Amount of (fee-applied)bSei requested for undelegation in this batch</td></tr><tr><td>requested_stsei</td><td>Uint128</td><td>Amount of  stSei requested for undelegation in this batch</td></tr></tbody></table>

### WithdrawableUnbonded

Gets the amount of undelegated Sei that will be available for withdrawal (unbonding requests past the unbonding period) for the specified user.

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
    WithdrawableUnbonded {
        address: String,
    },
}
```

<table><thead><tr><th width="138">Key</th><th width="148">Type</th><th>Description</th></tr></thead><tbody><tr><td>address</td><td>String</td><td>Address of user that previously unbonded Sei via redeeming bSei</td></tr></tbody></table>

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct WithdrawableUnbondedResponse {
    pub withdrawable: Uint128,
}
```

<table><thead><tr><th width="177">Key</th><th width="192">Type</th><th>Description</th></tr></thead><tbody><tr><td>withdrawable</td><td>Uint128</td><td>Amount of undelegated Sei availabe for withdrawal</td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr></tbody></table>

###

### Parameters

Gets parameter information.

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
    Parameters {},
}
```

| Key | Type | Description |
| --- | ---- | ----------- |
|     |      |             |
|     |      |             |
|     |      |             |

### ParametersResponse

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct Parameters {
    pub epoch_period: u64,
    pub underlying_coin_denom: String,
    pub unbonding_period: u64,
    pub peg_recovery_fee: Decimal,
    pub er_threshold: Decimal,
    pub reward_denom: String,
    pub paused: Option<bool>,
}

```

<table><thead><tr><th width="257">Key</th><th width="145">Type</th><th>Description</th></tr></thead><tbody><tr><td>epoch_period</td><td>u64</td><td>Minimum time delay between undelegation batches <strong>[seconds]</strong></td></tr><tr><td>underlying_coin_denom</td><td>String</td><td>Underlying asset denomination of stAsset (Sei)</td></tr><tr><td>unbonding_period</td><td>u64</td><td>Time required for the Hub contract to consider an undelegation batch to be fully undelegated (past the unbonding period) <strong>[seconds]</strong></td></tr><tr><td>peg_recovery_fee</td><td>Decimal</td><td>Fee applied to stSei generation and redemption</td></tr><tr><td>er_threshold</td><td>Decimal</td><td>Minimum stSei exchange rate before peg recovery fee is applied</td></tr><tr><td>reward_denom</td><td>String</td><td>Native token denomination for distributed bSei rewards (kUSD)</td></tr><tr><td>paused</td><td>Option&#x3C;bool></td><td>The pause system operation switch to facilitate smooth contract upgrades and data migration</td></tr></tbody></table>

### UnbondRequests

Gets the list of Sei unbonding amounts being unbonded for the specified user.

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
    UnbondRequests {
        address: String,
    },
}
```

<table><thead><tr><th width="173">Key</th><th width="158">Type</th><th>Description</th></tr></thead><tbody><tr><td>address</td><td>String</td><td>Address of user that previously unbonded Sei by redeeming stSei</td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr></tbody></table>

### UnbondRequestsResponse

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct UnbondRequestsResponse {
    pub address: String,
    pub requests: UnbondRequest,
}


pub type UnbondRequest = Vec<(u64, Uint128, Uint128)>;

```

<table><thead><tr><th width="132">Key</th><th width="176">Type</th><th>Description</th></tr></thead><tbody><tr><td>address</td><td>String</td><td>Address of user that requested to unbond stSei</td></tr><tr><td>requests</td><td>UnbondRequest</td><td>List of unbonding requests made by user</td></tr><tr><td></td><td></td><td></td></tr></tbody></table>

<table><thead><tr><th width="171">Key</th><th width="258">Type</th><th>Description</th></tr></thead><tbody><tr><td>UnbondRequest</td><td>Vec&#x3C;(u64, Uint128, Uint128)></td><td>List of (batch ID, bSei unbond amount, stSei unbond amount)</td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr></tbody></table>

### AllHistory

Gets the historical list of undelegation batch entries.

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
    AllHistory {
        start_from: Option<u64>,
        limit: Option<u32>,
    },
}
```

<table><thead><tr><th width="179">Key</th><th width="122">Type</th><th>Description</th></tr></thead><tbody><tr><td>start_from*</td><td>u64</td><td>Batch Id to start query</td></tr><tr><td>limit*</td><td>u32</td><td>Maximum number of query entries</td></tr><tr><td></td><td></td><td></td></tr></tbody></table>

\* = optional

### AllHistoryResponse

```rust
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct AllHistoryResponse {
    pub history: Vec<UnbondHistoryResponse>,
}


#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct UnbondHistoryResponse {
    pub batch_id: u64,
    pub time: u64,
    pub bsei_amount: Uint128,
    pub bsei_applied_exchange_rate: Decimal,
    pub bsei_withdraw_rate: Decimal,

    pub stsei_amount: Uint128,
    pub stsei_applied_exchange_rate: Decimal,
    pub stsei_withdraw_rate: Decimal,

    pub released: bool,

    // #[deprecated]
    pub amount: Uint128,
    // #[deprecated]
    pub applied_exchange_rate: Decimal,
    // #[deprecated]
    pub withdraw_rate: Decimal,
}
```

<table><thead><tr><th width="150">Key</th><th width="265">Type</th><th>Description</th></tr></thead><tbody><tr><td>history</td><td>Vec&#x3C;UnbondHistoryResponse></td><td>List of batch information</td></tr></tbody></table>

<table><thead><tr><th width="260">Key</th><th width="118">Type</th><th>Description</th></tr></thead><tbody><tr><td>batch_id</td><td>u64</td><td>Batch ID</td></tr><tr><td>time</td><td>u64</td><td>Unix block timestamp when this batch was undelegated</td></tr><tr><td>bsei_amount</td><td>Uint128</td><td>(Fee-applied)amount of bSei unbonded in this batch</td></tr><tr><td>bsei_applied_exchange_rate</td><td>Decimal</td><td>bSei exchange rate at the time of batch undelegation</td></tr><tr><td>bsei_withdraw_rate</td><td>Decimal</td><td>Conversion rate applied when users later withdraw from this batch</td></tr><tr><td>stsei_amount</td><td>Uint128</td><td>(Fee-applied)amount of stSei unbonded in this batch</td></tr><tr><td>stsei_applied_exchange_rate</td><td>Decimal</td><td>stSei exchange rate at the time of batch undelegation</td></tr><tr><td>stsei_withdraw_rate</td><td>Decimal</td><td>Convertion rate applied when users later withdraw from this batch</td></tr><tr><td>released</td><td>bool</td><td>Indication on whether is batch is released(processed as fully undelegated by the contract)</td></tr></tbody></table>
