Skip to content

Commit 5560a2d

Browse files
authored
high-level spec for resource account (aptos-labs#9033)
1 parent 2e0a21b commit 5560a2d

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,7 @@ the SignerCapability.
418418
<b>include</b> <a href="aptos_account.md#0x1_aptos_account_GuidAbortsIf">aptos_account::GuidAbortsIf</a>&lt;AptosCoin&gt;{<b>to</b>: resource_addr};
419419
<b>include</b> <a href="resource_account.md#0x1_resource_account_RotateAccountAuthenticationKeyAndStoreCapabilityAbortsIfWithoutAccountLimit">RotateAccountAuthenticationKeyAndStoreCapabilityAbortsIfWithoutAccountLimit</a>;
420420
<b>aborts_if</b> <a href="coin.md#0x1_coin_is_account_registered">coin::is_account_registered</a>&lt;AptosCoin&gt;(resource_addr) && coin_store_resource.frozen;
421+
<b>ensures</b> <b>exists</b>&lt;aptos_framework::coin::CoinStore&lt;AptosCoin&gt;&gt;(resource_addr);
421422
</code></pre>
422423

423424

@@ -455,6 +456,9 @@ the SignerCapability.
455456

456457
<pre><code><b>let</b> resource_addr = <a href="../../aptos-stdlib/../move-stdlib/doc/signer.md#0x1_signer_address_of">signer::address_of</a>(resource);
457458
<b>include</b> <a href="resource_account.md#0x1_resource_account_RotateAccountAuthenticationKeyAndStoreCapabilityAbortsIf">RotateAccountAuthenticationKeyAndStoreCapabilityAbortsIf</a>;
459+
<b>ensures</b> <b>exists</b>&lt;<a href="resource_account.md#0x1_resource_account_Container">Container</a>&gt;(<a href="../../aptos-stdlib/../move-stdlib/doc/signer.md#0x1_signer_address_of">signer::address_of</a>(origin));
460+
<b>ensures</b> <a href="../../aptos-stdlib/../move-stdlib/doc/vector.md#0x1_vector_length">vector::length</a>(optional_auth_key) != 0 ==&gt;
461+
<b>global</b>&lt;aptos_framework::account::Account&gt;(resource_addr).authentication_key == optional_auth_key;
458462
</code></pre>
459463

460464

@@ -516,9 +520,11 @@ the SignerCapability.
516520

517521
<pre><code><b>aborts_if</b> !<b>exists</b>&lt;<a href="resource_account.md#0x1_resource_account_Container">Container</a>&gt;(source_addr);
518522
<b>let</b> resource_addr = <a href="../../aptos-stdlib/../move-stdlib/doc/signer.md#0x1_signer_address_of">signer::address_of</a>(resource);
519-
<b>let</b> container = <b>borrow_global_mut</b>&lt;<a href="resource_account.md#0x1_resource_account_Container">Container</a>&gt;(source_addr);
523+
<b>let</b> container = <b>global</b>&lt;<a href="resource_account.md#0x1_resource_account_Container">Container</a>&gt;(source_addr);
520524
<b>aborts_if</b> !<a href="../../aptos-stdlib/doc/simple_map.md#0x1_simple_map_spec_contains_key">simple_map::spec_contains_key</a>(container.store, resource_addr);
521525
<b>aborts_if</b> !<b>exists</b>&lt;<a href="account.md#0x1_account_Account">account::Account</a>&gt;(resource_addr);
526+
<b>ensures</b> <a href="../../aptos-stdlib/doc/simple_map.md#0x1_simple_map_spec_contains_key">simple_map::spec_contains_key</a>(<b>old</b>(<b>global</b>&lt;<a href="resource_account.md#0x1_resource_account_Container">Container</a>&gt;(source_addr)).store, resource_addr) &&
527+
<a href="../../aptos-stdlib/doc/simple_map.md#0x1_simple_map_spec_len">simple_map::spec_len</a>(<b>old</b>(<b>global</b>&lt;<a href="resource_account.md#0x1_resource_account_Container">Container</a>&gt;(source_addr)).store) == 1 ==&gt; !<b>exists</b>&lt;<a href="resource_account.md#0x1_resource_account_Container">Container</a>&gt;(source_addr);
522528
</code></pre>
523529

524530

aptos-move/framework/aptos-framework/sources/resource_account.spec.move

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ spec aptos_framework::resource_account {
3131

3232
//coin property
3333
aborts_if coin::is_account_registered<AptosCoin>(resource_addr) && coin_store_resource.frozen;
34+
ensures exists<aptos_framework::coin::CoinStore<AptosCoin>>(resource_addr);
3435
}
3536

3637
spec create_resource_account_and_publish_package(
@@ -55,6 +56,9 @@ spec aptos_framework::resource_account {
5556
) {
5657
let resource_addr = signer::address_of(resource);
5758
include RotateAccountAuthenticationKeyAndStoreCapabilityAbortsIf;
59+
ensures exists<Container>(signer::address_of(origin));
60+
ensures vector::length(optional_auth_key) != 0 ==>
61+
global<aptos_framework::account::Account>(resource_addr).authentication_key == optional_auth_key;
5862
}
5963

6064
spec schema RotateAccountAuthenticationKeyAndStoreCapabilityAbortsIf {
@@ -101,8 +105,10 @@ spec aptos_framework::resource_account {
101105
aborts_if !exists<Container>(source_addr);
102106
let resource_addr = signer::address_of(resource);
103107

104-
let container = borrow_global_mut<Container>(source_addr);
108+
let container = global<Container>(source_addr);
105109
aborts_if !simple_map::spec_contains_key(container.store, resource_addr);
106110
aborts_if !exists<account::Account>(resource_addr);
111+
ensures simple_map::spec_contains_key(old(global<Container>(source_addr)).store, resource_addr) &&
112+
simple_map::spec_len(old(global<Container>(source_addr)).store) == 1 ==> !exists<Container>(source_addr);
107113
}
108114
}

0 commit comments

Comments
 (0)