From 84a33b6b1f2f0a072e676005b640b0a3eb103ec9 Mon Sep 17 00:00:00 2001 From: 0xripleys <0xripleys@solend.fi> Date: Tue, 30 Jul 2024 13:11:38 -0400 Subject: [PATCH] fix docs --- .../docs/sui-system/staking_pool.md | 431 ++++++++++++++++++ .../docs/sui-system/sui_system.md | 62 +++ .../docs/sui-system/sui_system_state_inner.md | 58 +++ .../docs/sui-system/validator.md | 58 +++ .../docs/sui-system/validator_set.md | 81 ++++ .../packages_compiled/sui-system | Bin 41764 -> 43782 bytes crates/sui-framework/published_api.txt | 54 +++ 7 files changed, 744 insertions(+) diff --git a/crates/sui-framework/docs/sui-system/staking_pool.md b/crates/sui-framework/docs/sui-system/staking_pool.md index 782ad81ed3cc13..747c82c18161ae 100644 --- a/crates/sui-framework/docs/sui-system/staking_pool.md +++ b/crates/sui-framework/docs/sui-system/staking_pool.md @@ -7,10 +7,16 @@ title: Module `0x3::staking_pool` - [Resource `StakingPool`](#0x3_staking_pool_StakingPool) - [Struct `PoolTokenExchangeRate`](#0x3_staking_pool_PoolTokenExchangeRate) - [Resource `StakedSui`](#0x3_staking_pool_StakedSui) +- [Resource `FungibleStakedSui`](#0x3_staking_pool_FungibleStakedSui) +- [Resource `FungibleStakedSuiData`](#0x3_staking_pool_FungibleStakedSuiData) +- [Struct `FungibleStakedSuiDataKey`](#0x3_staking_pool_FungibleStakedSuiDataKey) - [Constants](#@Constants_0) - [Function `new`](#0x3_staking_pool_new) - [Function `request_add_stake`](#0x3_staking_pool_request_add_stake) - [Function `request_withdraw_stake`](#0x3_staking_pool_request_withdraw_stake) +- [Function `redeem_fungible_staked_sui`](#0x3_staking_pool_redeem_fungible_staked_sui) +- [Function `calculate_fungible_staked_sui_withdraw_amount`](#0x3_staking_pool_calculate_fungible_staked_sui_withdraw_amount) +- [Function `convert_to_fungible_staked_sui`](#0x3_staking_pool_convert_to_fungible_staked_sui) - [Function `withdraw_from_principal`](#0x3_staking_pool_withdraw_from_principal) - [Function `unwrap_staked_sui`](#0x3_staking_pool_unwrap_staked_sui) - [Function `deposit_rewards`](#0x3_staking_pool_deposit_rewards) @@ -22,10 +28,14 @@ title: Module `0x3::staking_pool` - [Function `deactivate_staking_pool`](#0x3_staking_pool_deactivate_staking_pool) - [Function `sui_balance`](#0x3_staking_pool_sui_balance) - [Function `pool_id`](#0x3_staking_pool_pool_id) +- [Function `fungible_staked_sui_pool_id`](#0x3_staking_pool_fungible_staked_sui_pool_id) - [Function `staked_sui_amount`](#0x3_staking_pool_staked_sui_amount) - [Function `stake_activation_epoch`](#0x3_staking_pool_stake_activation_epoch) - [Function `is_preactive`](#0x3_staking_pool_is_preactive) - [Function `is_inactive`](#0x3_staking_pool_is_inactive) +- [Function `fungible_staked_sui_value`](#0x3_staking_pool_fungible_staked_sui_value) +- [Function `split_fungible_staked_sui`](#0x3_staking_pool_split_fungible_staked_sui) +- [Function `join_fungible_staked_sui`](#0x3_staking_pool_join_fungible_staked_sui) - [Function `split`](#0x3_staking_pool_split) - [Function `split_staked_sui`](#0x3_staking_pool_split_staked_sui) - [Function `join_staked_sui`](#0x3_staking_pool_join_staked_sui) @@ -228,6 +238,116 @@ A self-custodial object holding the staked SUI tokens. + + + + +## Resource `FungibleStakedSui` + +An alternative to StakedSui that holds the pool token amount instead of the SUI balance. +StakedSui objects can be converted to FungibleStakedSuis after the initial warmup period. +The advantage of this is that you can now merge multiple StakedSui objects from different +activation epochs into a single FungibleStakedSui object. + + +
struct FungibleStakedSui has store, key
+
+ + + +
+Fields + + +
+
+id: object::UID +
+
+ +
+
+pool_id: object::ID +
+
+ ID of the staking pool we are staking with. +
+
+value: u64 +
+
+ The pool token amount. +
+
+ + +
+ + + +## Resource `FungibleStakedSuiData` + +Holds useful information + + +
struct FungibleStakedSuiData has store, key
+
+ + + +
+Fields + + +
+
+id: object::UID +
+
+ +
+
+total_supply: u64 +
+
+ fungible_staked_sui supply +
+
+principal: balance::Balance<sui::SUI> +
+
+ principal balance. Rewards are withdrawn from the reward pool +
+
+ + +
+ + + +## Struct `FungibleStakedSuiDataKey` + + + +
struct FungibleStakedSuiDataKey has copy, drop, store
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ +
@@ -244,6 +364,15 @@ A self-custodial object holding the staked SUI tokens. + + + + +
const ECannotMintFungibleStakedSuiYet: u64 = 19;
+
+ + + @@ -316,6 +445,15 @@ A self-custodial object holding the staked SUI tokens. + + + + +
const EInvariantFailure: u64 = 20;
+
+ + + @@ -548,6 +686,187 @@ A proportional amount of pool token withdraw is recorded and processed at epoch + + + + +## Function `redeem_fungible_staked_sui` + + + +
public(friend) fun redeem_fungible_staked_sui(pool: &mut staking_pool::StakingPool, fungible_staked_sui: staking_pool::FungibleStakedSui, ctx: &tx_context::TxContext): balance::Balance<sui::SUI>
+
+ + + +
+Implementation + + +
public(package) fun redeem_fungible_staked_sui(
+    pool: &mut StakingPool,
+    fungible_staked_sui: FungibleStakedSui,
+    ctx: &TxContext
+) : Balance<SUI> {
+    let FungibleStakedSui { id, pool_id, value } = fungible_staked_sui;
+    assert!(pool_id == object::id(pool), EWrongPool);
+
+    object::delete(id);
+
+    let latest_exchange_rate = pool_token_exchange_rate_at_epoch(pool, tx_context::epoch(ctx));
+    let fungible_staked_sui_data: &mut FungibleStakedSuiData = bag::borrow_mut(
+        &mut pool.extra_fields,
+        FungibleStakedSuiDataKey {}
+    );
+
+    let (principal_amount, rewards_amount) = calculate_fungible_staked_sui_withdraw_amount(
+        latest_exchange_rate,
+        value,
+        balance::value(&fungible_staked_sui_data.principal),
+        fungible_staked_sui_data.total_supply
+    );
+
+    fungible_staked_sui_data.total_supply = fungible_staked_sui_data.total_supply - value;
+
+    let mut sui_out = balance::split(&mut fungible_staked_sui_data.principal, principal_amount);
+    balance::join(
+        &mut sui_out,
+        balance::split(&mut pool.rewards_pool, rewards_amount)
+    );
+
+    pool.pending_total_sui_withdraw = pool.pending_total_sui_withdraw + balance::value(&sui_out);
+    pool.pending_pool_token_withdraw = pool.pending_pool_token_withdraw + value;
+
+    sui_out
+}
+
+ + + +
+ + + +## Function `calculate_fungible_staked_sui_withdraw_amount` + +written in separate function so i can test with random values +returns (principal_withdraw_amount, rewards_withdraw_amount) + + +
fun calculate_fungible_staked_sui_withdraw_amount(latest_exchange_rate: staking_pool::PoolTokenExchangeRate, fungible_staked_sui_value: u64, fungible_staked_sui_data_principal_amount: u64, fungible_staked_sui_data_total_supply: u64): (u64, u64)
+
+ + + +
+Implementation + + +
fun calculate_fungible_staked_sui_withdraw_amount(
+    latest_exchange_rate: PoolTokenExchangeRate,
+    fungible_staked_sui_value: u64,
+    fungible_staked_sui_data_principal_amount: u64, // fungible_staked_sui_data.principal.value()
+    fungible_staked_sui_data_total_supply: u64, // fungible_staked_sui_data.total_supply
+) : (u64, u64) {
+    // 1. if the entire FungibleStakedSuiData supply is redeemed, how much sui should we receive?
+    let total_sui_amount = get_sui_amount(&latest_exchange_rate, fungible_staked_sui_data_total_supply);
+
+    // 2. how much do we need to withdraw from the rewards pool?
+    let total_rewards = total_sui_amount - fungible_staked_sui_data_principal_amount;
+
+    // 3. proportionally withdraw from both wrt the fungible_staked_sui_value.
+    let principal_withdraw_amount = ((fungible_staked_sui_value as u128)
+        * (fungible_staked_sui_data_principal_amount as u128)
+        / (fungible_staked_sui_data_total_supply as u128)) as u64;
+
+    let rewards_withdraw_amount = ((fungible_staked_sui_value as u128)
+        * (total_rewards as u128)
+        / (fungible_staked_sui_data_total_supply as u128)) as u64;
+
+    // invariant check, just in case
+    let expected_sui_amount = get_sui_amount(&latest_exchange_rate, fungible_staked_sui_value);
+    assert!(principal_withdraw_amount + rewards_withdraw_amount <= expected_sui_amount, EInvariantFailure);
+
+    (principal_withdraw_amount, rewards_withdraw_amount)
+}
+
+ + + +
+ + + +## Function `convert_to_fungible_staked_sui` + +Convert the given staked SUI to an FungibleStakedSui object + + +
public(friend) fun convert_to_fungible_staked_sui(pool: &mut staking_pool::StakingPool, staked_sui: staking_pool::StakedSui, ctx: &mut tx_context::TxContext): staking_pool::FungibleStakedSui
+
+ + + +
+Implementation + + +
public(package) fun convert_to_fungible_staked_sui(
+    pool: &mut StakingPool,
+    staked_sui: StakedSui,
+    ctx: &mut TxContext
+) : FungibleStakedSui {
+    let StakedSui { id, pool_id, stake_activation_epoch, principal } = staked_sui;
+
+    assert!(pool_id == object::id(pool), EWrongPool);
+    assert!(
+        tx_context::epoch(ctx) >= stake_activation_epoch,
+        ECannotMintFungibleStakedSuiYet
+    );
+
+    object::delete(id);
+
+
+    let exchange_rate_at_staking_epoch = pool_token_exchange_rate_at_epoch(
+        pool,
+        stake_activation_epoch
+    );
+
+    let pool_token_amount = get_token_amount(
+        &exchange_rate_at_staking_epoch,
+        balance::value(&principal)
+    );
+
+    if (!bag::contains(&pool.extra_fields, FungibleStakedSuiDataKey {})) {
+        bag::add(
+            &mut pool.extra_fields,
+            FungibleStakedSuiDataKey {},
+            FungibleStakedSuiData {
+                id: object::new(ctx),
+                total_supply: pool_token_amount,
+                principal
+            }
+        );
+    }
+    else {
+        let fungible_staked_sui_data: &mut FungibleStakedSuiData = bag::borrow_mut(
+            &mut pool.extra_fields,
+            FungibleStakedSuiDataKey {}
+        );
+        fungible_staked_sui_data.total_supply = fungible_staked_sui_data.total_supply + pool_token_amount;
+        balance::join(&mut fungible_staked_sui_data.principal, principal);
+    };
+
+    FungibleStakedSui {
+        id: object::new(ctx),
+        pool_id,
+        value: pool_token_amount,
+    }
+}
+
+ + +
@@ -892,6 +1211,28 @@ withdraws can be made to the pool. + + + + +## Function `fungible_staked_sui_pool_id` + + + +
public fun fungible_staked_sui_pool_id(fungible_staked_sui: &staking_pool::FungibleStakedSui): object::ID
+
+ + + +
+Implementation + + +
public fun fungible_staked_sui_pool_id(fungible_staked_sui: &FungibleStakedSui): ID { fungible_staked_sui.pool_id }
+
+ + +
@@ -988,6 +1329,96 @@ Returns true if the input staking pool is inactive. + + + + +## Function `fungible_staked_sui_value` + + + +
public fun fungible_staked_sui_value(fungible_staked_sui: &staking_pool::FungibleStakedSui): u64
+
+ + + +
+Implementation + + +
public fun fungible_staked_sui_value(fungible_staked_sui: &FungibleStakedSui): u64 { fungible_staked_sui.value }
+
+ + + +
+ + + +## Function `split_fungible_staked_sui` + + + +
public fun split_fungible_staked_sui(fungible_staked_sui: &mut staking_pool::FungibleStakedSui, split_amount: u64, ctx: &mut tx_context::TxContext): staking_pool::FungibleStakedSui
+
+ + + +
+Implementation + + +
public fun split_fungible_staked_sui(
+    fungible_staked_sui: &mut FungibleStakedSui,
+    split_amount: u64,
+    ctx: &mut TxContext
+): FungibleStakedSui {
+    assert!(split_amount <= fungible_staked_sui.value, EInsufficientPoolTokenBalance);
+
+    fungible_staked_sui.value = fungible_staked_sui.value - split_amount;
+
+    assert!(fungible_staked_sui.value >= MIN_STAKING_THRESHOLD, EStakedSuiBelowThreshold);
+    assert!(split_amount >= MIN_STAKING_THRESHOLD, EStakedSuiBelowThreshold);
+
+    FungibleStakedSui {
+        id: object::new(ctx),
+        pool_id: fungible_staked_sui.pool_id,
+        value: split_amount,
+    }
+}
+
+ + + +
+ + + +## Function `join_fungible_staked_sui` + + + +
public fun join_fungible_staked_sui(self: &mut staking_pool::FungibleStakedSui, other: staking_pool::FungibleStakedSui)
+
+ + + +
+Implementation + + +
public fun join_fungible_staked_sui(self: &mut FungibleStakedSui, other: FungibleStakedSui) {
+    let FungibleStakedSui { id, pool_id, value } = other;
+    assert!(self.pool_id == pool_id, EWrongPool);
+
+    object::delete(id);
+
+    self.value = self.value + value;
+}
+
+ + +
diff --git a/crates/sui-framework/docs/sui-system/sui_system.md b/crates/sui-framework/docs/sui-system/sui_system.md index 920b9f2a3218ef..d24c2140610369 100644 --- a/crates/sui-framework/docs/sui-system/sui_system.md +++ b/crates/sui-framework/docs/sui-system/sui_system.md @@ -55,6 +55,8 @@ the SuiSystemStateInner version, or vice versa. - [Function `request_add_stake_non_entry`](#0x3_sui_system_request_add_stake_non_entry) - [Function `request_add_stake_mul_coin`](#0x3_sui_system_request_add_stake_mul_coin) - [Function `request_withdraw_stake`](#0x3_sui_system_request_withdraw_stake) +- [Function `convert_to_fungible_staked_sui`](#0x3_sui_system_convert_to_fungible_staked_sui) +- [Function `redeem_fungible_staked_sui`](#0x3_sui_system_redeem_fungible_staked_sui) - [Function `request_withdraw_stake_non_entry`](#0x3_sui_system_request_withdraw_stake_non_entry) - [Function `report_validator`](#0x3_sui_system_report_validator) - [Function `undo_report_validator`](#0x3_sui_system_undo_report_validator) @@ -615,6 +617,66 @@ Withdraw stake from a validator's staking pool. + + + + +## Function `convert_to_fungible_staked_sui` + +Convert StakedSui into a FungibleStakedSui object. + + +
public fun convert_to_fungible_staked_sui(wrapper: &mut sui_system::SuiSystemState, staked_sui: staking_pool::StakedSui, ctx: &mut tx_context::TxContext): staking_pool::FungibleStakedSui
+
+ + + +
+Implementation + + +
public fun convert_to_fungible_staked_sui(
+    wrapper: &mut SuiSystemState,
+    staked_sui: StakedSui,
+    ctx: &mut TxContext,
+): FungibleStakedSui {
+    let self = load_system_state_mut(wrapper);
+    self.convert_to_fungible_staked_sui(staked_sui, ctx)
+}
+
+ + + +
+ + + +## Function `redeem_fungible_staked_sui` + +Convert FungibleStakedSui into a StakedSui object. + + +
public fun redeem_fungible_staked_sui(wrapper: &mut sui_system::SuiSystemState, fungible_staked_sui: staking_pool::FungibleStakedSui, ctx: &tx_context::TxContext): balance::Balance<sui::SUI>
+
+ + + +
+Implementation + + +
public fun redeem_fungible_staked_sui(
+    wrapper: &mut SuiSystemState,
+    fungible_staked_sui: FungibleStakedSui,
+    ctx: &TxContext,
+): Balance<SUI> {
+    let self = load_system_state_mut(wrapper);
+    self.redeem_fungible_staked_sui(fungible_staked_sui, ctx)
+}
+
+ + +
diff --git a/crates/sui-framework/docs/sui-system/sui_system_state_inner.md b/crates/sui-framework/docs/sui-system/sui_system_state_inner.md index 0a0f0ad82ac31d..0293cac39ebd8b 100644 --- a/crates/sui-framework/docs/sui-system/sui_system_state_inner.md +++ b/crates/sui-framework/docs/sui-system/sui_system_state_inner.md @@ -24,6 +24,8 @@ title: Module `0x3::sui_system_state_inner` - [Function `request_add_stake`](#0x3_sui_system_state_inner_request_add_stake) - [Function `request_add_stake_mul_coin`](#0x3_sui_system_state_inner_request_add_stake_mul_coin) - [Function `request_withdraw_stake`](#0x3_sui_system_state_inner_request_withdraw_stake) +- [Function `convert_to_fungible_staked_sui`](#0x3_sui_system_state_inner_convert_to_fungible_staked_sui) +- [Function `redeem_fungible_staked_sui`](#0x3_sui_system_state_inner_redeem_fungible_staked_sui) - [Function `report_validator`](#0x3_sui_system_state_inner_report_validator) - [Function `undo_report_validator`](#0x3_sui_system_state_inner_undo_report_validator) - [Function `report_validator_impl`](#0x3_sui_system_state_inner_report_validator_impl) @@ -1299,6 +1301,62 @@ Withdraw some portion of a stake from a validator's staking pool. + + + + +## Function `convert_to_fungible_staked_sui` + + + +
public(friend) fun convert_to_fungible_staked_sui(self: &mut sui_system_state_inner::SuiSystemStateInnerV2, staked_sui: staking_pool::StakedSui, ctx: &mut tx_context::TxContext): staking_pool::FungibleStakedSui
+
+ + + +
+Implementation + + +
public(package) fun convert_to_fungible_staked_sui(
+    self: &mut SuiSystemStateInnerV2,
+    staked_sui: StakedSui,
+    ctx: &mut TxContext,
+) : FungibleStakedSui {
+    self.validators.convert_to_fungible_staked_sui(staked_sui, ctx)
+}
+
+ + + +
+ + + +## Function `redeem_fungible_staked_sui` + + + +
public(friend) fun redeem_fungible_staked_sui(self: &mut sui_system_state_inner::SuiSystemStateInnerV2, fungible_staked_sui: staking_pool::FungibleStakedSui, ctx: &tx_context::TxContext): balance::Balance<sui::SUI>
+
+ + + +
+Implementation + + +
public(package) fun redeem_fungible_staked_sui(
+    self: &mut SuiSystemStateInnerV2,
+    fungible_staked_sui: FungibleStakedSui,
+    ctx: &TxContext,
+) : Balance<SUI> {
+    self.validators.redeem_fungible_staked_sui(fungible_staked_sui, ctx)
+}
+
+ + +
diff --git a/crates/sui-framework/docs/sui-system/validator.md b/crates/sui-framework/docs/sui-system/validator.md index bda8ac01894c00..54a3c6c86530c5 100644 --- a/crates/sui-framework/docs/sui-system/validator.md +++ b/crates/sui-framework/docs/sui-system/validator.md @@ -15,6 +15,8 @@ title: Module `0x3::validator` - [Function `activate`](#0x3_validator_activate) - [Function `adjust_stake_and_gas_price`](#0x3_validator_adjust_stake_and_gas_price) - [Function `request_add_stake`](#0x3_validator_request_add_stake) +- [Function `convert_to_fungible_staked_sui`](#0x3_validator_convert_to_fungible_staked_sui) +- [Function `redeem_fungible_staked_sui`](#0x3_validator_redeem_fungible_staked_sui) - [Function `request_add_stake_at_genesis`](#0x3_validator_request_add_stake_at_genesis) - [Function `request_withdraw_stake`](#0x3_validator_request_withdraw_stake) - [Function `request_set_gas_price`](#0x3_validator_request_set_gas_price) @@ -918,6 +920,62 @@ Request to add stake to the validator's staking pool, processed at the end of th + + + + +## Function `convert_to_fungible_staked_sui` + + + +
public(friend) fun convert_to_fungible_staked_sui(self: &mut validator::Validator, staked_sui: staking_pool::StakedSui, ctx: &mut tx_context::TxContext): staking_pool::FungibleStakedSui
+
+ + + +
+Implementation + + +
public(package) fun convert_to_fungible_staked_sui(
+    self: &mut Validator,
+    staked_sui: StakedSui,
+    ctx: &mut TxContext,
+) : FungibleStakedSui {
+    self.staking_pool.convert_to_fungible_staked_sui(staked_sui, ctx)
+}
+
+ + + +
+ + + +## Function `redeem_fungible_staked_sui` + + + +
public(friend) fun redeem_fungible_staked_sui(self: &mut validator::Validator, fungible_staked_sui: staking_pool::FungibleStakedSui, ctx: &tx_context::TxContext): balance::Balance<sui::SUI>
+
+ + + +
+Implementation + + +
public(package) fun redeem_fungible_staked_sui(
+    self: &mut Validator,
+    fungible_staked_sui: FungibleStakedSui,
+    ctx: &TxContext,
+) : Balance<SUI> {
+    self.staking_pool.redeem_fungible_staked_sui(fungible_staked_sui, ctx)
+}
+
+ + +
diff --git a/crates/sui-framework/docs/sui-system/validator_set.md b/crates/sui-framework/docs/sui-system/validator_set.md index aec0ec400005f6..2fff63a1dd05a4 100644 --- a/crates/sui-framework/docs/sui-system/validator_set.md +++ b/crates/sui-framework/docs/sui-system/validator_set.md @@ -18,6 +18,8 @@ title: Module `0x3::validator_set` - [Function `request_remove_validator`](#0x3_validator_set_request_remove_validator) - [Function `request_add_stake`](#0x3_validator_set_request_add_stake) - [Function `request_withdraw_stake`](#0x3_validator_set_request_withdraw_stake) +- [Function `convert_to_fungible_staked_sui`](#0x3_validator_set_convert_to_fungible_staked_sui) +- [Function `redeem_fungible_staked_sui`](#0x3_validator_set_redeem_fungible_staked_sui) - [Function `request_set_commission_rate`](#0x3_validator_set_request_set_commission_rate) - [Function `advance_epoch`](#0x3_validator_set_advance_epoch) - [Function `update_and_process_low_stake_departures`](#0x3_validator_set_update_and_process_low_stake_departures) @@ -948,6 +950,85 @@ the stake and any rewards corresponding to it will be immediately processed. + + + + +## Function `convert_to_fungible_staked_sui` + + + +
public(friend) fun convert_to_fungible_staked_sui(self: &mut validator_set::ValidatorSet, staked_sui: staking_pool::StakedSui, ctx: &mut tx_context::TxContext): staking_pool::FungibleStakedSui
+
+ + + +
+Implementation + + +
public(package) fun convert_to_fungible_staked_sui(
+    self: &mut ValidatorSet,
+    staked_sui: StakedSui,
+    ctx: &mut TxContext,
+) : FungibleStakedSui {
+    let staking_pool_id = pool_id(&staked_sui);
+    let validator =
+        if (self.staking_pool_mappings.contains(staking_pool_id)) { // This is an active validator.
+            let validator_address = self.staking_pool_mappings[pool_id(&staked_sui)];
+            get_candidate_or_active_validator_mut(self, validator_address)
+        } else { // This is an inactive pool.
+            assert!(self.inactive_validators.contains(staking_pool_id), ENoPoolFound);
+            let wrapper = &mut self.inactive_validators[staking_pool_id];
+            wrapper.load_validator_maybe_upgrade()
+        };
+
+    validator.convert_to_fungible_staked_sui(staked_sui, ctx)
+}
+
+ + + +
+ + + +## Function `redeem_fungible_staked_sui` + + + +
public(friend) fun redeem_fungible_staked_sui(self: &mut validator_set::ValidatorSet, fungible_staked_sui: staking_pool::FungibleStakedSui, ctx: &tx_context::TxContext): balance::Balance<sui::SUI>
+
+ + + +
+Implementation + + +
public(package) fun redeem_fungible_staked_sui(
+    self: &mut ValidatorSet,
+    fungible_staked_sui: FungibleStakedSui,
+    ctx: &TxContext,
+) : Balance<SUI> {
+    let staking_pool_id = fungible_staked_sui_pool_id(&fungible_staked_sui);
+
+    let validator =
+        if (self.staking_pool_mappings.contains(staking_pool_id)) { // This is an active validator.
+            let validator_address = self.staking_pool_mappings[staking_pool_id];
+            get_candidate_or_active_validator_mut(self, validator_address)
+        } else { // This is an inactive pool.
+            assert!(self.inactive_validators.contains(staking_pool_id), ENoPoolFound);
+            let wrapper = &mut self.inactive_validators[staking_pool_id];
+            wrapper.load_validator_maybe_upgrade()
+        };
+
+    validator.redeem_fungible_staked_sui(fungible_staked_sui, ctx)
+}
+
+ + +
diff --git a/crates/sui-framework/packages_compiled/sui-system b/crates/sui-framework/packages_compiled/sui-system index c72fd63054b17befc7328ca7fa4745f2dafce24e..c91fe5bba252c11e545f2c7d9e379d6d3f94ad1f 100644 GIT binary patch delta 16360 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%0AHyQBziGO$o#j;XXryR?&)Nf6)16CEp)xeKXax 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 diff --git a/crates/sui-framework/published_api.txt b/crates/sui-framework/published_api.txt index 6004165f7e9e1d..90c96ed318d94e 100644 --- a/crates/sui-framework/published_api.txt +++ b/crates/sui-framework/published_api.txt @@ -25,6 +25,15 @@ PoolTokenExchangeRate StakedSui public struct 0x3::staking_pool +FungibleStakedSui + public struct + 0x3::staking_pool +FungibleStakedSuiData + public struct + 0x3::staking_pool +FungibleStakedSuiDataKey + public struct + 0x3::staking_pool new public(package) fun 0x3::staking_pool @@ -34,6 +43,15 @@ request_add_stake request_withdraw_stake public(package) fun 0x3::staking_pool +redeem_fungible_staked_sui + public(package) fun + 0x3::staking_pool +calculate_fungible_staked_sui_withdraw_amount + fun + 0x3::staking_pool +convert_to_fungible_staked_sui + public(package) fun + 0x3::staking_pool withdraw_from_principal public(package) fun 0x3::staking_pool @@ -67,6 +85,9 @@ sui_balance pool_id public fun 0x3::staking_pool +fungible_staked_sui_pool_id + public fun + 0x3::staking_pool staked_sui_amount public fun 0x3::staking_pool @@ -79,6 +100,15 @@ is_preactive is_inactive public fun 0x3::staking_pool +fungible_staked_sui_value + public fun + 0x3::staking_pool +split_fungible_staked_sui + public fun + 0x3::staking_pool +join_fungible_staked_sui + public fun + 0x3::staking_pool split public fun 0x3::staking_pool @@ -154,6 +184,12 @@ adjust_stake_and_gas_price request_add_stake public(package) fun 0x3::validator +convert_to_fungible_staked_sui + public(package) fun + 0x3::validator +redeem_fungible_staked_sui + public(package) fun + 0x3::validator request_add_stake_at_genesis public(package) fun 0x3::validator @@ -457,6 +493,12 @@ request_add_stake request_withdraw_stake public(package) fun 0x3::validator_set +convert_to_fungible_staked_sui + public(package) fun + 0x3::validator_set +redeem_fungible_staked_sui + public(package) fun + 0x3::validator_set request_set_commission_rate public(package) fun 0x3::validator_set @@ -697,6 +739,12 @@ request_add_stake_mul_coin request_withdraw_stake public(package) fun 0x3::sui_system_state_inner +convert_to_fungible_staked_sui + public(package) fun + 0x3::sui_system_state_inner +redeem_fungible_staked_sui + public(package) fun + 0x3::sui_system_state_inner report_validator public(package) fun 0x3::sui_system_state_inner @@ -856,6 +904,12 @@ request_add_stake_mul_coin request_withdraw_stake public entry fun 0x3::sui_system +convert_to_fungible_staked_sui + public fun + 0x3::sui_system +redeem_fungible_staked_sui + public fun + 0x3::sui_system request_withdraw_stake_non_entry public fun 0x3::sui_system