Skip to content

Commit ca11c5a

Browse files
test: refactor calculate rewards test util functions (#38)
1 parent 29b6f24 commit ca11c5a

File tree

1 file changed

+125
-54
lines changed

1 file changed

+125
-54
lines changed

src/test_utils.cairo

Lines changed: 125 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ use staking::staking::objects::{
5151
NormalizedAmountTrait,
5252
};
5353
use staking::staking::staking::Staking::{COMMISSION_DENOMINATOR, DEFAULT_EXIT_WAIT_WINDOW};
54+
use staking::staking::tests::interface_v1::{
55+
IStakingV1ForTestsDispatcher, IStakingV1ForTestsDispatcherTrait,
56+
};
5457
use staking::staking::utils::compute_commission_amount_rounded_down;
5558
use 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.
10861120
pub(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.
11871258
pub(crate) fn calculate_pool_member_rewards(
11881259
pool_rewards: Amount, pool_member_balance: Amount, pool_balance: Amount,

0 commit comments

Comments
 (0)