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

Key
Type
Description

creator

CanonicalAddr

Address of contract creator

update_reward_index_addr

CanonicalAddr

reward_dispatcher_contract

Option<CanonicalAddr>

validators_registry_contract

Option<CanonicalAddr>

bsei_token_contract

Option<CanonicalAddr>

Contract address of bSei's Cw20 token contract

stsei_token_contract

Option<CanonicalAddr>

Contract address of stSei's Cw20 token contract

rewards_contract

Option<CanonicalAddr>

Parameters

Key
Type
Description

epoch_period

u64

Minimum time delay between undelegation batches [seconds]

underlying_coin_denom

String

Underlying asset denomination of stAsset (Sei)

unbonding_period

u64

Time required for the Hub contract to consider an undelegation batch to be fully undelegated (past the unbonding period) [seconds]

peg_recovery_fee

Decimal

Fee applied to stSei generation and redemption

er_threshold

Decimal

Minimum stSei exchange rate before peg recovery fee is applied

reward_denom

String

Native token denomination for distributed bSei rewards (kUSD)

paused

Option<bool>

The pause system operation switch to facilitate smooth contract upgrades and data migration

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.

#[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,
}
Key
Type
Description

epoch_period

u64

Minimum time delay between undelegation batches [seconds]

underlying_coin_denom

String

Underlying asset denomination of stAsset (Sei)

unbonding_period

u64

Time required for the Hub contract to consider an undelegation batch to be fully undelegated (past the unbonding period) [seconds]

peg_recovery_fee

Decimal

Fee applied to stSei generation and redemption

er_threshold

Decimal

Minimum stSei exchange rate before peg recovery fee is applied

reward_denom

String

Native token denomination for distributed bSei rewards (kUSD)

update_reward_index_addr

String

The address allowed to call UpdateGlobalIndex

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 as a subsequent action within the same transaction.

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

sender

String

Sender of token transfer

amount

Uint128

Amount of tokens received

msg

Binary

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.

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

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ExecuteMsg {
    UpdateGlobalIndex {
       airdrop_hooks: Option<Vec<Binary>>,
    },
}
Key
Type
Description

airdrop_hooks

Vec<Binary>

Not currently enabled

WithdrawUnbonded

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

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

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


#[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>,
    },
}
Key
Type
Description

epoch_period

u64

Minimum time delay between undelegation batches [seconds]

unbonding_period

u64

Time required for the Hub contract to consider an undelegation batch to be fully undelegated (past the unbonding period) [seconds]

peg_recovery_fee

Decimal

Fee applied to stSei generation and redemption

et_threshold

Decimal

Minimum stSei exchange rate before peg recovery fee is applied

paused

bool

The pause system operation switch to facilitate smooth contract upgrades and data migration

reward_denom

String

Native token denomination for distributed bSei rewards (kUSD)

UpdateConfig

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

#[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>,
    },
}
Key
Type
Description

rewards_dispatcher_contract

String

validators_registry_contract

String

bsei_token_contract

String

Contract address of bSei's Cw20 token contract

stsei_token_contract

String

Contract address of stSei's Cw20 token contract

airdrop_registry_contract

String

Not currently enabled

rewards_contract

String

update_reward_index_addr

String

[Internal] RedelegateProxy

A proxy handler to execute redelegations from Hub address.

Can only be executed by Validators Registry or by the owner of the Hub.

#[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)
    },

}
Key
Type
Description

src_validator

String

Address of source vaildator in redelegation pair

redelegations

Vec<(String, Coin)>

List of(destination validator, redelegation amount)

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

Requires native Sei tokens to be sent to Hub.

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

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

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

ConfigResponse


#[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>,
}
Key
Type
Description

owner

String

Address of the owner

update_reward_index_addr

String

reward_dispatcher_contract

String

validators_registry_contract

String

bsei_token_contract

String

Contract address of bSei's Cw20 token contract

stsei_token_contract

String

Contract address of stSei's Cw20 token contract

airdrop_registry_contract

String

Not currently enabled

token_contract

String

Not currently enabled

State


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

StateResponse

#[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,
}
Key
Type
Description

bsei_exchange_rate

Decimal

Current bSei <> Sei exchange rate

stset_exchange_rate

Decimal

Current stSei <> Sei exchange rate

total_bond_bsei_amount

Uint128

Total amount of Sei currently bonded by Hub via bSei logic

total_bond_stsei_amount

Uint128

Total amount of Sei currently bonded by Hub via stSei logic

last_index_modification

u64

Unix block timestamp when the global reward index was last updated

prev_hub_balance

Uint128

Hub's sei balance when WithdrawUnbonded was lasted executed. Used to calcutate the actual amount of unbonded Sei

last_unbonded_time

u64

Unix block timestamp when a batch was last undelegated

last_processed_batch

u64

Batch ID of the most recently released batch

CurrentBatch

Gets information about the current undelegation batch.

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

CurrentBatchResponse

#[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,
}
Key
Type
Description

id

u64

Batch ID of the current undelegation batch

requested_bsei_with_fee

Uint128

Amount of (fee-applied)bSei requested for undelegation in this batch

requested_stsei

Uint128

Amount of stSei requested for undelegation in this batch

WithdrawableUnbonded

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

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

address

String

Address of user that previously unbonded Sei via redeeming bSei

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

withdrawable

Uint128

Amount of undelegated Sei availabe for withdrawal

Parameters

Gets parameter information.

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

ParametersResponse

#[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>,
}
Key
Type
Description

epoch_period

u64

Minimum time delay between undelegation batches [seconds]

underlying_coin_denom

String

Underlying asset denomination of stAsset (Sei)

unbonding_period

u64

Time required for the Hub contract to consider an undelegation batch to be fully undelegated (past the unbonding period) [seconds]

peg_recovery_fee

Decimal

Fee applied to stSei generation and redemption

er_threshold

Decimal

Minimum stSei exchange rate before peg recovery fee is applied

reward_denom

String

Native token denomination for distributed bSei rewards (kUSD)

paused

Option<bool>

The pause system operation switch to facilitate smooth contract upgrades and data migration

UnbondRequests

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

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

address

String

Address of user that previously unbonded Sei by redeeming stSei

UnbondRequestsResponse

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


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

address

String

Address of user that requested to unbond stSei

requests

UnbondRequest

List of unbonding requests made by user

Key
Type
Description

UnbondRequest

Vec<(u64, Uint128, Uint128)>

List of (batch ID, bSei unbond amount, stSei unbond amount)

AllHistory

Gets the historical list of undelegation batch entries.

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

start_from*

u64

Batch Id to start query

limit*

u32

Maximum number of query entries

* = optional

AllHistoryResponse

#[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,
}
Key
Type
Description

history

Vec<UnbondHistoryResponse>

List of batch information

Key
Type
Description

batch_id

u64

Batch ID

time

u64

Unix block timestamp when this batch was undelegated

bsei_amount

Uint128

(Fee-applied)amount of bSei unbonded in this batch

bsei_applied_exchange_rate

Decimal

bSei exchange rate at the time of batch undelegation

bsei_withdraw_rate

Decimal

Conversion rate applied when users later withdraw from this batch

stsei_amount

Uint128

(Fee-applied)amount of stSei unbonded in this batch

stsei_applied_exchange_rate

Decimal

stSei exchange rate at the time of batch undelegation

stsei_withdraw_rate

Decimal

Convertion rate applied when users later withdraw from this batch

released

bool

Indication on whether is batch is released(processed as fully undelegated by the contract)

Last updated