@@ -51,6 +51,9 @@ use staking::staking::objects::{
5151 NormalizedAmountTrait ,
5252};
5353use staking :: staking :: staking :: Staking :: {COMMISSION_DENOMINATOR , DEFAULT_EXIT_WAIT_WINDOW };
54+ use staking :: staking :: tests :: interface_v1 :: {
55+ IStakingV1ForTestsDispatcher , IStakingV1ForTestsDispatcherTrait ,
56+ };
5457use staking :: staking :: utils :: compute_commission_amount_rounded_down;
5558use staking :: types :: {
5659 Amount , Commission , Index , InternalPoolMemberInfoLatest , InternalStakerInfoLatest ,
@@ -946,7 +949,47 @@ fn _compute_commission_amount_rounded_up(
946949 . expect_with_err (err : InternalError :: COMMISSION_ISNT_AMOUNT_TYPE )
947950}
948951
949- // ---- Calculate Rewards - V2 -----
952+ // ---- Calculate Rewards - V1 (attestation based) -----
953+
954+ /// Calculate pool rewards for one epoch.
955+ pub (crate ) fn calculate_strk_pool_rewards_v1 (
956+ staker_address : ContractAddress ,
957+ staking_contract : ContractAddress ,
958+ minting_curve_contract : ContractAddress ,
959+ ) -> Amount {
960+ let staking_dispatcher = IStakingDispatcher { contract_address : staking_contract };
961+ let staker_info = staking_dispatcher . staker_info_v1 (: staker_address );
962+ let strk_epoch_rewards = _calculate_current_epoch_rewards_v1 (
963+ : staking_contract , : minting_curve_contract ,
964+ );
965+ let staking_dispatcher = IStakingV1ForTestsDispatcher { contract_address : staking_contract };
966+ let strk_total_stake = staking_dispatcher . get_current_total_staking_power ();
967+ let (_ , pool_rewards ) = _calculate_staker_strk_rewards_with_balances (
968+ amount_own : staker_info . amount_own,
969+ pool_amount : staker_info . pool_info. unwrap (). amount,
970+ commission : staker_info . pool_info. unwrap (). commission,
971+ : strk_epoch_rewards ,
972+ : strk_total_stake ,
973+ );
974+ pool_rewards
975+ }
976+
977+ fn _calculate_current_epoch_rewards_v1 (
978+ staking_contract : ContractAddress , minting_curve_contract : ContractAddress ,
979+ ) -> Amount {
980+ let minting_curve_dispatcher = IMintingCurveDispatcher {
981+ contract_address : minting_curve_contract ,
982+ };
983+ let staking_dispatcher = IStakingDispatcher { contract_address : staking_contract };
984+
985+ let yearly_mint = minting_curve_dispatcher . yearly_mint ();
986+ let epochs_in_year = staking_dispatcher . get_epoch_info (). epochs_in_year ();
987+ let total_rewards = yearly_mint / epochs_in_year . into ();
988+ total_rewards
989+ }
990+
991+
992+ // ---- Calculate Rewards - V2 (BTC, attestation based) -----
950993
951994/// Return staker own rewards and STRK pool rewards.
952995///
@@ -980,38 +1023,18 @@ pub(crate) fn calculate_staker_strk_rewards_with_balances_v2(
9801023 staking_contract : ContractAddress ,
9811024 minting_curve_contract : ContractAddress ,
9821025) -> (Amount , Amount ) {
983- let (strk_epoch_rewards , _ ) = calculate_current_epoch_rewards (
1026+ let (strk_epoch_rewards , _ ) = _calculate_current_epoch_rewards_v2 (
9841027 : staking_contract , : minting_curve_contract ,
9851028 );
9861029 let staking_dispatcher = IStakingDispatcher { contract_address : staking_contract };
9871030 let (strk_curr_total_stake , _ ) = staking_dispatcher . get_current_total_staking_power ();
988- // Calculate staker own rewards.
989- let mut staker_rewards = mul_wide_and_div (
990- lhs : strk_epoch_rewards ,
991- rhs : amount_own ,
992- div : strk_curr_total_stake . to_strk_native_amount (),
1031+ _calculate_staker_strk_rewards_with_balances (
1032+ : amount_own ,
1033+ : pool_amount ,
1034+ : commission ,
1035+ : strk_epoch_rewards ,
1036+ strk_total_stake : strk_curr_total_stake . to_strk_native_amount (),
9931037 )
994- . expect_with_err (err : InternalError :: REWARDS_COMPUTATION_OVERFLOW );
995- // Calculate staker STRK pool rewards.
996- let pool_rewards = {
997- if pool_amount . is_non_zero () {
998- let pool_rewards_including_commission = mul_wide_and_div (
999- lhs : strk_epoch_rewards ,
1000- rhs : pool_amount ,
1001- div : strk_curr_total_stake . to_strk_native_amount (),
1002- )
1003- . expect_with_err (err : InternalError :: REWARDS_COMPUTATION_OVERFLOW );
1004- let commission_rewards = compute_commission_amount_rounded_down (
1005- rewards_including_commission : pool_rewards_including_commission , : commission ,
1006- );
1007- let pool_rewards = pool_rewards_including_commission - commission_rewards ;
1008- staker_rewards += commission_rewards ;
1009- pool_rewards
1010- } else {
1011- Zero :: zero ()
1012- }
1013- };
1014- (staker_rewards , pool_rewards )
10151038}
10161039
10171040/// Calculate pool rewards for one epoch
@@ -1060,7 +1083,7 @@ pub(crate) fn calculate_staker_btc_pool_rewards_v2(
10601083 token_address : ContractAddress ,
10611084) -> (Amount , Amount ) {
10621085 let pool_balance = to_amount_18_decimals (amount : pool_balance , : token_address );
1063- let (_ , btc_epoch_rewards ) = calculate_current_epoch_rewards (
1086+ let (_ , btc_epoch_rewards ) = _calculate_current_epoch_rewards_v2 (
10641087 : staking_contract , : minting_curve_contract ,
10651088 );
10661089 let staking_dispatcher = IStakingDispatcher { contract_address : staking_contract };
@@ -1080,7 +1103,18 @@ pub(crate) fn calculate_staker_btc_pool_rewards_v2(
10801103 (commission_rewards , pool_rewards )
10811104}
10821105
1083- // ---- Calculate Rewards - V3 -----
1106+ fn _calculate_current_epoch_rewards_v2 (
1107+ staking_contract : ContractAddress , minting_curve_contract : ContractAddress ,
1108+ ) -> (Amount , Amount ) {
1109+ let total_rewards = _calculate_current_epoch_rewards_v1 (
1110+ : staking_contract , : minting_curve_contract ,
1111+ );
1112+ let btc_rewards = calculate_btc_rewards (: total_rewards );
1113+ let strk_rewards = total_rewards - btc_rewards ;
1114+ (strk_rewards , btc_rewards )
1115+ }
1116+
1117+ // ---- Calculate Rewards - V3 (consensus rewards) -----
10841118
10851119/// Returns (staker_rewards, pool_rewards) for the given balances and commission.
10861120pub (crate ) fn calculate_staker_strk_rewards_with_balances_v3 (
@@ -1090,7 +1124,7 @@ pub(crate) fn calculate_staker_strk_rewards_with_balances_v3(
10901124 staking_contract : ContractAddress ,
10911125 minting_curve_contract : ContractAddress ,
10921126) -> (Amount , Amount ) {
1093- let (strk_block_rewards , _ ) = calculate_current_block_rewards (
1127+ let (strk_block_rewards , _ ) = _calculate_current_block_rewards_v3 (
10941128 : staking_contract , : minting_curve_contract ,
10951129 );
10961130 let total_stake = amount_own + pool_amount ;
@@ -1119,6 +1153,25 @@ pub(crate) fn calculate_staker_strk_rewards_with_balances_v3(
11191153 (staker_rewards , pool_rewards )
11201154}
11211155
1156+ /// Calculate pool rewards for one epoch.
1157+ pub (crate ) fn calculate_strk_pool_rewards_v3 (
1158+ staker_address : ContractAddress ,
1159+ staking_contract : ContractAddress ,
1160+ minting_curve_contract : ContractAddress ,
1161+ ) -> Amount {
1162+ let staking_dispatcher = IStakingDispatcher { contract_address : staking_contract };
1163+ let staker_info = staking_dispatcher . staker_info_v1 (: staker_address );
1164+ let pool_info = staker_info . pool_info. unwrap ();
1165+ let (_ , pool_rewards ) = calculate_staker_strk_rewards_with_balances_v3 (
1166+ amount_own : staker_info . amount_own,
1167+ pool_amount : pool_info . amount,
1168+ commission : pool_info . commission,
1169+ : staking_contract ,
1170+ : minting_curve_contract ,
1171+ );
1172+ pool_rewards
1173+ }
1174+
11221175/// Returns (staker_commission_rewards, BTC_pool_rewards) for the specified
11231176/// `normalized_pool_balance`, `normalized_staker_total_btc_balance` and `commission`.
11241177///
@@ -1131,7 +1184,7 @@ pub(crate) fn calculate_staker_btc_pool_rewards_v3(
11311184 minting_curve_contract : ContractAddress ,
11321185 token_address : ContractAddress ,
11331186) -> (Amount , Amount ) {
1134- let (_ , btc_block_rewards ) = calculate_current_block_rewards (
1187+ let (_ , btc_block_rewards ) = _calculate_current_block_rewards_v3 (
11351188 : staking_contract , : minting_curve_contract ,
11361189 );
11371190 // Calculate pool rewards including commission.
@@ -1149,31 +1202,11 @@ pub(crate) fn calculate_staker_btc_pool_rewards_v3(
11491202 (commission_rewards , pool_rewards )
11501203}
11511204
1152- // ---- Calculate Rewards - Helpers -----
1153-
1154- /// Used in V2.
1155- fn calculate_current_epoch_rewards (
1156- staking_contract : ContractAddress , minting_curve_contract : ContractAddress ,
1157- ) -> (Amount , Amount ) {
1158- let minting_curve_dispatcher = IMintingCurveDispatcher {
1159- contract_address : minting_curve_contract ,
1160- };
1161- let staking_dispatcher = IStakingDispatcher { contract_address : staking_contract };
1162-
1163- let yearly_mint = minting_curve_dispatcher . yearly_mint ();
1164- let epochs_in_year = staking_dispatcher . get_epoch_info (). epochs_in_year ();
1165- let total_rewards = yearly_mint / epochs_in_year . into ();
1166- let btc_rewards = calculate_btc_rewards (: total_rewards );
1167- let strk_rewards = total_rewards - btc_rewards ;
11681205
1169- (strk_rewards , btc_rewards )
1170- }
1171-
1172- /// Used in V3.
1173- fn calculate_current_block_rewards (
1206+ fn _calculate_current_block_rewards_v3 (
11741207 staking_contract : ContractAddress , minting_curve_contract : ContractAddress ,
11751208) -> (Amount , Amount ) {
1176- let (strk_epoch_rewards , btc_epoch_rewards ) = calculate_current_epoch_rewards (
1209+ let (strk_epoch_rewards , btc_epoch_rewards ) = _calculate_current_epoch_rewards_v2 (
11771210 : staking_contract , : minting_curve_contract ,
11781211 );
11791212 let staking_dispatcher = IStakingDispatcher { contract_address : staking_contract };
@@ -1183,6 +1216,44 @@ fn calculate_current_block_rewards(
11831216 (strk_block_rewards , btc_block_rewards )
11841217}
11851218
1219+ // ---- Calculate Rewards - Helpers -----
1220+
1221+ /// Used in V1 and V2.
1222+ /// Return staker own rewards and STRK pool rewards for the given balances and commission.
1223+ ///
1224+ /// Precondition: `strk_total_stake` is not zero.
1225+ pub (crate ) fn _calculate_staker_strk_rewards_with_balances (
1226+ amount_own : Amount ,
1227+ pool_amount : Amount ,
1228+ commission : Commission ,
1229+ strk_epoch_rewards : Amount ,
1230+ strk_total_stake : Amount ,
1231+ ) -> (Amount , Amount ) {
1232+ // Calculate staker own rewards.
1233+ let mut staker_rewards = mul_wide_and_div (
1234+ lhs : strk_epoch_rewards , rhs : amount_own , div : strk_total_stake ,
1235+ )
1236+ . expect_with_err (err : InternalError :: REWARDS_COMPUTATION_OVERFLOW );
1237+ // Calculate staker STRK pool rewards.
1238+ let pool_rewards = {
1239+ if pool_amount . is_non_zero () {
1240+ let pool_rewards_including_commission = mul_wide_and_div (
1241+ lhs : strk_epoch_rewards , rhs : pool_amount , div : strk_total_stake ,
1242+ )
1243+ . expect_with_err (err : InternalError :: REWARDS_COMPUTATION_OVERFLOW );
1244+ let commission_rewards = compute_commission_amount_rounded_down (
1245+ rewards_including_commission : pool_rewards_including_commission , : commission ,
1246+ );
1247+ let pool_rewards = pool_rewards_including_commission - commission_rewards ;
1248+ staker_rewards += commission_rewards ;
1249+ pool_rewards
1250+ } else {
1251+ Zero :: zero ()
1252+ }
1253+ };
1254+ (staker_rewards , pool_rewards )
1255+ }
1256+
11861257/// Calculate pool member rewards given the pool rewards, pool member balance and pool balance.
11871258pub (crate ) fn calculate_pool_member_rewards (
11881259 pool_rewards : Amount , pool_member_balance : Amount , pool_balance : Amount ,
0 commit comments