diff --git a/crates/natives/src/staking.rs b/crates/natives/src/staking.rs index 64fc3a91..7299535a 100644 --- a/crates/natives/src/staking.rs +++ b/crates/natives/src/staking.rs @@ -56,7 +56,7 @@ pub struct NativeStakingContext<'a> { api: &'a dyn StakingAPI, staking_data: StakingData, #[cfg(feature = "testing")] - share_ratios: BTreeMap, BTreeMap>, + share_ratios: BTreeMap, BTreeMap>, } // =========================================================================================== @@ -123,7 +123,7 @@ impl<'a> NativeStakingContext<'a> { &mut self, validator: Vec, metadata: AccountAddress, - share: u64, + share: BigDecimal, amount: u64, ) { match self.share_ratios.get_mut(&validator) { @@ -189,7 +189,7 @@ fn native_delegate( if let Some(ratios) = staking_context.share_ratios.get(&validator) { if let Some(ratio) = ratios.get(&metadata) { return Ok(smallvec![write_big_decimal( - BigDecimal::from(amount) * ratio.0 / ratio.1 + BigDecimal::from(amount) * ratio.0.clone() / ratio.1 )?]); } } @@ -245,7 +245,7 @@ fn native_undelegate( let ratios = staking_context.share_ratios.get(&validator).unwrap(); if ratios.contains_key(&metadata) { let ratio = ratios.get(&metadata).unwrap(); - let amount = (share * ratio.1 / ratio.0) + let amount = (share * ratio.1 / ratio.0.clone()) .to_bigint() .unwrap() .try_into() @@ -299,7 +299,7 @@ fn native_share_to_amount( let ratios = staking_context.share_ratios.get(&validator).unwrap(); if ratios.contains_key(&metadata) { let ratio = ratios.get(&metadata).unwrap(); - let amount = (share.clone() * ratio.1 / ratio.0) + let amount = (share.clone() * ratio.1 / ratio.0.clone()) .to_bigint() .unwrap() .try_into() @@ -343,7 +343,7 @@ fn native_amount_to_share( if ratios.contains_key(&metadata) { let ratio = ratios.get(&metadata).unwrap(); return Ok(smallvec![write_big_decimal( - BigDecimal::from(amount) * ratio.0 / ratio.1 + BigDecimal::from(amount) * ratio.0.clone() / ratio.1 )?]); } } @@ -390,7 +390,7 @@ fn native_test_only_set_staking_share_ratio( debug_assert!(arguments.len() == 4); let amount = safely_pop_arg!(arguments, u64); - let share = safely_pop_arg!(arguments, u64); + let share = read_big_decimal(safely_pop_arg!(arguments, StructRef))?; let metadata = get_metadata_address(&safely_pop_arg!(arguments, StructRef))?; let validator = safely_pop_arg!(arguments, Vector).to_vec_u8()?; diff --git a/precompile/modules/initia_stdlib/sources/staking.move b/precompile/modules/initia_stdlib/sources/staking.move index e97dce80..36d8a96c 100644 --- a/precompile/modules/initia_stdlib/sources/staking.move +++ b/precompile/modules/initia_stdlib/sources/staking.move @@ -1610,7 +1610,7 @@ module initia_std::staking { native public fun set_staking_share_ratio( validator: vector, metadata: &Object, - share: u64, + share: &BigDecimal, amount: u64 ); @@ -1733,7 +1733,7 @@ module initia_std::staking { set_staking_share_ratio( *string::bytes(&validator), &metadata, - 1, + &bigdecimal::one(), 1 ); @@ -1876,7 +1876,7 @@ module initia_std::staking { set_staking_share_ratio( *string::bytes(&validator), &metadata, - 3, + &bigdecimal::from_u64(3), 2 ); @@ -1995,7 +1995,7 @@ module initia_std::staking { set_staking_share_ratio( *string::bytes(&validator), &metadata, - 1, + &bigdecimal::from_u64(1), 1 ); @@ -2152,7 +2152,7 @@ module initia_std::staking { set_staking_share_ratio( *string::bytes(&validator), &metadata, - 1, + &bigdecimal::from_u64(1), 1 ); @@ -2328,7 +2328,7 @@ module initia_std::staking { set_staking_share_ratio( *string::bytes(&validator), &metadata, - 1, + &bigdecimal::from_u64(1), 1 ); @@ -2378,13 +2378,13 @@ module initia_std::staking { set_staking_share_ratio( *string::bytes(&validator1), &metadata, - 1, + &bigdecimal::from_u64(1), 1 ); set_staking_share_ratio( *string::bytes(&validator2), &metadata, - 1, + &bigdecimal::from_u64(1), 1 ); @@ -2549,7 +2549,7 @@ module initia_std::staking { let metadata = staking_metadata_for_test(); let validator = vector::singleton(1u8); - set_staking_share_ratio(validator, &metadata, 100u64, 50u64); + set_staking_share_ratio(validator, &metadata, &bigdecimal::from_u64(100), 50u64); let amount = share_to_amount( @@ -2566,7 +2566,7 @@ module initia_std::staking { let metadata = staking_metadata_for_test(); let validator = vector::singleton(1u8); - set_staking_share_ratio(validator, &metadata, 100u64, 50u64); + set_staking_share_ratio(validator, &metadata, &bigdecimal::from_u64(100), 50u64); let share = amount_to_share(validator, &metadata, 1); assert!(bigdecimal::truncate_u64(share) == 2u64, 0); @@ -2589,7 +2589,7 @@ module initia_std::staking { set_staking_share_ratio( *string::bytes(&validator), &metadata, - 1, + &bigdecimal::from_u64(1), 1 );