Skip to content

Commit 896682d

Browse files
0xmovsesmusitdev
andauthored
Cherry pick MIP-124 (#227) (#236)
Based on [MIP-124](movement-network/MIP#124). Implements these changes: https://www.notion.so/movementlabs/Staking-reward-using-GGP-28118675b2d780848e30c0c7e51d47cc In the folder `aptos-move/framework/aptos-framework` run `aptos move test` to run all test. Or `aptos move test -f stake `to run stake related tests. --------- See the #227 original PR --------- Co-authored-by: musitdev <philippe.delrieu@free.fr>
1 parent a62518c commit 896682d

23 files changed

Lines changed: 1314 additions & 162 deletions

File tree

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1694,6 +1694,15 @@ The function is disabled or hasn't been enabled.
16941694

16951695

16961696

1697+
<a id="0x1_delegation_pool_MODULE_SALT"></a>
1698+
1699+
1700+
1701+
<pre><code><b>const</b> <a href="delegation_pool.md#0x1_delegation_pool_MODULE_SALT">MODULE_SALT</a>: <a href="../../aptos-stdlib/../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt; = [97, 112, 116, 111, 115, 95, 102, 114, 97, 109, 101, 119, 111, 114, 107, 58, 58, 100, 101, 108, 101, 103, 97, 116, 105, 111, 110, 95, 112, 111, 111, 108];
1702+
</code></pre>
1703+
1704+
1705+
16971706
<a id="0x1_delegation_pool_ENOT_OPERATOR"></a>
16981707

16991708
The account is not the operator of the stake pool.
@@ -2012,15 +2021,6 @@ This constraint is not enforced on inactive pools as they only allow redeems
20122021

20132022

20142023

2015-
<a id="0x1_delegation_pool_MODULE_SALT"></a>
2016-
2017-
2018-
2019-
<pre><code><b>const</b> <a href="delegation_pool.md#0x1_delegation_pool_MODULE_SALT">MODULE_SALT</a>: <a href="../../aptos-stdlib/../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt; = [97, 112, 116, 111, 115, 95, 102, 114, 97, 109, 101, 119, 111, 114, 107, 58, 58, 100, 101, 108, 101, 103, 97, 116, 105, 111, 110, 95, 112, 111, 111, 108];
2020-
</code></pre>
2021-
2022-
2023-
20242024
<a id="0x1_delegation_pool_NULL_SHAREHOLDER"></a>
20252025

20262026
Special shareholder temporarily owning the <code>add_stake</code> fees charged during this epoch.

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

Lines changed: 256 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,28 @@
55

66

77

8+
- [Struct `WithdrawStakingRewardEvent`](#0x1_governed_gas_pool_WithdrawStakingRewardEvent)
89
- [Resource `GovernedGasPool`](#0x1_governed_gas_pool_GovernedGasPool)
10+
- [Resource `GovernedGasPoolExtension`](#0x1_governed_gas_pool_GovernedGasPoolExtension)
911
- [Constants](#@Constants_0)
1012
- [Function `primary_fungible_store_address`](#0x1_governed_gas_pool_primary_fungible_store_address)
1113
- [Function `create_resource_account_seed`](#0x1_governed_gas_pool_create_resource_account_seed)
1214
- [Function `initialize`](#0x1_governed_gas_pool_initialize)
15+
- [Function `initialize_governed_gas_pool_extension`](#0x1_governed_gas_pool_initialize_governed_gas_pool_extension)
1316
- [Function `init_module`](#0x1_governed_gas_pool_init_module)
1417
- [Function `governed_gas_signer`](#0x1_governed_gas_pool_governed_gas_signer)
1518
- [Function `governed_gas_pool_address`](#0x1_governed_gas_pool_governed_gas_pool_address)
19+
- [Function `get_treasury_deposited`](#0x1_governed_gas_pool_get_treasury_deposited)
1620
- [Function `fund`](#0x1_governed_gas_pool_fund)
1721
- [Function `deposit`](#0x1_governed_gas_pool_deposit)
1822
- [Function `deposit_from`](#0x1_governed_gas_pool_deposit_from)
1923
- [Function `deposit_from_fungible_store`](#0x1_governed_gas_pool_deposit_from_fungible_store)
2024
- [Function `deposit_gas_fee`](#0x1_governed_gas_pool_deposit_gas_fee)
2125
- [Function `deposit_gas_fee_v2`](#0x1_governed_gas_pool_deposit_gas_fee_v2)
26+
- [Function `deposit_treasury`](#0x1_governed_gas_pool_deposit_treasury)
2227
- [Function `get_balance`](#0x1_governed_gas_pool_get_balance)
28+
- [Function `withdraw_staking_reward`](#0x1_governed_gas_pool_withdraw_staking_reward)
29+
- [Function `register_coin`](#0x1_governed_gas_pool_register_coin)
2330
- [Specification](#@Specification_1)
2431
- [Function `initialize`](#@Specification_1_initialize)
2532
- [Function `fund`](#@Specification_1_fund)
@@ -31,6 +38,8 @@
3138
<b>use</b> <a href="aptos_account.md#0x1_aptos_account">0x1::aptos_account</a>;
3239
<b>use</b> <a href="aptos_coin.md#0x1_aptos_coin">0x1::aptos_coin</a>;
3340
<b>use</b> <a href="coin.md#0x1_coin">0x1::coin</a>;
41+
<b>use</b> <a href="../../aptos-stdlib/../move-stdlib/doc/error.md#0x1_error">0x1::error</a>;
42+
<b>use</b> <a href="event.md#0x1_event">0x1::event</a>;
3443
<b>use</b> <a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features">0x1::features</a>;
3544
<b>use</b> <a href="fungible_asset.md#0x1_fungible_asset">0x1::fungible_asset</a>;
3645
<b>use</b> <a href="object.md#0x1_object">0x1::object</a>;
@@ -41,6 +50,34 @@
4150

4251

4352

53+
<a id="0x1_governed_gas_pool_WithdrawStakingRewardEvent"></a>
54+
55+
## Struct `WithdrawStakingRewardEvent`
56+
57+
Event emitted when token are withdraw from the pool
58+
59+
60+
<pre><code><b>struct</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_WithdrawStakingRewardEvent">WithdrawStakingRewardEvent</a> <b>has</b> drop, store
61+
</code></pre>
62+
63+
64+
65+
<details>
66+
<summary>Fields</summary>
67+
68+
69+
<dl>
70+
<dt>
71+
<code>amount: u64</code>
72+
</dt>
73+
<dd>
74+
75+
</dd>
76+
</dl>
77+
78+
79+
</details>
80+
4481
<a id="0x1_governed_gas_pool_GovernedGasPool"></a>
4582

4683
## Resource `GovernedGasPool`
@@ -68,13 +105,57 @@ Internally, this is a simply wrapper around a resource account.
68105
</dl>
69106

70107

108+
</details>
109+
110+
<a id="0x1_governed_gas_pool_GovernedGasPoolExtension"></a>
111+
112+
## Resource `GovernedGasPoolExtension`
113+
114+
Contains added variable needed for the GovernedGasPool staking reward update.
115+
116+
117+
<pre><code><b>struct</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPoolExtension">GovernedGasPoolExtension</a> <b>has</b> key
118+
</code></pre>
119+
120+
121+
122+
<details>
123+
<summary>Fields</summary>
124+
125+
126+
<dl>
127+
<dt>
128+
<code>deposited_treasury_counter: u64</code>
129+
</dt>
130+
<dd>
131+
132+
</dd>
133+
<dt>
134+
<code>withdraw_staking_reward_events: <a href="event.md#0x1_event_EventHandle">event::EventHandle</a>&lt;<a href="governed_gas_pool.md#0x1_governed_gas_pool_WithdrawStakingRewardEvent">governed_gas_pool::WithdrawStakingRewardEvent</a>&gt;</code>
135+
</dt>
136+
<dd>
137+
138+
</dd>
139+
</dl>
140+
141+
71142
</details>
72143

73144
<a id="@Constants_0"></a>
74145

75146
## Constants
76147

77148

149+
<a id="0x1_governed_gas_pool_ENO_LONGER_SUPPORTED"></a>
150+
151+
No longer supported.
152+
153+
154+
<pre><code><b>const</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_ENO_LONGER_SUPPORTED">ENO_LONGER_SUPPORTED</a>: u64 = 4;
155+
</code></pre>
156+
157+
158+
78159
<a id="0x1_governed_gas_pool_MODULE_SALT"></a>
79160

80161

@@ -181,6 +262,49 @@ Initializes the governed gas pool around a resource account creation seed.
181262
<b>move_to</b>(aptos_framework, <a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPool">GovernedGasPool</a>{
182263
signer_capability: governed_gas_pool_signer_cap,
183264
});
265+
266+
<b>move_to</b>(aptos_framework, <a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPoolExtension">GovernedGasPoolExtension</a>{
267+
deposited_treasury_counter: 0,
268+
withdraw_staking_reward_events: <a href="account.md#0x1_account_new_event_handle">account::new_event_handle</a>&lt;<a href="governed_gas_pool.md#0x1_governed_gas_pool_WithdrawStakingRewardEvent">WithdrawStakingRewardEvent</a>&gt;(aptos_framework),
269+
});
270+
}
271+
</code></pre>
272+
273+
274+
275+
</details>
276+
277+
<a id="0x1_governed_gas_pool_initialize_governed_gas_pool_extension"></a>
278+
279+
## Function `initialize_governed_gas_pool_extension`
280+
281+
Initializes the governed gas pool extension alone.
282+
@param aptos_framework The signer of the aptos_framework module.
283+
284+
285+
<pre><code><b>public</b> entry <b>fun</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_initialize_governed_gas_pool_extension">initialize_governed_gas_pool_extension</a>(aptos_framework: &<a href="../../aptos-stdlib/../move-stdlib/doc/signer.md#0x1_signer">signer</a>)
286+
</code></pre>
287+
288+
289+
290+
<details>
291+
<summary>Implementation</summary>
292+
293+
294+
<pre><code><b>public</b> entry <b>fun</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_initialize_governed_gas_pool_extension">initialize_governed_gas_pool_extension</a>(
295+
aptos_framework: &<a href="../../aptos-stdlib/../move-stdlib/doc/signer.md#0x1_signer">signer</a>,
296+
) {
297+
<a href="system_addresses.md#0x1_system_addresses_assert_aptos_framework">system_addresses::assert_aptos_framework</a>(aptos_framework);
298+
299+
// <b>return</b> <b>if</b> the governed gas extension <b>has</b> already been initialized
300+
<b>if</b> (<b>exists</b>&lt;<a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPoolExtension">GovernedGasPoolExtension</a>&gt;(<a href="../../aptos-stdlib/../move-stdlib/doc/signer.md#0x1_signer_address_of">signer::address_of</a>(aptos_framework))) {
301+
<b>return</b>
302+
};
303+
304+
<b>move_to</b>(aptos_framework, <a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPoolExtension">GovernedGasPoolExtension</a>{
305+
deposited_treasury_counter: 0,
306+
withdraw_staking_reward_events: <a href="account.md#0x1_account_new_event_handle">account::new_event_handle</a>&lt;<a href="governed_gas_pool.md#0x1_governed_gas_pool_WithdrawStakingRewardEvent">WithdrawStakingRewardEvent</a>&gt;(aptos_framework),
307+
});
184308
}
185309
</code></pre>
186310

@@ -268,6 +392,32 @@ Gets the address of the governed gas pool.
268392

269393

270394

395+
</details>
396+
397+
<a id="0x1_governed_gas_pool_get_treasury_deposited"></a>
398+
399+
## Function `get_treasury_deposited`
400+
401+
Return the amount of treasury deposited.
402+
403+
404+
<pre><code>#[view]
405+
<b>public</b> <b>fun</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_get_treasury_deposited">get_treasury_deposited</a>(): u64
406+
</code></pre>
407+
408+
409+
410+
<details>
411+
<summary>Implementation</summary>
412+
413+
414+
<pre><code><b>public</b> <b>fun</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_get_treasury_deposited">get_treasury_deposited</a>(): u64 <b>acquires</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPoolExtension">GovernedGasPoolExtension</a> {
415+
<b>borrow_global</b>&lt;<a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPoolExtension">GovernedGasPoolExtension</a>&gt;(@aptos_framework).deposited_treasury_counter
416+
}
417+
</code></pre>
418+
419+
420+
271421
</details>
272422

273423
<a id="0x1_governed_gas_pool_fund"></a>
@@ -416,9 +566,8 @@ Deposits gas fees into the governed gas pool.
416566
<summary>Implementation</summary>
417567

418568

419-
<pre><code><b>public</b> <b>fun</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_deposit_gas_fee">deposit_gas_fee</a>(_gas_payer: <b>address</b>, _gas_fee: u64) <b>acquires</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPool">GovernedGasPool</a> {
420-
// get the sender <b>to</b> preserve the signature but do nothing
421-
<a href="governed_gas_pool.md#0x1_governed_gas_pool_governed_gas_pool_address">governed_gas_pool_address</a>();
569+
<pre><code><b>public</b> <b>fun</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_deposit_gas_fee">deposit_gas_fee</a>(_gas_payer: <b>address</b>, _gas_fee: u64) {
570+
<b>abort</b> <a href="../../aptos-stdlib/../move-stdlib/doc/error.md#0x1_error_not_implemented">error::not_implemented</a>(<a href="governed_gas_pool.md#0x1_governed_gas_pool_ENO_LONGER_SUPPORTED">ENO_LONGER_SUPPORTED</a>)
422571
}
423572
</code></pre>
424573

@@ -445,7 +594,7 @@ Deposits gas fees into the governed gas pool.
445594

446595

447596
<pre><code><b>public</b>(<b>friend</b>) <b>fun</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_deposit_gas_fee_v2">deposit_gas_fee_v2</a>(gas_payer: <b>address</b>, gas_fee: u64) <b>acquires</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPool">GovernedGasPool</a> {
448-
<b>if</b> (<a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features_operations_default_to_fa_apt_store_enabled">features::operations_default_to_fa_apt_store_enabled</a>()) {
597+
<b>if</b> (<a href="../../aptos-stdlib/../move-stdlib/doc/features.md#0x1_features_operations_default_to_fa_apt_store_enabled">features::operations_default_to_fa_apt_store_enabled</a>()) {
449598
<a href="governed_gas_pool.md#0x1_governed_gas_pool_deposit_from_fungible_store">deposit_from_fungible_store</a>(gas_payer, gas_fee);
450599
} <b>else</b> {
451600
<a href="governed_gas_pool.md#0x1_governed_gas_pool_deposit_from">deposit_from</a>&lt;AptosCoin&gt;(gas_payer, gas_fee);
@@ -455,6 +604,37 @@ Deposits gas fees into the governed gas pool.
455604

456605

457606

607+
</details>
608+
609+
<a id="0x1_governed_gas_pool_deposit_treasury"></a>
610+
611+
## Function `deposit_treasury`
612+
613+
Deposits from the treasury account. Treasury deposit are recorded.
614+
@param treasury_account The address of the account that paid the treasury.
615+
@param amount The amount of treasury to be deposited.
616+
617+
618+
<pre><code><b>public</b> entry <b>fun</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_deposit_treasury">deposit_treasury</a>(treasury_account: &<a href="../../aptos-stdlib/../move-stdlib/doc/signer.md#0x1_signer">signer</a>, amount: u64)
619+
</code></pre>
620+
621+
622+
623+
<details>
624+
<summary>Implementation</summary>
625+
626+
627+
<pre><code><b>public</b> entry <b>fun</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_deposit_treasury">deposit_treasury</a>(treasury_account: &<a href="../../aptos-stdlib/../move-stdlib/doc/signer.md#0x1_signer">signer</a>, amount: u64) <b>acquires</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPool">GovernedGasPool</a>, <a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPoolExtension">GovernedGasPoolExtension</a> {
628+
<b>let</b> treasury_account_address = <a href="../../aptos-stdlib/../move-stdlib/doc/signer.md#0x1_signer_address_of">signer::address_of</a>(treasury_account);
629+
<a href="governed_gas_pool.md#0x1_governed_gas_pool_deposit_from">deposit_from</a>&lt;AptosCoin&gt;(treasury_account_address, amount);
630+
631+
<b>let</b> ggp = <b>borrow_global_mut</b>&lt;<a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPoolExtension">GovernedGasPoolExtension</a>&gt;(@aptos_framework);
632+
ggp.deposited_treasury_counter = ggp.deposited_treasury_counter + amount;
633+
}
634+
</code></pre>
635+
636+
637+
458638
</details>
459639

460640
<a id="0x1_governed_gas_pool_get_balance"></a>
@@ -483,6 +663,78 @@ Gets the balance of a specified coin type in the governed gas pool.
483663

484664

485665

666+
</details>
667+
668+
<a id="0x1_governed_gas_pool_withdraw_staking_reward"></a>
669+
670+
## Function `withdraw_staking_reward`
671+
672+
Withdraws coins from the governed gas pool.
673+
674+
This function allows friend modules to withdraw a specified amount of a given
675+
<code>CoinType</code> from the governed gas pool. It uses the internal signer of the
676+
governed gas pool to authorize the withdrawal.
677+
678+
@param amount The amount of coins to withdraw from the pool.
679+
@return A <code>Coin&lt;CoinType&gt;</code> resource containing the withdrawn amount.
680+
681+
682+
<pre><code><b>public</b>(<b>friend</b>) <b>fun</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_withdraw_staking_reward">withdraw_staking_reward</a>&lt;CoinType&gt;(amount: u64): <a href="coin.md#0x1_coin_Coin">coin::Coin</a>&lt;CoinType&gt;
683+
</code></pre>
684+
685+
686+
687+
<details>
688+
<summary>Implementation</summary>
689+
690+
691+
<pre><code><b>public</b>(<b>friend</b>) <b>fun</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_withdraw_staking_reward">withdraw_staking_reward</a>&lt;CoinType&gt;(
692+
amount: u64
693+
): Coin&lt;CoinType&gt; <b>acquires</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPool">GovernedGasPool</a>, <a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPoolExtension">GovernedGasPoolExtension</a> {
694+
<b>let</b> balance = <a href="governed_gas_pool.md#0x1_governed_gas_pool_get_balance">get_balance</a>&lt;CoinType&gt;();
695+
<b>assert</b>!(balance &gt;= amount, 0); // insufficient balance
696+
<b>let</b> ggpv2 = <b>borrow_global_mut</b>&lt;<a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPoolExtension">GovernedGasPoolExtension</a>&gt;(@aptos_framework);
697+
698+
<a href="event.md#0x1_event_emit_event">event::emit_event</a>(
699+
&<b>mut</b> ggpv2.withdraw_staking_reward_events,
700+
<a href="governed_gas_pool.md#0x1_governed_gas_pool_WithdrawStakingRewardEvent">WithdrawStakingRewardEvent</a> {
701+
amount,
702+
},
703+
);
704+
705+
// Withdraw reward <a href="coin.md#0x1_coin">coin</a>.
706+
<a href="coin.md#0x1_coin_withdraw">coin::withdraw</a>&lt;CoinType&gt;(&<a href="governed_gas_pool.md#0x1_governed_gas_pool_governed_gas_signer">governed_gas_signer</a>(), amount)
707+
}
708+
</code></pre>
709+
710+
711+
712+
</details>
713+
714+
<a id="0x1_governed_gas_pool_register_coin"></a>
715+
716+
## Function `register_coin`
717+
718+
Register Aptos coin with Governed gas signer.
719+
720+
721+
<pre><code><b>public</b>(<b>friend</b>) <b>fun</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_register_coin">register_coin</a>&lt;CoinType&gt;()
722+
</code></pre>
723+
724+
725+
726+
<details>
727+
<summary>Implementation</summary>
728+
729+
730+
<pre><code><b>public</b>(<b>friend</b>) <b>fun</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_register_coin">register_coin</a>&lt;CoinType&gt;() <b>acquires</b> <a href="governed_gas_pool.md#0x1_governed_gas_pool_GovernedGasPool">GovernedGasPool</a> {
731+
<b>let</b> s = <a href="governed_gas_pool.md#0x1_governed_gas_pool_governed_gas_signer">governed_gas_signer</a>();
732+
<a href="coin.md#0x1_coin_register">coin::register</a>&lt;CoinType&gt;(&s);
733+
}
734+
</code></pre>
735+
736+
737+
486738
</details>
487739

488740
<a id="@Specification_1"></a>

0 commit comments

Comments
 (0)