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