Skip to content

Commit 266953e

Browse files
committed
Refactor reward rate calculation
1 parent d6c5b95 commit 266953e

File tree

12 files changed

+153
-71
lines changed

12 files changed

+153
-71
lines changed

aptos-move/e2e-move-tests/src/tests/stake.rs

+23-4
Original file line numberDiff line numberDiff line change
@@ -245,13 +245,12 @@ fn test_staking_rewards() {
245245
rewards_rate_denominator,
246246
);
247247

248-
// Another 0.5 year passed. Rewards rate halves. New rewards rate is 0.5% every epoch.
248+
// Another 0.5 year passed. Rewards rate halves. New rewards after this epoch rate is 0.5% every epoch.
249249
// Both validators propose a block in the current epoch. Both should receive rewards.
250250
harness.new_block_with_metadata(validator_1_address, vec![]);
251251
harness.new_block_with_metadata(validator_2_address, vec![]);
252252
harness.fast_forward(one_year_in_secs / 2);
253253
harness.new_epoch();
254-
rewards_rate = rewards_rate * rewards_rate_decrease_rate_bps / bps_denominator;
255254
update_stake_amount_and_assert_with_errors(
256255
&mut harness,
257256
&mut stake_amount_1,
@@ -266,12 +265,32 @@ fn test_staking_rewards() {
266265
rewards_rate,
267266
rewards_rate_denominator,
268267
);
268+
rewards_rate = rewards_rate * rewards_rate_decrease_rate_bps / bps_denominator;
269269

270+
// Another new epoch, both validators receive rewards in 0.5% every epoch.
270271
// Another year passed. Rewards rate halves but it cannot be lower than 0.3%.
271-
// New rewards rate is 0.3% every epoch.
272+
// New rewards rate of the next epoch is 0.3% every epoch.
273+
harness.new_block_with_metadata(validator_1_address, vec![]);
274+
harness.new_block_with_metadata(validator_2_address, vec![]);
275+
harness.fast_forward(one_year_in_secs);
276+
harness.new_epoch();
277+
update_stake_amount_and_assert_with_errors(
278+
&mut harness,
279+
&mut stake_amount_1,
280+
validator_1_address,
281+
rewards_rate,
282+
rewards_rate_denominator,
283+
);
284+
update_stake_amount_and_assert_with_errors(
285+
&mut harness,
286+
&mut stake_amount_2,
287+
validator_2_address,
288+
rewards_rate,
289+
rewards_rate_denominator,
290+
);
291+
272292
// Validator 1 misses one proposal but has one successful so they receive half of the rewards.
273293
harness.new_block_with_metadata(validator_1_address, vec![index_1]);
274-
harness.fast_forward(one_year_in_secs);
275294
harness.new_epoch();
276295
rewards_rate = min_rewards_rate / 2;
277296
update_stake_amount_and_assert_with_errors(

aptos-move/framework/aptos-framework/doc/gas_schedule.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ This can be called by on-chain governance to update the gas schedule.
319319

320320

321321

322-
<pre><code><b>pragma</b> timeout = 60;
322+
<pre><code><b>pragma</b> timeout = 100;
323323
<b>requires</b> <b>exists</b>&lt;<a href="stake.md#0x1_stake_ValidatorFees">stake::ValidatorFees</a>&gt;(@aptos_framework);
324324
<b>requires</b> <b>exists</b>&lt;CoinInfo&lt;AptosCoin&gt;&gt;(@aptos_framework);
325325
<b>include</b> <a href="system_addresses.md#0x1_system_addresses_AbortsIfNotAptosFramework">system_addresses::AbortsIfNotAptosFramework</a>{ <a href="account.md#0x1_account">account</a>: aptos_framework };

aptos-move/framework/aptos-framework/doc/stake.md

+7-18
Original file line numberDiff line numberDiff line change
@@ -3060,6 +3060,11 @@ power.
30603060

30613061
validator_index = validator_index + 1;
30623062
};
3063+
3064+
<b>if</b> (<a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features_periodical_reward_rate_decrease_enabled">features::periodical_reward_rate_decrease_enabled</a>()) {
3065+
// Update rewards rate after reward distribution.
3066+
<a href="staking_config.md#0x1_staking_config_calculate_and_save_latest_epoch_rewards_rate">staking_config::calculate_and_save_latest_epoch_rewards_rate</a>();
3067+
};
30633068
}
30643069
</code></pre>
30653070

@@ -3102,23 +3107,7 @@ This function shouldn't abort.
31023107
<b>assume</b> cur_validator_perf.successful_proposals + cur_validator_perf.failed_proposals &lt;= <a href="stake.md#0x1_stake_MAX_U64">MAX_U64</a>;
31033108
};
31043109
<b>let</b> num_total_proposals = cur_validator_perf.successful_proposals + cur_validator_perf.failed_proposals;
3105-
<b>let</b> (rewards_rate, rewards_rate_denominator) = <b>if</b> (<a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features_periodical_reward_rate_decrease_enabled">features::periodical_reward_rate_decrease_enabled</a>()) {
3106-
<b>let</b> epoch_rewards_rate = <a href="staking_config.md#0x1_staking_config_calculate_and_save_latest_epoch_rewards_rate">staking_config::calculate_and_save_latest_epoch_rewards_rate</a>();
3107-
<b>if</b> (<a href="../../aptos-stdlib/doc/fixed_point64.md#0x1_fixed_point64_is_zero">fixed_point64::is_zero</a>(epoch_rewards_rate)) {
3108-
(0u64, 1u64)
3109-
} <b>else</b> {
3110-
// Maximize denominator for higher precision.
3111-
// Restriction: nominator &lt;= <a href="stake.md#0x1_stake_MAX_REWARDS_RATE">MAX_REWARDS_RATE</a> && denominator &lt;= <a href="stake.md#0x1_stake_MAX_U64">MAX_U64</a>
3112-
<b>let</b> denominator = <a href="../../aptos-stdlib/doc/fixed_point64.md#0x1_fixed_point64_divide_u128">fixed_point64::divide_u128</a>((<a href="stake.md#0x1_stake_MAX_REWARDS_RATE">MAX_REWARDS_RATE</a> <b>as</b> u128), epoch_rewards_rate);
3113-
<b>if</b> (denominator &gt; <a href="stake.md#0x1_stake_MAX_U64">MAX_U64</a>) {
3114-
denominator = <a href="stake.md#0x1_stake_MAX_U64">MAX_U64</a>
3115-
};
3116-
<b>let</b> nominator = (<a href="../../aptos-stdlib/doc/fixed_point64.md#0x1_fixed_point64_multiply_u128">fixed_point64::multiply_u128</a>(denominator, epoch_rewards_rate) <b>as</b> u64);
3117-
(nominator, (denominator <b>as</b> u64))
3118-
}
3119-
} <b>else</b> {
3120-
<a href="staking_config.md#0x1_staking_config_get_reward_rate">staking_config::get_reward_rate</a>(<a href="staking_config.md#0x1_staking_config">staking_config</a>)
3121-
};
3110+
<b>let</b> (rewards_rate, rewards_rate_denominator) = <a href="staking_config.md#0x1_staking_config_get_reward_rate">staking_config::get_reward_rate</a>(<a href="staking_config.md#0x1_staking_config">staking_config</a>);
31223111
<b>let</b> rewards_active = <a href="stake.md#0x1_stake_distribute_rewards">distribute_rewards</a>(
31233112
&<b>mut</b> stake_pool.active,
31243113
num_successful_proposals,
@@ -4229,7 +4218,7 @@ Returns validator's next epoch voting power, including pending_active, active, a
42294218
<b>requires</b> <b>exists</b>&lt;<a href="stake.md#0x1_stake_ValidatorPerformance">ValidatorPerformance</a>&gt;(@aptos_framework);
42304219
<b>requires</b> <b>exists</b>&lt;<a href="stake.md#0x1_stake_ValidatorSet">ValidatorSet</a>&gt;(@aptos_framework);
42314220
<b>requires</b> <b>exists</b>&lt;StakingConfig&gt;(@aptos_framework);
4232-
<b>requires</b> <b>exists</b>&lt;StakingRewardsConfig&gt;(@aptos_framework) || !<a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features_spec_reward_rate_decrease_enabled">features::spec_reward_rate_decrease_enabled</a>();
4221+
<b>requires</b> <b>exists</b>&lt;StakingRewardsConfig&gt;(@aptos_framework) || !<a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features_spec_periodical_reward_rate_decrease_enabled">features::spec_periodical_reward_rate_decrease_enabled</a>();
42334222
<b>requires</b> <b>exists</b>&lt;<a href="timestamp.md#0x1_timestamp_CurrentTimeMicroseconds">timestamp::CurrentTimeMicroseconds</a>&gt;(@aptos_framework);
42344223
<b>requires</b> <b>exists</b>&lt;<a href="stake.md#0x1_stake_ValidatorFees">ValidatorFees</a>&gt;(@aptos_framework);
42354224
}

aptos-move/framework/aptos-framework/doc/staking_config.md

+33-9
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,15 @@ Staking reward configurations that will be stored with the @aptos_framework acco
175175
## Constants
176176

177177

178+
<a name="0x1_staking_config_MAX_U64"></a>
179+
180+
181+
182+
<pre><code><b>const</b> <a href="staking_config.md#0x1_staking_config_MAX_U64">MAX_U64</a>: u128 = 18446744073709551615;
183+
</code></pre>
184+
185+
186+
178187
<a name="0x1_staking_config_BPS_DENOMINATOR"></a>
179188

180189
Denominator of number in basis points. 1 bps(basis points) = 0.01%.
@@ -536,8 +545,7 @@ withdraw all funds).
536545

537546
## Function `get_reward_rate`
538547

539-
DEPRECATING
540-
Return the reward rate.
548+
Return the reward rate of this epoch.
541549

542550

543551
<pre><code><b>public</b> <b>fun</b> <a href="staking_config.md#0x1_staking_config_get_reward_rate">get_reward_rate</a>(config: &<a href="staking_config.md#0x1_staking_config_StakingConfig">staking_config::StakingConfig</a>): (u64, u64)
@@ -549,9 +557,25 @@ Return the reward rate.
549557
<summary>Implementation</summary>
550558

551559

552-
<pre><code><b>public</b> <b>fun</b> <a href="staking_config.md#0x1_staking_config_get_reward_rate">get_reward_rate</a>(config: &<a href="staking_config.md#0x1_staking_config_StakingConfig">StakingConfig</a>): (u64, u64) {
553-
<b>assert</b>!(!<a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features_periodical_reward_rate_decrease_enabled">features::periodical_reward_rate_decrease_enabled</a>(), <a href="staking_config.md#0x1_staking_config_EDEPRECATED_FUNCTION">EDEPRECATED_FUNCTION</a>);
554-
(config.rewards_rate, config.rewards_rate_denominator)
560+
<pre><code><b>public</b> <b>fun</b> <a href="staking_config.md#0x1_staking_config_get_reward_rate">get_reward_rate</a>(config: &<a href="staking_config.md#0x1_staking_config_StakingConfig">StakingConfig</a>): (u64, u64) <b>acquires</b> <a href="staking_config.md#0x1_staking_config_StakingRewardsConfig">StakingRewardsConfig</a> {
561+
<b>let</b> (rewards_rate, rewards_rate_denominator) = <b>if</b> (<a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features_periodical_reward_rate_decrease_enabled">features::periodical_reward_rate_decrease_enabled</a>()) {
562+
<b>let</b> epoch_rewards_rate = <b>borrow_global</b>&lt;<a href="staking_config.md#0x1_staking_config_StakingRewardsConfig">StakingRewardsConfig</a>&gt;(@aptos_framework).rewards_rate;
563+
<b>if</b> (<a href="../../aptos-stdlib/doc/fixed_point64.md#0x1_fixed_point64_is_zero">fixed_point64::is_zero</a>(epoch_rewards_rate)) {
564+
(0u64, 1u64)
565+
} <b>else</b> {
566+
// Maximize denominator for higher precision.
567+
// Restriction: nominator &lt;= <a href="staking_config.md#0x1_staking_config_MAX_REWARDS_RATE">MAX_REWARDS_RATE</a> && denominator &lt;= <a href="staking_config.md#0x1_staking_config_MAX_U64">MAX_U64</a>
568+
<b>let</b> denominator = <a href="../../aptos-stdlib/doc/fixed_point64.md#0x1_fixed_point64_divide_u128">fixed_point64::divide_u128</a>((<a href="staking_config.md#0x1_staking_config_MAX_REWARDS_RATE">MAX_REWARDS_RATE</a> <b>as</b> u128), epoch_rewards_rate);
569+
<b>if</b> (denominator &gt; <a href="staking_config.md#0x1_staking_config_MAX_U64">MAX_U64</a>) {
570+
denominator = <a href="staking_config.md#0x1_staking_config_MAX_U64">MAX_U64</a>
571+
};
572+
<b>let</b> nominator = (<a href="../../aptos-stdlib/doc/fixed_point64.md#0x1_fixed_point64_multiply_u128">fixed_point64::multiply_u128</a>(denominator, epoch_rewards_rate) <b>as</b> u64);
573+
(nominator, (denominator <b>as</b> u64))
574+
}
575+
} <b>else</b> {
576+
(config.rewards_rate, config.rewards_rate_denominator)
577+
};
578+
(rewards_rate, rewards_rate_denominator)
555579
}
556580
</code></pre>
557581

@@ -1146,7 +1170,7 @@ StakingRewardsConfig does not exist under the aptos_framework before creating it
11461170

11471171

11481172

1149-
<pre><code><b>aborts_if</b> <a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features_spec_reward_rate_decrease_enabled">features::spec_reward_rate_decrease_enabled</a>();
1173+
<pre><code><b>include</b> <a href="staking_config.md#0x1_staking_config_StakingRewardsConfigRequirement">StakingRewardsConfigRequirement</a>;
11501174
</code></pre>
11511175

11521176

@@ -1163,7 +1187,7 @@ StakingRewardsConfig does not exist under the aptos_framework before creating it
11631187

11641188

11651189
<pre><code><b>aborts_if</b> !<b>exists</b>&lt;<a href="staking_config.md#0x1_staking_config_StakingRewardsConfig">StakingRewardsConfig</a>&gt;(@aptos_framework);
1166-
<b>aborts_if</b> !<a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features_spec_reward_rate_decrease_enabled">features::spec_reward_rate_decrease_enabled</a>();
1190+
<b>aborts_if</b> !<a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features_spec_periodical_reward_rate_decrease_enabled">features::spec_periodical_reward_rate_decrease_enabled</a>();
11671191
<b>include</b> <a href="staking_config.md#0x1_staking_config_StakingRewardsConfigRequirement">StakingRewardsConfigRequirement</a>;
11681192
</code></pre>
11691193

@@ -1180,7 +1204,7 @@ StakingRewardsConfig does not exist under the aptos_framework before creating it
11801204

11811205

11821206

1183-
<pre><code><b>requires</b> <a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features_spec_reward_rate_decrease_enabled">features::spec_reward_rate_decrease_enabled</a>();
1207+
<pre><code><b>requires</b> <a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features_spec_periodical_reward_rate_decrease_enabled">features::spec_periodical_reward_rate_decrease_enabled</a>();
11841208
<b>include</b> <a href="staking_config.md#0x1_staking_config_StakingRewardsConfigRequirement">StakingRewardsConfigRequirement</a>;
11851209
<b>aborts_if</b> !<b>exists</b>&lt;<a href="staking_config.md#0x1_staking_config_StakingRewardsConfig">StakingRewardsConfig</a>&gt;(@aptos_framework);
11861210
</code></pre>
@@ -1247,7 +1271,7 @@ The <code>rewards_rate</code> which is the numerator is limited to be <code>&lt;
12471271
rewards_rate/rewards_rate_denominator <= 1.
12481272

12491273

1250-
<pre><code><b>aborts_if</b> <a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features_spec_reward_rate_decrease_enabled">features::spec_reward_rate_decrease_enabled</a>();
1274+
<pre><code><b>aborts_if</b> <a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features_spec_periodical_reward_rate_decrease_enabled">features::spec_periodical_reward_rate_decrease_enabled</a>();
12511275
<b>let</b> addr = <a href="../../aptos-stdlib/../move-stdlib/doc/signer.md#0x1_signer_address_of">signer::address_of</a>(aptos_framework);
12521276
<b>aborts_if</b> addr != @aptos_framework;
12531277
<b>aborts_if</b> new_rewards_rate_denominator &lt;= 0;

aptos-move/framework/aptos-framework/sources/configs/gas_schedule.spec.move

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ spec aptos_framework::gas_schedule {
4444
use aptos_framework::transaction_fee;
4545
use aptos_framework::staking_config;
4646

47-
pragma timeout = 60;
47+
pragma timeout = 100;
4848

4949
requires exists<stake::ValidatorFees>(@aptos_framework);
5050
requires exists<CoinInfo<AptosCoin>>(@aptos_framework);

aptos-move/framework/aptos-framework/sources/configs/staking_config.move

+22-5
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ module aptos_framework::staking_config {
4242
/// 1 year => 365 * 24 * 60 * 60
4343
const ONE_YEAR_IN_SECS: u64 = 31536000;
4444

45+
const MAX_U64: u128 = 18446744073709551615;
46+
4547

4648
/// Validator set configurations that will be stored with the @aptos_framework account.
4749
struct StakingConfig has copy, drop, key {
@@ -184,11 +186,26 @@ module aptos_framework::staking_config {
184186
config.recurring_lockup_duration_secs
185187
}
186188

187-
/// DEPRECATING
188-
/// Return the reward rate.
189-
public fun get_reward_rate(config: &StakingConfig): (u64, u64) {
190-
assert!(!features::periodical_reward_rate_decrease_enabled(), EDEPRECATED_FUNCTION);
191-
(config.rewards_rate, config.rewards_rate_denominator)
189+
/// Return the reward rate of this epoch.
190+
public fun get_reward_rate(config: &StakingConfig): (u64, u64) acquires StakingRewardsConfig {
191+
let (rewards_rate, rewards_rate_denominator) = if (features::periodical_reward_rate_decrease_enabled()) {
192+
let epoch_rewards_rate = borrow_global<StakingRewardsConfig>(@aptos_framework).rewards_rate;
193+
if (fixed_point64::is_zero(epoch_rewards_rate)) {
194+
(0u64, 1u64)
195+
} else {
196+
// Maximize denominator for higher precision.
197+
// Restriction: nominator <= MAX_REWARDS_RATE && denominator <= MAX_U64
198+
let denominator = fixed_point64::divide_u128((MAX_REWARDS_RATE as u128), epoch_rewards_rate);
199+
if (denominator > MAX_U64) {
200+
denominator = MAX_U64
201+
};
202+
let nominator = (fixed_point64::multiply_u128(denominator, epoch_rewards_rate) as u64);
203+
(nominator, (denominator as u64))
204+
}
205+
} else {
206+
(config.rewards_rate, config.rewards_rate_denominator)
207+
};
208+
(rewards_rate, rewards_rate_denominator)
192209
}
193210

194211
/// Return the joining limit %.

aptos-move/framework/aptos-framework/sources/configs/staking_config.spec.move

+5-5
Original file line numberDiff line numberDiff line change
@@ -79,17 +79,17 @@ spec aptos_framework::staking_config {
7979
}
8080

8181
spec get_reward_rate(config: &StakingConfig): (u64, u64) {
82-
aborts_if features::spec_reward_rate_decrease_enabled();
82+
include StakingRewardsConfigRequirement;
8383
}
8484

8585
spec calculate_and_save_latest_epoch_rewards_rate(): FixedPoint64 {
8686
aborts_if !exists<StakingRewardsConfig>(@aptos_framework);
87-
aborts_if !features::spec_reward_rate_decrease_enabled();
87+
aborts_if !features::spec_periodical_reward_rate_decrease_enabled();
8888
include StakingRewardsConfigRequirement;
8989
}
9090

9191
spec calculate_and_save_latest_rewards_config(): StakingRewardsConfig {
92-
requires features::spec_reward_rate_decrease_enabled();
92+
requires features::spec_periodical_reward_rate_decrease_enabled();
9393
include StakingRewardsConfigRequirement;
9494
aborts_if !exists<StakingRewardsConfig>(@aptos_framework);
9595
}
@@ -134,7 +134,7 @@ spec aptos_framework::staking_config {
134134
new_rewards_rate_denominator: u64,
135135
) {
136136
use std::signer;
137-
aborts_if features::spec_reward_rate_decrease_enabled();
137+
aborts_if features::spec_periodical_reward_rate_decrease_enabled();
138138
let addr = signer::address_of(aptos_framework);
139139
aborts_if addr != @aptos_framework;
140140
aborts_if new_rewards_rate_denominator <= 0;
@@ -209,7 +209,7 @@ spec aptos_framework::staking_config {
209209

210210
spec schema StakingRewardsConfigRequirement {
211211
requires exists<timestamp::CurrentTimeMicroseconds>(@aptos_framework);
212-
include features::spec_reward_rate_decrease_enabled() ==> StakingRewardsConfigEnabledRequirement;
212+
include features::spec_periodical_reward_rate_decrease_enabled() ==> StakingRewardsConfigEnabledRequirement;
213213
}
214214

215215
spec schema StakingRewardsConfigEnabledRequirement {

aptos-move/framework/aptos-framework/sources/delegation_pool.move

+38
Original file line numberDiff line numberDiff line change
@@ -990,6 +990,10 @@ module aptos_framework::delegation_pool {
990990

991991
#[test_only]
992992
use aptos_framework::reconfiguration;
993+
#[test_only]
994+
use aptos_std::fixed_point64;
995+
#[test_only]
996+
use aptos_framework::timestamp::fast_forward_seconds;
993997

994998
#[test_only]
995999
const CONSENSUS_KEY_1: vector<u8> = x"8a54b92288d4ba5073d3a52e80cc00ae9fbbc1cc5b433b46089b7804c38a76f00fc64746c7685ee628fc2d0b929c2294";
@@ -1317,6 +1321,40 @@ module aptos_framework::delegation_pool {
13171321
// stakes should remain the same - `Self::get_stake` correctly calculates them
13181322
synchronize_delegation_pool(pool_address);
13191323
assert_delegation(delegator1_address, pool_address, 11201699216002, 0, 2000000000000);
1324+
1325+
let reward_period_start_time_in_sec = timestamp::now_seconds();
1326+
// Enable rewards rate decrease. Initially rewards rate is still 1% every epoch. Rewards rate halves every year.
1327+
let one_year_in_secs: u64 = 31536000;
1328+
staking_config::initialize_rewards(
1329+
aptos_framework,
1330+
fixed_point64::create_from_rational(2, 100),
1331+
fixed_point64::create_from_rational(6, 1000),
1332+
one_year_in_secs,
1333+
reward_period_start_time_in_sec,
1334+
fixed_point64::create_from_rational(50, 100),
1335+
);
1336+
features::change_feature_flags(aptos_framework, vector[features::get_periodical_reward_rate_decrease_feature()], vector[]);
1337+
1338+
// add more stake from delegator 1
1339+
stake::mint(delegator1, 20000 * ONE_APT);
1340+
let delegator1_pending_inactive: u64;
1341+
(delegator1_active, _, delegator1_pending_inactive) = get_stake(pool_address, delegator1_address);
1342+
fee = get_add_stake_fee(pool_address, 20000 * ONE_APT);
1343+
add_stake(delegator1, pool_address, 20000 * ONE_APT);
1344+
1345+
assert_delegation(delegator1_address, pool_address, delegator1_active + 20000 * ONE_APT - fee, 0, delegator1_pending_inactive);
1346+
1347+
// delegator 1 unlocks his entire newly added stake
1348+
unlock(delegator1, pool_address, 20000 * ONE_APT - fee);
1349+
end_aptos_epoch();
1350+
// delegator 1 should own previous 11201699216002 active * ~1.01253 and 20000 * ~1.01253 + 20000 coins pending_inactive
1351+
assert_delegation(delegator1_address, pool_address, 11342056366822, 0, 4025059974939);
1352+
1353+
// stakes should remain the same - `Self::get_stake` correctly calculates them
1354+
synchronize_delegation_pool(pool_address);
1355+
assert_delegation(delegator1_address, pool_address, 11342056366822, 0, 4025059974939);
1356+
1357+
fast_forward_seconds(one_year_in_secs);
13201358
}
13211359

13221360
#[test(aptos_framework = @aptos_framework, validator = @0x123, delegator = @0x010)]

0 commit comments

Comments
 (0)