diff --git a/pallets/subtensor/src/staking/add_stake.rs b/pallets/subtensor/src/staking/add_stake.rs index fe90de270a..740d42d09e 100644 --- a/pallets/subtensor/src/staking/add_stake.rs +++ b/pallets/subtensor/src/staking/add_stake.rs @@ -76,6 +76,7 @@ impl Pallet { tao_staked.saturating_to_num::().into(), T::SwapInterface::max_price().into(), true, + false, )?; // Ok and return. @@ -164,7 +165,15 @@ impl Pallet { // 6. Swap the stake into alpha on the subnet and increase counters. // Emit the staking event. - Self::stake_into_subnet(&hotkey, &coldkey, netuid, tao_staked, limit_price, true)?; + Self::stake_into_subnet( + &hotkey, + &coldkey, + netuid, + tao_staked, + limit_price, + true, + false, + )?; // Ok and return. Ok(()) diff --git a/pallets/subtensor/src/staking/move_stake.rs b/pallets/subtensor/src/staking/move_stake.rs index c81569e49d..589da2b4b8 100644 --- a/pallets/subtensor/src/staking/move_stake.rs +++ b/pallets/subtensor/src/staking/move_stake.rs @@ -350,6 +350,10 @@ impl Pallet { }; if origin_netuid != destination_netuid { + // Any way to charge fees that works + let drop_fee_origin = origin_netuid == NetUid::ROOT; + let drop_fee_destination = !drop_fee_origin; + // do not pay remove fees to avoid double fees in moves transactions let tao_unstaked = Self::unstake_from_subnet( origin_hotkey, @@ -357,7 +361,7 @@ impl Pallet { origin_netuid, move_amount, T::SwapInterface::min_price().into(), - true, + drop_fee_origin, )?; // Stake the unstaked amount into the destination. @@ -376,6 +380,7 @@ impl Pallet { tao_unstaked, T::SwapInterface::max_price().into(), set_limit, + drop_fee_destination, )?; } diff --git a/pallets/subtensor/src/staking/remove_stake.rs b/pallets/subtensor/src/staking/remove_stake.rs index c0311f7f33..fd9a974645 100644 --- a/pallets/subtensor/src/staking/remove_stake.rs +++ b/pallets/subtensor/src/staking/remove_stake.rs @@ -281,6 +281,7 @@ impl Pallet { total_tao_unstaked, T::SwapInterface::max_price().into(), false, // no limit for Root subnet + false, )?; // 5. Done and ok. diff --git a/pallets/subtensor/src/staking/stake_utils.rs b/pallets/subtensor/src/staking/stake_utils.rs index 8dff984099..a44eb67afd 100644 --- a/pallets/subtensor/src/staking/stake_utils.rs +++ b/pallets/subtensor/src/staking/stake_utils.rs @@ -767,9 +767,10 @@ impl Pallet { tao: TaoCurrency, price_limit: TaoCurrency, set_limit: bool, + drop_fees: bool, ) -> Result { // Swap the tao to alpha. - let swap_result = Self::swap_tao_for_alpha(netuid, tao, price_limit, false)?; + let swap_result = Self::swap_tao_for_alpha(netuid, tao, price_limit, drop_fees)?; ensure!(swap_result.amount_paid_out > 0, Error::::AmountTooLow); diff --git a/pallets/subtensor/src/tests/mock.rs b/pallets/subtensor/src/tests/mock.rs index 8aa6fe6cdd..4d99c80d6e 100644 --- a/pallets/subtensor/src/tests/mock.rs +++ b/pallets/subtensor/src/tests/mock.rs @@ -965,6 +965,7 @@ pub fn increase_stake_on_coldkey_hotkey_account( tao_staked, ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); } diff --git a/pallets/subtensor/src/tests/move_stake.rs b/pallets/subtensor/src/tests/move_stake.rs index 46f2a77e27..e49903aa86 100644 --- a/pallets/subtensor/src/tests/move_stake.rs +++ b/pallets/subtensor/src/tests/move_stake.rs @@ -35,6 +35,7 @@ fn test_do_move_success() { stake_amount, ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); let alpha = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet( @@ -111,6 +112,7 @@ fn test_do_move_different_subnets() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); let alpha = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet( @@ -180,6 +182,7 @@ fn test_do_move_nonexistent_subnet() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); let alpha = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet( @@ -283,6 +286,7 @@ fn test_do_move_nonexistent_destination_hotkey() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); @@ -347,6 +351,7 @@ fn test_do_move_partial_stake() { total_stake.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); let alpha = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet( @@ -415,6 +420,7 @@ fn test_do_move_multiple_times() { initial_stake.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); let alpha = @@ -486,6 +492,7 @@ fn test_do_move_wrong_origin() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); let alpha = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet( @@ -552,6 +559,7 @@ fn test_do_move_same_hotkey_fails() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); let alpha = @@ -602,6 +610,7 @@ fn test_do_move_event_emission() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); let alpha = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet( @@ -662,6 +671,7 @@ fn test_do_move_storage_updates() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); @@ -728,6 +738,7 @@ fn test_move_full_amount_same_netuid() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); @@ -795,6 +806,7 @@ fn test_do_move_max_values() { max_stake.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); let alpha = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet( @@ -900,6 +912,7 @@ fn test_do_transfer_success() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); let alpha = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet( @@ -1008,6 +1021,7 @@ fn test_do_transfer_insufficient_stake() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); @@ -1048,6 +1062,7 @@ fn test_do_transfer_wrong_origin() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); @@ -1085,6 +1100,7 @@ fn test_do_transfer_minimum_stake_check() { stake_amount, ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); @@ -1132,6 +1148,7 @@ fn test_do_transfer_different_subnets() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); @@ -1197,6 +1214,7 @@ fn test_do_swap_success() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); let alpha_before = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet( @@ -1304,6 +1322,7 @@ fn test_do_swap_insufficient_stake() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); @@ -1338,6 +1357,7 @@ fn test_do_swap_wrong_origin() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); @@ -1375,6 +1395,7 @@ fn test_do_swap_minimum_stake_check() { total_stake, ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); @@ -1410,6 +1431,7 @@ fn test_do_swap_same_subnet() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); @@ -1454,6 +1476,7 @@ fn test_do_swap_partial_stake() { total_stake_tao.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); let total_stake_alpha = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet( @@ -1505,6 +1528,7 @@ fn test_do_swap_storage_updates() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); @@ -1564,6 +1588,7 @@ fn test_do_swap_multiple_times() { initial_stake.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); @@ -1634,6 +1659,7 @@ fn test_do_swap_allows_non_owned_hotkey() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); let alpha_before = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet( @@ -1781,6 +1807,7 @@ fn test_transfer_stake_rate_limited() { stake_amount.into(), ::SwapInterface::max_price().into(), true, + false, ) .unwrap(); let alpha = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet( @@ -1825,6 +1852,7 @@ fn test_transfer_stake_doesnt_limit_destination_coldkey() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); let alpha = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet( @@ -1870,6 +1898,7 @@ fn test_swap_stake_limits_destination_netuid() { stake_amount.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); let alpha = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet( diff --git a/pallets/subtensor/src/tests/staking.rs b/pallets/subtensor/src/tests/staking.rs index 8345d24fff..38895348cc 100644 --- a/pallets/subtensor/src/tests/staking.rs +++ b/pallets/subtensor/src/tests/staking.rs @@ -864,6 +864,7 @@ fn test_remove_stake_insufficient_liquidity() { amount_staked.into(), ::SwapInterface::max_price().into(), false, + false, ) .unwrap(); @@ -4481,6 +4482,7 @@ fn test_stake_into_subnet_ok() { amount.into(), TaoCurrency::MAX, false, + false, )); let fee_rate = pallet_subtensor_swap::FeeRate::::get(NetUid::from(netuid)) as f64 / u16::MAX as f64; @@ -4534,6 +4536,7 @@ fn test_stake_into_subnet_low_amount() { amount.into(), TaoCurrency::MAX, false, + false, )); let expected_stake = AlphaCurrency::from(((amount as f64) * 0.997 / current_price) as u64); @@ -4581,6 +4584,7 @@ fn test_unstake_from_subnet_low_amount() { amount.into(), TaoCurrency::MAX, false, + false, )); // Remove stake @@ -4694,6 +4698,7 @@ fn test_unstake_from_subnet_prohibitive_limit() { amount.into(), TaoCurrency::MAX, false, + false, )); // Remove stake @@ -4769,6 +4774,7 @@ fn test_unstake_full_amount() { amount.into(), TaoCurrency::MAX, false, + false, )); // Remove stake