From ba3f9ef84faa34d406559f00284c7c78fde8a75c Mon Sep 17 00:00:00 2001 From: ronanyeah Date: Wed, 19 Nov 2025 17:39:51 -0600 Subject: [PATCH] Add liquid_staking.net_redemption_amount --- contracts/sources/liquid_staking.move | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/contracts/sources/liquid_staking.move b/contracts/sources/liquid_staking.move index ccc1d63..64e7c3f 100644 --- a/contracts/sources/liquid_staking.move +++ b/contracts/sources/liquid_staking.move @@ -127,6 +127,30 @@ module liquid_staking::liquid_staking { &self.lst } + /// Returns the net SUI amount received when redeeming 1 LST token (after fees). + /// + /// This function calculates how much SUI (in MIST) a user would receive when + /// redeeming 1 LST token (1_000_000_000 of LST), after accounting + /// for redemption fees. + /// + /// A return value of 950_000_000 means 1 LST redeems for 0.95 SUI (after fees) + /// + public fun net_redemption_amount(self: &LiquidStakingInfo): u64 { + let one_lst = 1_000_000_000; + + // Get gross redemption amount: 1 LST = X SUI (before fees) + let gross_sui_amount = self.lst_amount_to_sui_amount(one_lst); + + // Calculate redemption fee + let redeem_fee = self.fee_config().calculate_redeem_fee(gross_sui_amount); + + // Get net SUI amount after fees (protected against underflow) + assert!(gross_sui_amount >= redeem_fee, ERedeemInvariantViolated); + let net_sui_amount = gross_sui_amount - redeem_fee; + + net_sui_amount + } + #[test_only] public fun accrued_spread_fees

(self: &LiquidStakingInfo

): u64 { self.accrued_spread_fees