From bc91a409f125a38e0bc329676c3d0224e6ba4a18 Mon Sep 17 00:00:00 2001 From: whst Date: Fri, 8 Apr 2022 08:40:59 +0800 Subject: [PATCH 1/2] Update stdlib spec, remove redundant spec funcs and improve coding style --- build/StarcoinFramework/BuildInfo.yaml | 2 +- .../bytecode_modules/Arith.mv | Bin 414 -> 468 bytes .../bytecode_modules/IdentifierNFT.mv | Bin 1118 -> 1138 bytes .../StarcoinFramework/bytecode_modules/NFT.mv | Bin 4144 -> 4178 bytes .../bytecode_modules/U256.mv | Bin 1503 -> 1531 bytes build/StarcoinFramework/docs/Account.md | 8 +- build/StarcoinFramework/docs/Block.md | 14 +- build/StarcoinFramework/docs/ChainId.md | 30 +- .../StarcoinFramework/docs/ConsensusConfig.md | 8 +- .../docs/ConsensusStrategy.md | 4 +- build/StarcoinFramework/docs/CoreAddresses.md | 41 +-- build/StarcoinFramework/docs/Dao.md | 6 +- build/StarcoinFramework/docs/Epoch.md | 24 +- build/StarcoinFramework/docs/FixedPoint32.md | 128 ++++++-- .../docs/GenesisSignerCapability.md | 7 +- .../StarcoinFramework/docs/MintDaoProposal.md | 2 +- .../docs/ModifyDaoConfigProposal.md | 2 +- build/StarcoinFramework/docs/NFT.md | 5 +- .../docs/OnChainConfigDao.md | 2 +- .../docs/PackageTxnManager.md | 4 +- build/StarcoinFramework/docs/Timestamp.md | 26 +- .../StarcoinFramework/docs/TransactionFee.md | 6 +- .../docs/TransactionManager.md | 2 +- .../docs/TransactionPublishOption.md | 4 +- .../docs/TransactionTimeout.md | 12 +- .../docs/TransactionTimeoutConfig.md | 2 +- build/StarcoinFramework/docs/Treasury.md | 4 +- .../docs/TreasuryWithdrawDaoProposal.md | 2 +- build/StarcoinFramework/docs/U256.md | 210 +++++++++++-- build/StarcoinFramework/docs/VMConfig.md | 2 +- .../source_maps/Account.mvsm | Bin 39479 -> 39479 bytes .../StarcoinFramework/source_maps/Arith.mvsm | Bin 5548 -> 5765 bytes .../StarcoinFramework/source_maps/Block.mvsm | Bin 3875 -> 3875 bytes .../source_maps/ChainId.mvsm | Bin 2200 -> 2200 bytes .../source_maps/ConsensusConfig.mvsm | Bin 9323 -> 9323 bytes .../source_maps/ConsensusStrategy.mvsm | Bin 1041 -> 1041 bytes .../source_maps/CoreAddresses.mvsm | Bin 799 -> 799 bytes build/StarcoinFramework/source_maps/Dao.mvsm | Bin 52329 -> 52329 bytes .../StarcoinFramework/source_maps/Epoch.mvsm | Bin 25467 -> 25467 bytes .../source_maps/FixedPoint32.mvsm | Bin 5279 -> 5279 bytes .../source_maps/GenesisSignerCapability.mvsm | Bin 1304 -> 1304 bytes .../source_maps/IdentifierNFT.mvsm | Bin 7815 -> 7918 bytes .../source_maps/IdentifierNFTScripts.mvsm | Bin 715 -> 715 bytes .../source_maps/MintDaoProposal.mvsm | Bin 3085 -> 3085 bytes .../source_maps/ModifyDaoConfigProposal.mvsm | Bin 4431 -> 4431 bytes build/StarcoinFramework/source_maps/NFT.mvsm | Bin 36569 -> 36623 bytes .../source_maps/NFTGallery.mvsm | Bin 15843 -> 15843 bytes .../source_maps/NFTGalleryScripts.mvsm | Bin 888 -> 888 bytes .../source_maps/OnChainConfigDao.mvsm | Bin 3026 -> 3026 bytes .../source_maps/PackageTxnManager.mvsm | Bin 26473 -> 26473 bytes .../source_maps/Timestamp.mvsm | Bin 3370 -> 3370 bytes .../source_maps/TransactionFee.mvsm | Bin 2661 -> 2661 bytes .../source_maps/TransactionManager.mvsm | Bin 8503 -> 8503 bytes .../source_maps/TransactionPublishOption.mvsm | Bin 2360 -> 2360 bytes .../source_maps/TransactionTimeout.mvsm | Bin 1530 -> 1530 bytes .../source_maps/TransactionTimeoutConfig.mvsm | Bin 1242 -> 1242 bytes .../source_maps/Treasury.mvsm | Bin 17184 -> 17184 bytes .../TreasuryWithdrawDaoProposal.mvsm | Bin 4756 -> 4756 bytes build/StarcoinFramework/source_maps/U256.mvsm | Bin 13404 -> 13500 bytes .../source_maps/VMConfig.mvsm | Bin 28614 -> 28614 bytes sources/Account.move | 8 +- sources/Block.move | 14 +- sources/ChainId.move | 30 +- sources/ConsensusConfig.move | 8 +- sources/ConsensusStrategy.move | 4 +- sources/CoreAddresses.move | 26 +- sources/Dao.move | 6 +- sources/Epoch.move | 24 +- sources/FixedPoint32.move | 55 +++- sources/GenesisSignerCapability.move | 7 +- sources/MintDaoProposal.move | 2 +- sources/ModifyDaoConfigProposal.move | 2 +- sources/NFT.move | 274 +++++++++++----- sources/OnChainConfigDao.move | 2 +- sources/PackageTxnManager.move | 4 +- sources/Timestamp.move | 26 +- sources/TransactionFee.move | 10 +- sources/TransactionManager.move | 2 +- sources/TransactionPublishOption.move | 4 +- sources/TransactionTimeout.move | 12 +- sources/TransactionTimeoutConfig.move | 2 +- sources/Treasury.move | 4 +- sources/TreasuryWithdrawDaoProposal.move | 2 +- sources/U256.move | 293 ++++++++++++++---- sources/VMConfig.move | 2 +- 85 files changed, 946 insertions(+), 434 deletions(-) diff --git a/build/StarcoinFramework/BuildInfo.yaml b/build/StarcoinFramework/BuildInfo.yaml index c7bff847..f2b64a09 100644 --- a/build/StarcoinFramework/BuildInfo.yaml +++ b/build/StarcoinFramework/BuildInfo.yaml @@ -252,7 +252,7 @@ compiled_package_info: ? address: "0x00000000000000000000000000000001" name: YieldFarmingV2 : StarcoinFramework - source_digest: 346F92F1B97DB6DD3C1A2ADB8B9FFAB54B79C2A525A7813EEC9DF8E9ADF3D1EB + source_digest: EFDC9CDA022ECCE3DE00576D1A30A7078D64BC8B20E0E891ABABCEE3A0EE7979 build_flags: dev_mode: false test_mode: false diff --git a/build/StarcoinFramework/bytecode_modules/Arith.mv b/build/StarcoinFramework/bytecode_modules/Arith.mv index ab9a3fe6380b47dcbd6ce6346aed1a9a81b435da..1b36c0f7236662f54e216ccabc7fff57db2cc173 100644 GIT binary patch literal 468 zcmZutOG*Pl6nw8=|K?3E63`jMC~ia$)Cj?iZd`bdkRLjbk4zFhg6HrQ9?B!Qi0=iH zh*;3wRb5S2b-%Yha|-|g!IC|2N5|pzF1|MW8@AI2exY~>Mh1|P$trUw8y*peC=ik% zibB_bY{SUi*VW?5Kh*WCo>Ol)$Op4YznYG^%bO0(`~7VGJgye18rAfrH?D@=Uj4Y7 zjHU~T{SBmesZ|6NFSbmz3foYo__5Z6&e`nw&CV%tZZKfeo-s5jQL>D(y5yPI6>_!^ znWey%eZfH$r^qok`^=m*(a4j*MuzK?D@MN(XlCos=-0T;KXLFkE~FR?liXj*@p7Hv kwk6q>DHGoo981pB&XeESzSJ@~vy>q%6SPd5VOPe$H^I^@UjP6A literal 414 zcmYk2&q~BV42LtxOsA8{f(vUa>bN-n=}u-Sge``}&-=ZJV~QkKN8DCI7E}3pET=5)#i&&maX8hl+7l>6j$4=c3|h z6HCcu#(ic^Q-{vfN`_T)!mjw%GWufPi-(JzYdqs7;lfh=1Pq^Q-B4>Fx*_(F#Y;K} zbNwm5B@_;aNGOx!5u#FDb2i4ryoMK-bR1SA!-umW5}&>KPgvBS%s-m{DZ}WG@B`rD BAsYYy diff --git a/build/StarcoinFramework/bytecode_modules/IdentifierNFT.mv b/build/StarcoinFramework/bytecode_modules/IdentifierNFT.mv index bb53a0ebe96c3751f10449f0970d60cc5bfa1400..ea63c4977bfc3cc2b29e2c066fe75ff4b48424d5 100644 GIT binary patch delta 404 zcmW-ey)H#j5QW#w?0wGuJHPi{$Iqovppq!A8y9aN9ziW$K&SEma_A{lq7t3Z=oLCD zQRqB@y;ZZa=F7~i%!m0kyEo$>uK*MT$8KG=&PhGcSijLTf&T_R&vI#-q=c!{Amt)X5nnALhnzsLx(P>!oGC>49>o|eL zVFpfN{`E9)o^)0wUzBzZd)UTQ2hzcYcpIApjAHEn!Q8ZKj`k6_Gcm=gerIUCAuOO2Xok%1efJCJcErrAb zh-h_MjsKiN`|U4lt?VE3VP-euZ=V22369;CY@a80G*U10O8QbR*xah3^Ptw;yUP5h z;_#&&IlVHRT`%Sn$`+?PC%HDPlcWSgDslwrh7N&xX$t8(ieS(H8HR$uOJyE)S+1f< zqsCe3HO|;o1ZAypCK#KiCNsG$a@fRHrdti(K7MAK~s_P?u8Wx_&CoO{o0bDqg zrk=>gstIw-45HP*(E$Qyyo)JIsZsj+OpeLaZ_*!@n~vrP;-o!SUZ^#GWpvoj9A;P- prL<*-eFX9pHN`rv#~>!hhK}a4N%=2PQnbkPUJUj!4IH0r@dxpHC)@x4 diff --git a/build/StarcoinFramework/bytecode_modules/NFT.mv b/build/StarcoinFramework/bytecode_modules/NFT.mv index 3d86127a170373935aec2164d2d0f0988ff9195e..70ffe949f42bb179c017f25be6a16d3e6184523a 100644 GIT binary patch delta 1415 zcmah|OK%%h6h7zNduQf8Joea=G|kIS(#CEcO`L~4cATUsO?kA104Xic3MmolhDFN~ z;SCE|M&7YOuw{c({y_gg7YHHo2UxTcOV*q_ZlVYwVaa#ycg}a-=l)##wYL4k%3{hw$on4p$~(fYnJpn*Launx-&> z^=gg1ZD7TNO{_3zq4uDSF@tOhJ?K=CLAPiz?8DYfPUsaK%eIRJK6lbtK6mGsEaBRv z{IgfhKi4mN(^uxbpWtq>4C1{?1?V1@LEc|N48r&EDgu2_L@qcW*DeX za2tZg#^UC3r9R%AXl!gG?d8r!XK}V(ZLBtG_2tIOlX;q#apB?P2ak?Fd-(W^<44Cw zPi_Zai~bEn!hJ!6HzOxVzG~<-L$4cp!;mDrfr{k5xTS7K;*N%Z)Gf6yhTu(&;dy05 z@-1-?iMKVrV+&{%YS4rX4XI4!x--S0XK-m6EJqpKH4h3+M~1dQ=ujkUgQsRjuWw0V zRV7&;yf6oDRTeE-ktrJIi9}|t>r)U?IRitLl^Fw-adn*d zO?Qw4);VJhO(3AzTwv)h?w}u7OOrmUz(PhDSu6{h@`5ymEUXD$swAt&=nrSrES4U(x$$$}P;ZT}q48~Eo$)4zZOb-(xa@*! zYP+F}OaF3FNa-?*qTXcEbz<1$%sLhGX6$O+;ld0QWaj%X2Pbh_hMnn5)C6aaA#w+k z?%>OK{_{F}fwIeIjs{N`t!{7!sKH9T8zt*Id2(IjQ=%&@mFG-eu8B86T41F;rzGAX zm8^Ls(c+*~9PclA%3gZ5W+W_c#gHX?ejKOk6w|UFsJ3LVMI%;NY^f3Quin_bQtrXO zj-pGQg%MgsSjFi29QR#w-)mf&cA*Ws+67KJ7zgYu7 z0ijIgGxgw4(!Z*@`AdDH;8B!>WLNv;nlSD4;Ws0pv9l&@HjZgGJE~V>m2%LA_Ezir>Ob1bVxK5WmyDf}q|Nf_|@*V`SdPBZ!*2 zYkM0rJG0H*z4k`Fm#-~0c%iw~tTbwk_2%ZIbz0GnK8!wB!#jwCCyEH~CSH+##?iBm zo^$lPBTaY*4e1kg&%BVR7cE3&?wJ!c0WVpMFDnz$FRND)b!zcdE+8AUU6q(eG~2whpyoQ%zf=f843rXGph4XZ&EOQqfQq z0Z=oPql~iibDYuC`8ml*nls_pjIK(fbmF$F!H?HYAELz4=}yDx9(v<68%8EpxuR)l zu>K$JDDzn}LAqIbA;)1*`odToROx{SS*hi7v4do9Y zb!v{fmTCgfIq64Gj(?0!*kX}%HPxjHiR+ffg=!P$)`Kagt)BHVy^hN~FwkPC@F13J z9dJkbz7!1Y;glFUrHvPz3ns%3i%l4*xR9DUe&S;JKQ0OxU6-q*HRuS!`9c+} diff --git a/build/StarcoinFramework/bytecode_modules/U256.mv b/build/StarcoinFramework/bytecode_modules/U256.mv index f1cf9559b8ea1be8aa79a660095094880c887987..0d9c2da9fa05942b0de1cd1c0a0a03172fa7d790 100644 GIT binary patch delta 79 zcmcc5{hND&I*$$48df%*O{^2ycn@zh?q`x==3oE delta 50 zcmey(eV==RI*$U^1XeblX{;03c$aT9?q`~OkI9^ob+Q<9EFaborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); +
aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 aborts_if !exists<Account>(txn_sender);
 aborts_if global<Account>(txn_sender).authentication_key == DUMMY_AUTH_KEY && Authenticator::spec_derived_address(Hash::sha3_256(txn_authentication_key_preimage)) != txn_sender;
 aborts_if global<Account>(txn_sender).authentication_key != DUMMY_AUTH_KEY && Hash::sha3_256(txn_authentication_key_preimage) != global<Account>(txn_sender).authentication_key;
@@ -2947,7 +2947,7 @@ It collects gas and bumps the sequence number
 
 
 
pragma verify = false;
-aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
+aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 aborts_if !exists<Account>(txn_sender);
 aborts_if !exists<Balance<TokenType>>(txn_sender);
 aborts_if txn_max_gas_units < gas_units_remaining;
@@ -2958,9 +2958,9 @@ It collects gas and bumps the sequence number
 aborts_if txn_gas_price * (txn_max_gas_units - gas_units_remaining) > 0 &&
         global<Balance<TokenType>>(txn_sender).token.value  < txn_gas_price * (txn_max_gas_units - gas_units_remaining);
 aborts_if txn_gas_price * (txn_max_gas_units - gas_units_remaining) > 0 &&
-        !exists<TransactionFee::TransactionFee<TokenType>>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+        !exists<TransactionFee::TransactionFee<TokenType>>(CoreAddresses::GENESIS_ADDRESS());
 aborts_if txn_gas_price * (txn_max_gas_units - gas_units_remaining) > 0 &&
-        global<TransactionFee::TransactionFee<TokenType>>(CoreAddresses::SPEC_GENESIS_ADDRESS()).fee.value + txn_gas_price * (txn_max_gas_units - gas_units_remaining) > max_u128();
+        global<TransactionFee::TransactionFee<TokenType>>(CoreAddresses::GENESIS_ADDRESS()).fee.value + txn_gas_price * (txn_max_gas_units - gas_units_remaining) > max_u128();
 
diff --git a/build/StarcoinFramework/docs/Block.md b/build/StarcoinFramework/docs/Block.md index b8df9e2a..7368a1bc 100644 --- a/build/StarcoinFramework/docs/Block.md +++ b/build/StarcoinFramework/docs/Block.md @@ -179,7 +179,7 @@ This can only be invoked by the GENESIS_ACCOUNT at genesis
aborts_if !Timestamp::is_genesis();
-aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
+aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 aborts_if exists<BlockMetadata>(Signer::address_of(account));
 
@@ -217,7 +217,7 @@ Get the current block number -
aborts_if !exists<BlockMetadata>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<BlockMetadata>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -254,7 +254,7 @@ Get the hash of the parent block. -
aborts_if !exists<BlockMetadata>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<BlockMetadata>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -291,7 +291,7 @@ Gets the address of the author of the current block -
aborts_if !exists<BlockMetadata>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<BlockMetadata>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -345,9 +345,9 @@ Call at block prologue -
aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
-aborts_if !exists<BlockMetadata>(CoreAddresses::SPEC_GENESIS_ADDRESS());
-aborts_if number != global<BlockMetadata>(CoreAddresses::SPEC_GENESIS_ADDRESS()).number + 1;
+
aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
+aborts_if !exists<BlockMetadata>(CoreAddresses::GENESIS_ADDRESS());
+aborts_if number != global<BlockMetadata>(CoreAddresses::GENESIS_ADDRESS()).number + 1;
 
diff --git a/build/StarcoinFramework/docs/ChainId.md b/build/StarcoinFramework/docs/ChainId.md index f55c3dcd..89ab9fd3 100644 --- a/build/StarcoinFramework/docs/ChainId.md +++ b/build/StarcoinFramework/docs/ChainId.md @@ -145,7 +145,7 @@ Publish the chain ID under the genesis account
aborts_if !Timestamp::is_genesis();
-aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
+aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 aborts_if exists<ChainId>(Signer::address_of(account));
 ensures exists<ChainId>(Signer::address_of(account));
 
@@ -184,8 +184,8 @@ Return the chain ID of this chain -
aborts_if !exists<ChainId>(CoreAddresses::SPEC_GENESIS_ADDRESS());
-ensures exists<ChainId>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<ChainId>(CoreAddresses::GENESIS_ADDRESS());
+ensures exists<ChainId>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -221,8 +221,8 @@ Return the chain ID of this chain -
aborts_if !exists<ChainId>(CoreAddresses::SPEC_GENESIS_ADDRESS());
-ensures exists<ChainId>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<ChainId>(CoreAddresses::GENESIS_ADDRESS());
+ensures exists<ChainId>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -258,8 +258,8 @@ Return the chain ID of this chain -
aborts_if !exists<ChainId>(CoreAddresses::SPEC_GENESIS_ADDRESS());
-ensures exists<ChainId>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<ChainId>(CoreAddresses::GENESIS_ADDRESS());
+ensures exists<ChainId>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -295,8 +295,8 @@ Return the chain ID of this chain -
aborts_if !exists<ChainId>(CoreAddresses::SPEC_GENESIS_ADDRESS());
-ensures exists<ChainId>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<ChainId>(CoreAddresses::GENESIS_ADDRESS());
+ensures exists<ChainId>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -332,8 +332,8 @@ Return the chain ID of this chain -
aborts_if !exists<ChainId>(CoreAddresses::SPEC_GENESIS_ADDRESS());
-ensures exists<ChainId>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<ChainId>(CoreAddresses::GENESIS_ADDRESS());
+ensures exists<ChainId>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -369,8 +369,8 @@ Return the chain ID of this chain -
aborts_if !exists<ChainId>(CoreAddresses::SPEC_GENESIS_ADDRESS());
-ensures exists<ChainId>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<ChainId>(CoreAddresses::GENESIS_ADDRESS());
+ensures exists<ChainId>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -406,8 +406,8 @@ Return the chain ID of this chain -
aborts_if !exists<ChainId>(CoreAddresses::SPEC_GENESIS_ADDRESS());
-ensures exists<ChainId>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<ChainId>(CoreAddresses::GENESIS_ADDRESS());
+ensures exists<ChainId>(CoreAddresses::GENESIS_ADDRESS());
 
diff --git a/build/StarcoinFramework/docs/ConsensusConfig.md b/build/StarcoinFramework/docs/ConsensusConfig.md index 8455de7a..fc33060d 100644 --- a/build/StarcoinFramework/docs/ConsensusConfig.md +++ b/build/StarcoinFramework/docs/ConsensusConfig.md @@ -200,7 +200,7 @@ Initialization of the module.
aborts_if !Timestamp::is_genesis();
-aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
+aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 aborts_if uncle_rate_target == 0;
 aborts_if epoch_block_count == 0;
 aborts_if base_reward_per_block == 0;
@@ -320,7 +320,7 @@ Get config data.
 
 
 
-
aborts_if !exists<Config::Config<ConsensusConfig>>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<Config::Config<ConsensusConfig>>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -330,7 +330,7 @@ Get config data.
fun spec_get_config(): ConsensusConfig {
-   global<Config::Config<ConsensusConfig>>(CoreAddresses::SPEC_GENESIS_ADDRESS()).payload
+   global<Config::Config<ConsensusConfig>>(CoreAddresses::GENESIS_ADDRESS()).payload
 }
 
@@ -644,7 +644,7 @@ Compute block reward given the new_epoch_block_time_target. -
aborts_if !exists<Config::Config<ConsensusConfig>>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<Config::Config<ConsensusConfig>>(CoreAddresses::GENESIS_ADDRESS());
 include Math::MulDivAbortsIf{x: spec_get_config().base_reward_per_block, y: new_epoch_block_time_target, z: spec_get_config().base_block_time_target};
 
diff --git a/build/StarcoinFramework/docs/ConsensusStrategy.md b/build/StarcoinFramework/docs/ConsensusStrategy.md index cf6e9e79..f8f72b50 100644 --- a/build/StarcoinFramework/docs/ConsensusStrategy.md +++ b/build/StarcoinFramework/docs/ConsensusStrategy.md @@ -85,7 +85,7 @@ Publish the chain ID under the genesis account
aborts_if !Timestamp::is_genesis();
-aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
+aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 aborts_if exists<Config::Config<ConsensusStrategy>>(Signer::address_of(account));
 aborts_if exists<Config::ModifyConfigCapabilityHolder<ConsensusStrategy>>(Signer::address_of(account));
 ensures exists<Config::Config<ConsensusStrategy>>(Signer::address_of(account));
@@ -125,7 +125,7 @@ Return the consensus strategy type of this chain
 
 
 
-
aborts_if !exists<Config::Config<ConsensusStrategy>>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<Config::Config<ConsensusStrategy>>(CoreAddresses::GENESIS_ADDRESS());
 
diff --git a/build/StarcoinFramework/docs/CoreAddresses.md b/build/StarcoinFramework/docs/CoreAddresses.md index 7ebee8ed..70f433be 100644 --- a/build/StarcoinFramework/docs/CoreAddresses.md +++ b/build/StarcoinFramework/docs/CoreAddresses.md @@ -76,7 +76,8 @@ Assert signer is genesis.
public fun assert_genesis_address(account: &signer) {
-    assert!(Signer::address_of(account) == GENESIS_ADDRESS(), Errors::requires_address(ENOT_GENESIS_ACCOUNT))
+    assert!(Signer::address_of(account) == GENESIS_ADDRESS(),
+            Errors::requires_address(ENOT_GENESIS_ACCOUNT))
 }
 
@@ -102,7 +103,7 @@ Specifies that a function aborts if the account does not have the Diem root addr
schema AbortsIfNotGenesisAddress {
     account: signer;
-    aborts_if Signer::address_of(account) != SPEC_GENESIS_ADDRESS();
+    aborts_if Signer::address_of(account) != GENESIS_ADDRESS();
 }
 
@@ -175,39 +176,3 @@ is no signer for the transaction.
pragma verify;
 pragma aborts_if_is_strict;
 
- - -Specification version of Self::GENESIS_ACCOUNT. - - - - - -
fun SPEC_GENESIS_ADDRESS(): address {
-   @0x1
-}
-
- - -Specification version of Self::ASSOCIATION_ROOT_ADDRESS. - - - - - -
fun SPEC_ASSOCIATION_ROOT_ADDRESS(): address {
-   @0xA550C18
-}
-
- - -Specification version of Self::VM_RESERVED_ADDRESS. - - - - - -
fun SPEC_VM_RESERVED_ADDRESS(): address {
-   @0x0
-}
-
diff --git a/build/StarcoinFramework/docs/Dao.md b/build/StarcoinFramework/docs/Dao.md index b34b4a14..4bcd4b5c 100644 --- a/build/StarcoinFramework/docs/Dao.md +++ b/build/StarcoinFramework/docs/Dao.md @@ -642,7 +642,7 @@ can optin this module by call this register function.
schema AbortIfTimestampNotExist {
-    aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+    aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS());
 }
 
@@ -783,7 +783,7 @@ propose a proposal.
pragma addition_overflow_unchecked;
 include AbortIfDaoConfigNotExist<TokenT>;
 include AbortIfDaoInfoNotExist<TokenT>;
-aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS());
 aborts_if action_delay > 0 && action_delay < spec_dao_config<TokenT>().min_action_delay;
 include CheckQuorumVotes<TokenT>;
 let sender = Signer::address_of(signer);
@@ -1558,7 +1558,7 @@ Get the proposal state.
 
 
 
include AbortIfTimestampNotExist;
-aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS());
 aborts_if !exists<Proposal<TokenT, ActionT>>(proposer_address);
 let proposal = global<Proposal<TokenT, ActionT>>(proposer_address);
 aborts_if proposal.id != proposal_id;
diff --git a/build/StarcoinFramework/docs/Epoch.md b/build/StarcoinFramework/docs/Epoch.md
index 80606fa4..17ac2e3c 100644
--- a/build/StarcoinFramework/docs/Epoch.md
+++ b/build/StarcoinFramework/docs/Epoch.md
@@ -342,9 +342,9 @@ Initialization of the module.
 
 
 
aborts_if !Timestamp::is_genesis();
-aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
-aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS());
-aborts_if !exists<Config::Config<ConsensusConfig>>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
+aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS());
+aborts_if !exists<Config::Config<ConsensusConfig>>(CoreAddresses::GENESIS_ADDRESS());
 aborts_if exists<Epoch>(Signer::address_of(account));
 aborts_if exists<EpochData>(Signer::address_of(account));
 
@@ -485,7 +485,7 @@ adjust_epoch try to advance to next epoch if current epoch ends.
pragma verify = false;
-aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
+aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 aborts_if !exists<Epoch>(Signer::address_of(account));
 aborts_if global<Epoch>(Signer::address_of(account)).max_uncles_per_block < uncles;
 aborts_if exists<EpochData>(Signer::address_of(account));
@@ -757,7 +757,7 @@ Get start time of current epoch
 
 
 
-
aborts_if !exists<Epoch>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<Epoch>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -795,7 +795,7 @@ Get uncles number of current epoch -
aborts_if !exists<EpochData>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<EpochData>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -833,7 +833,7 @@ Get total gas of current epoch -
aborts_if !exists<EpochData>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<EpochData>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -871,7 +871,7 @@ Get block's gas_limit of current epoch -
aborts_if !exists<Epoch>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<Epoch>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -909,7 +909,7 @@ Get start block's number of current epoch -
aborts_if !exists<Epoch>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<Epoch>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -947,7 +947,7 @@ Get end block's number of current epoch -
aborts_if !exists<Epoch>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<Epoch>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -985,7 +985,7 @@ Get current epoch number -
aborts_if !exists<Epoch>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<Epoch>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -1023,7 +1023,7 @@ Get current block time target -
aborts_if !exists<Epoch>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<Epoch>(CoreAddresses::GENESIS_ADDRESS());
 
diff --git a/build/StarcoinFramework/docs/FixedPoint32.md b/build/StarcoinFramework/docs/FixedPoint32.md index e7b85897..70a6d2fa 100644 --- a/build/StarcoinFramework/docs/FixedPoint32.md +++ b/build/StarcoinFramework/docs/FixedPoint32.md @@ -165,12 +165,36 @@ control flow, so we can assume some arbitrary (but fixed) behavior here.
pragma opaque = true;
-pragma verify = false;
+include MultiplyAbortsIf;
 ensures result == spec_multiply_u64(val, multiplier);
 
+ + + + +
schema MultiplyAbortsIf {
+    val: num;
+    multiplier: FixedPoint32;
+    aborts_if spec_multiply_u64(val, multiplier) > MAX_U64 with Errors::LIMIT_EXCEEDED;
+}
+
+ + + + + + + +
fun spec_multiply_u64(val: num, multiplier: FixedPoint32): num {
+   (val * multiplier.value) >> 32
+}
+
+ + + @@ -218,12 +242,37 @@ See comment at Self::multiply_64.
pragma opaque = true;
-pragma verify = false;
+include DivideAbortsIf;
 ensures result == spec_divide_u64(val, divisor);
 
+ + + + +
schema DivideAbortsIf {
+    val: num;
+    divisor: FixedPoint32;
+    aborts_if divisor.value == 0 with Errors::INVALID_ARGUMENT;
+    aborts_if spec_divide_u64(val, divisor) > MAX_U64 with Errors::LIMIT_EXCEEDED;
+}
+
+ + + + + + + +
fun spec_divide_u64(val: num, divisor: FixedPoint32): num {
+   (val << 32) / divisor.value
+}
+
+ + + @@ -275,12 +324,41 @@ See comment at Self::multiply_64.
pragma opaque = true;
-pragma verify = false;
+include CreateFromRationalAbortsIf;
 ensures result == spec_create_from_rational(numerator, denominator);
 
+ + + + +
schema CreateFromRationalAbortsIf {
+    numerator: u64;
+    denominator: u64;
+    let scaled_numerator = numerator << 64;
+    let scaled_denominator = denominator << 32;
+    let quotient = scaled_numerator / scaled_denominator;
+    aborts_if scaled_denominator == 0 with Errors::INVALID_ARGUMENT;
+    aborts_if quotient == 0 && scaled_numerator != 0 with Errors::INVALID_ARGUMENT;
+    aborts_if quotient > MAX_U64 with Errors::LIMIT_EXCEEDED;
+}
+
+ + + + + + + +
fun spec_create_from_rational(numerator: num, denominator: num): FixedPoint32 {
+   FixedPoint32{value: (numerator << 64) / (denominator << 32)}
+}
+
+ + + @@ -306,6 +384,20 @@ create a fixedpoint 32 from u64. + + +
+Specification + + + +
pragma opaque;
+aborts_if false;
+ensures result.value == value;
+
+ + +
@@ -344,33 +436,3 @@ values directly.
pragma verify;
 pragma aborts_if_is_strict;
 
- - -Uninterpreted function for Self::multiply_u64. - - - - - -
fun spec_multiply_u64(val: u64, multiplier: FixedPoint32): u64;
-
- - -Uninterpreted function for Self::divide_u64. - - - - - -
fun spec_divide_u64(val: u64, divisor: FixedPoint32): u64;
-
- - -Uninterpreted function for Self::create_from_rational. - - - - - -
fun spec_create_from_rational(numerator: u64, denominator: u64): FixedPoint32;
-
diff --git a/build/StarcoinFramework/docs/GenesisSignerCapability.md b/build/StarcoinFramework/docs/GenesisSignerCapability.md index e3b42b68..5ffea8c8 100644 --- a/build/StarcoinFramework/docs/GenesisSignerCapability.md +++ b/build/StarcoinFramework/docs/GenesisSignerCapability.md @@ -74,9 +74,12 @@ Implementation -
public(friend) fun initialize(signer:&signer, cap: Account::SignerCapability) {
+
public(friend) fun initialize(signer: &signer, cap: Account::SignerCapability) {
     CoreAddresses::assert_genesis_address(signer);
-    assert!(Account::signer_address(&cap) == CoreAddresses::GENESIS_ADDRESS(), Errors::invalid_argument(ENOT_GENESIS_ACCOUNT));
+    assert!(
+        Account::signer_address(&cap) == CoreAddresses::GENESIS_ADDRESS(),
+        Errors::invalid_argument(ENOT_GENESIS_ACCOUNT)
+    );
     move_to(signer, GenesisSignerCapability{cap});
 }
 
diff --git a/build/StarcoinFramework/docs/MintDaoProposal.md b/build/StarcoinFramework/docs/MintDaoProposal.md index 6bdb2283..7bf5a984 100644 --- a/build/StarcoinFramework/docs/MintDaoProposal.md +++ b/build/StarcoinFramework/docs/MintDaoProposal.md @@ -184,7 +184,7 @@ Entrypoint for the proposal.
pragma aborts_if_is_partial = false;
 include Dao::AbortIfDaoConfigNotExist<TokenT>;
 include Dao::AbortIfDaoInfoNotExist<TokenT>;
-aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS());
 aborts_if exec_delay > 0 && exec_delay < Dao::spec_dao_config<TokenT>().min_action_delay;
 include Dao::CheckQuorumVotes<TokenT>;
 let sender = Signer::address_of(signer);
diff --git a/build/StarcoinFramework/docs/ModifyDaoConfigProposal.md b/build/StarcoinFramework/docs/ModifyDaoConfigProposal.md
index b09bd307..205ca811 100644
--- a/build/StarcoinFramework/docs/ModifyDaoConfigProposal.md
+++ b/build/StarcoinFramework/docs/ModifyDaoConfigProposal.md
@@ -223,7 +223,7 @@ Entrypoint for the proposal.
 aborts_if voting_quorum_rate > 100;
 include Dao::AbortIfDaoConfigNotExist<TokenT>;
 include Dao::AbortIfDaoInfoNotExist<TokenT>;
-aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS());
 aborts_if exec_delay > 0 && exec_delay < Dao::spec_dao_config<TokenT>().min_action_delay;
 include Dao::CheckQuorumVotes<TokenT>;
 let sender = Signer::address_of(signer);
diff --git a/build/StarcoinFramework/docs/NFT.md b/build/StarcoinFramework/docs/NFT.md
index 07048121..2ad92f9e 100644
--- a/build/StarcoinFramework/docs/NFT.md
+++ b/build/StarcoinFramework/docs/NFT.md
@@ -56,7 +56,10 @@ Transfer NFT with id from sender to
 Implementation
 
 
-
public(script) fun transfer<NFTMeta: copy + store + drop, NFTBody: store>(sender: signer, id: u64, receiver: address) {
+
public(script) fun transfer<NFTMeta: copy + store + drop, NFTBody: store>(
+    sender: signer,
+    id: u64, receiver: address
+) {
     NFTGallery::transfer<NFTMeta, NFTBody>(&sender, id, receiver);
 }
 
diff --git a/build/StarcoinFramework/docs/OnChainConfigDao.md b/build/StarcoinFramework/docs/OnChainConfigDao.md index 6d9bfea5..e7d58006 100644 --- a/build/StarcoinFramework/docs/OnChainConfigDao.md +++ b/build/StarcoinFramework/docs/OnChainConfigDao.md @@ -182,7 +182,7 @@ issue a proposal to update config of ConfigT goved by TokenT
pragma aborts_if_is_partial = false;
 include Dao::AbortIfDaoConfigNotExist<TokenT>;
 include Dao::AbortIfDaoInfoNotExist<TokenT>;
-aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS());
 aborts_if exec_delay > 0 && exec_delay < Dao::spec_dao_config<TokenT>().min_action_delay;
 include Dao::CheckQuorumVotes<TokenT>;
 let sender = Signer::address_of(signer);
diff --git a/build/StarcoinFramework/docs/PackageTxnManager.md b/build/StarcoinFramework/docs/PackageTxnManager.md
index d8c43b85..18a9677a 100644
--- a/build/StarcoinFramework/docs/PackageTxnManager.md
+++ b/build/StarcoinFramework/docs/PackageTxnManager.md
@@ -1360,7 +1360,7 @@ Prologue of package transaction.
 
 
 
-
aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
+
aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 include CheckPackageTxnAbortsIf{};
 
@@ -1431,7 +1431,7 @@ Package txn finished, and clean UpgradePlan -
aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
+
aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 aborts_if spec_get_module_upgrade_strategy(package_address) == 1
     && success && !exists<TwoPhaseUpgrade>(package_address);
 aborts_if spec_get_module_upgrade_strategy(package_address) == 1
diff --git a/build/StarcoinFramework/docs/Timestamp.md b/build/StarcoinFramework/docs/Timestamp.md
index 87bfdec1..a4af9aaa 100644
--- a/build/StarcoinFramework/docs/Timestamp.md
+++ b/build/StarcoinFramework/docs/Timestamp.md
@@ -156,7 +156,7 @@ Conversion factor between seconds and milliseconds
 
 
 
-
aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
+
aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 aborts_if exists<CurrentTimeMilliseconds>(Signer::address_of(account));
 ensures exists<CurrentTimeMilliseconds>(Signer::address_of(account));
 
@@ -198,10 +198,10 @@ Conversion factor between seconds and milliseconds -
aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
-aborts_if !exists<CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS());
-aborts_if timestamp <= global<CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS()).milliseconds;
-ensures global<CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS()).milliseconds == timestamp;
+
aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
+aborts_if !exists<CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS());
+aborts_if timestamp <= global<CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS()).milliseconds;
+ensures global<CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS()).milliseconds == timestamp;
 
@@ -237,7 +237,7 @@ Conversion factor between seconds and milliseconds -
aborts_if !exists<CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS());
 ensures result == now_milliseconds() / MILLI_CONVERSION_FACTOR;
 
@@ -248,7 +248,7 @@ Conversion factor between seconds and milliseconds
fun spec_now_seconds(): u64 {
-   global<CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS()).milliseconds / MILLI_CONVERSION_FACTOR
+   global<CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS()).milliseconds / MILLI_CONVERSION_FACTOR
 }
 
@@ -285,8 +285,8 @@ Conversion factor between seconds and milliseconds -
aborts_if !exists<CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS());
-ensures result == global<CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS()).milliseconds;
+
aborts_if !exists<CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS());
+ensures result == global<CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS()).milliseconds;
 
@@ -296,7 +296,7 @@ Conversion factor between seconds and milliseconds
fun spec_now_millseconds(): u64 {
-   global<CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS()).milliseconds
+   global<CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS()).milliseconds
 }
 
@@ -341,7 +341,7 @@ Marks that time has started and genesis has finished. This can only be called fr -
aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
+
aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 aborts_if !exists<CurrentTimeMilliseconds>(Signer::address_of(account));
 aborts_if exists<TimeHasStarted>(Signer::address_of(account));
 ensures exists<TimeHasStarted>(Signer::address_of(account));
@@ -382,7 +382,7 @@ Helper function to determine if the blockchain is in genesis state.
 
 
 
aborts_if false;
-ensures result == !exists<TimeHasStarted>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+ensures result == !exists<TimeHasStarted>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -442,7 +442,7 @@ Helper schema to specify that a function aborts if not in genesis.
schema AbortsIfTimestampNotExists {
-    aborts_if !exists<CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+    aborts_if !exists<CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS());
 }
 
diff --git a/build/StarcoinFramework/docs/TransactionFee.md b/build/StarcoinFramework/docs/TransactionFee.md index d1067f50..b6dcc89b 100644 --- a/build/StarcoinFramework/docs/TransactionFee.md +++ b/build/StarcoinFramework/docs/TransactionFee.md @@ -90,7 +90,7 @@ Called in genesis. Sets up the needed resources to collect transaction fees from
aborts_if !Timestamp::is_genesis();
-aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
+aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 aborts_if exists<TransactionFee<STC>>(Signer::address_of(account));
 
@@ -175,8 +175,8 @@ Deposit token into the transaction fees bucket -
aborts_if !exists<TransactionFee<TokenType>>(CoreAddresses::SPEC_GENESIS_ADDRESS());
-aborts_if global<TransactionFee<TokenType>>(CoreAddresses::SPEC_GENESIS_ADDRESS()).fee.value + token.value > max_u128();
+
aborts_if !exists<TransactionFee<TokenType>>(CoreAddresses::GENESIS_ADDRESS());
+aborts_if global<TransactionFee<TokenType>>(CoreAddresses::GENESIS_ADDRESS()).fee.value + token.value > max_u128();
 
diff --git a/build/StarcoinFramework/docs/TransactionManager.md b/build/StarcoinFramework/docs/TransactionManager.md index bb1e0368..6254c35f 100644 --- a/build/StarcoinFramework/docs/TransactionManager.md +++ b/build/StarcoinFramework/docs/TransactionManager.md @@ -274,7 +274,7 @@ It collects gas and bumps the sequence number
pragma verify = false;
 include CoreAddresses::AbortsIfNotGenesisAddress;
-aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
+aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 aborts_if !exists<Account::Account>(txn_sender);
 aborts_if !exists<Account::Balance<TokenType>>(txn_sender);
 aborts_if txn_max_gas_units < gas_units_remaining;
diff --git a/build/StarcoinFramework/docs/TransactionPublishOption.md b/build/StarcoinFramework/docs/TransactionPublishOption.md
index 0441fbc9..9507c62a 100644
--- a/build/StarcoinFramework/docs/TransactionPublishOption.md
+++ b/build/StarcoinFramework/docs/TransactionPublishOption.md
@@ -159,7 +159,7 @@ Module initialization.
 
 
 
aborts_if !Timestamp::is_genesis();
-aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
+aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 include Config::PublishNewConfigAbortsIf<TransactionPublishOption>;
 include Config::PublishNewConfigEnsures<TransactionPublishOption>;
 
@@ -292,7 +292,7 @@ Check if a sender can publish a module
schema AbortsIfTxnPublishOptionNotExist {
     include Config::AbortsIfConfigNotExist<TransactionPublishOption>{
-        addr: CoreAddresses::SPEC_GENESIS_ADDRESS()
+        addr: CoreAddresses::GENESIS_ADDRESS()
     };
 }
 
diff --git a/build/StarcoinFramework/docs/TransactionTimeout.md b/build/StarcoinFramework/docs/TransactionTimeout.md index 494ec5c3..9e5baaf1 100644 --- a/build/StarcoinFramework/docs/TransactionTimeout.md +++ b/build/StarcoinFramework/docs/TransactionTimeout.md @@ -55,11 +55,11 @@ Check whether the given timestamp is valid for transactions. -
aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS());
-aborts_if !exists<Block::BlockMetadata>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+
aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS());
+aborts_if !exists<Block::BlockMetadata>(CoreAddresses::GENESIS_ADDRESS());
 include Timestamp::AbortsIfTimestampNotExists;
 aborts_if Block::get_current_block_number() != 0 && Timestamp::now_seconds() + TransactionTimeoutConfig::duration_seconds() > max_u64();
-aborts_if Block::get_current_block_number() != 0 && !exists<Config::Config<TransactionTimeoutConfig::TransactionTimeoutConfig>>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+aborts_if Block::get_current_block_number() != 0 && !exists<Config::Config<TransactionTimeoutConfig::TransactionTimeoutConfig>>(CoreAddresses::GENESIS_ADDRESS());
 
@@ -69,11 +69,11 @@ Check whether the given timestamp is valid for transactions.
schema AbortsIfTimestampNotValid {
-    aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS());
-    aborts_if !exists<Block::BlockMetadata>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+    aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS());
+    aborts_if !exists<Block::BlockMetadata>(CoreAddresses::GENESIS_ADDRESS());
     include Timestamp::AbortsIfTimestampNotExists;
     aborts_if Block::get_current_block_number() != 0 && Timestamp::now_seconds() + TransactionTimeoutConfig::duration_seconds() > max_u64();
-    aborts_if Block::get_current_block_number() != 0 && !exists<Config::Config<TransactionTimeoutConfig::TransactionTimeoutConfig>>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+    aborts_if Block::get_current_block_number() != 0 && !exists<Config::Config<TransactionTimeoutConfig::TransactionTimeoutConfig>>(CoreAddresses::GENESIS_ADDRESS());
 }
 
diff --git a/build/StarcoinFramework/docs/TransactionTimeoutConfig.md b/build/StarcoinFramework/docs/TransactionTimeoutConfig.md index c43ad863..e0488861 100644 --- a/build/StarcoinFramework/docs/TransactionTimeoutConfig.md +++ b/build/StarcoinFramework/docs/TransactionTimeoutConfig.md @@ -86,7 +86,7 @@ Initialize function. Should only be called in genesis.
aborts_if !Timestamp::is_genesis();
-aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
+aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 include Config::PublishNewConfigAbortsIf<TransactionTimeoutConfig>;
 include Config::PublishNewConfigEnsures<TransactionTimeoutConfig>;
 
diff --git a/build/StarcoinFramework/docs/Treasury.md b/build/StarcoinFramework/docs/Treasury.md index b8231d18..d73751fd 100644 --- a/build/StarcoinFramework/docs/Treasury.md +++ b/build/StarcoinFramework/docs/Treasury.md @@ -574,7 +574,7 @@ Issue a Linear
aborts_if period == 0;
 aborts_if amount == 0;
-aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(StarcoinFramework::CoreAddresses::SPEC_GENESIS_ADDRESS());
+aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(StarcoinFramework::CoreAddresses::GENESIS_ADDRESS());
 
@@ -733,7 +733,7 @@ Returns the amount of the LinearWithdrawCapability can mint now.
pragma verify = false;
-aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(StarcoinFramework::CoreAddresses::SPEC_GENESIS_ADDRESS());
+aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(StarcoinFramework::CoreAddresses::GENESIS_ADDRESS());
 aborts_if Timestamp::spec_now_seconds() < cap.start_time;
 aborts_if Timestamp::spec_now_seconds() - cap.start_time >= cap.period && cap.total < cap.withdraw;
 aborts_if [abstract] Timestamp::spec_now_seconds() - cap.start_time < cap.period && Math::spec_mul_div() < cap.withdraw;
diff --git a/build/StarcoinFramework/docs/TreasuryWithdrawDaoProposal.md b/build/StarcoinFramework/docs/TreasuryWithdrawDaoProposal.md
index 7baa7e66..0e13d8cc 100644
--- a/build/StarcoinFramework/docs/TreasuryWithdrawDaoProposal.md
+++ b/build/StarcoinFramework/docs/TreasuryWithdrawDaoProposal.md
@@ -215,7 +215,7 @@ Entrypoint for the proposal.
 aborts_if amount > quorum_votes;
 include Dao::AbortIfDaoConfigNotExist<TokenT>;
 include Dao::AbortIfDaoInfoNotExist<TokenT>;
-aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::SPEC_GENESIS_ADDRESS());
+aborts_if !exists<Timestamp::CurrentTimeMilliseconds>(CoreAddresses::GENESIS_ADDRESS());
 aborts_if exec_delay > 0 && exec_delay < Dao::spec_dao_config<TokenT>().min_action_delay;
 include Dao::CheckQuorumVotes<TokenT>;
 let sender = Signer::address_of(signer);
diff --git a/build/StarcoinFramework/docs/U256.md b/build/StarcoinFramework/docs/U256.md
index 81e161bc..762438a5 100644
--- a/build/StarcoinFramework/docs/U256.md
+++ b/build/StarcoinFramework/docs/U256.md
@@ -69,6 +69,32 @@ vector should always has two elements.
 
 
 
+
+
+
+Specification + + + +
invariant len(bits) == 4;
+
+ + + + + + + +
fun value_of_U256(a: U256): num {
+   a.bits[0] +
+   a.bits[1] * P64 +
+   a.bits[2] * P64 * P64 +
+   a.bits[3] * P64 * P64 * P64
+}
+
+ + +
@@ -76,6 +102,24 @@ vector should always has two elements. ## Constants + + + + +
const P32: u64 = 4294967296;
+
+ + + + + + + +
const P64: u128 = 18446744073709551616;
+
+ + + @@ -224,9 +268,7 @@ vector should always has two elements. Vector::push_back(&mut bits, high); Vector::push_back(&mut bits, 0u64); Vector::push_back(&mut bits, 0u64); - U256 { - bits - } + U256 { bits } }
@@ -271,6 +313,18 @@ vector should always has two elements. + + +
+Specification + + + +
pragma verify = false;
+
+ + +
@@ -297,6 +351,18 @@ vector should always has two elements. + + +
+Specification + + + +
pragma verify = false;
+
+ + +
@@ -331,7 +397,7 @@ vector should always has two elements.
pragma opaque;
-aborts_if value_of_U256(v) >= (1 << 128);
+aborts_if value_of_U256(v) >= P64 * P64;
 ensures value_of_U256(v) == result;
 
@@ -368,7 +434,7 @@ vector should always has two elements. } } }; - EQUAL + return EQUAL }
@@ -406,8 +472,7 @@ vector should always has two elements. -
pragma opaque;
-aborts_if value_of_U256(a) + value_of_U256(b) >= (1 << 256);
+
aborts_if value_of_U256(a) + value_of_U256(b) >= P64 * P64 * P64 * P64;
 ensures value_of_U256(result) == value_of_U256(a) + value_of_U256(b);
 
@@ -445,8 +510,7 @@ vector should always has two elements. -
pragma opaque;
-aborts_if value_of_U256(a) > value_of_U256(b);
+
aborts_if value_of_U256(a) < value_of_U256(b);
 ensures value_of_U256(result) == value_of_U256(a) - value_of_U256(b);
 
@@ -484,8 +548,8 @@ vector should always has two elements. -
pragma opaque;
-aborts_if value_of_U256(a) * value_of_U256(b) >= (1 << 256);
+
pragma timeout = 200;
+aborts_if value_of_U256(a) * value_of_U256(b) >= P64 * P64 * P64 * P64;
 ensures value_of_U256(result) == value_of_U256(a) * value_of_U256(b);
 
@@ -523,7 +587,7 @@ vector should always has two elements. -
pragma opaque;
+
pragma timeout = 160;
 aborts_if value_of_U256(b) == 0;
 ensures value_of_U256(result) == value_of_U256(a) / value_of_U256(b);
 
@@ -562,8 +626,7 @@ vector should always has two elements. -
pragma opaque;
-aborts_if value_of_U256(b) == 0;
+
aborts_if value_of_U256(b) == 0;
 ensures value_of_U256(result) == value_of_U256(a) % value_of_U256(b);
 
@@ -601,7 +664,12 @@ vector should always has two elements. -
pragma opaque;
+
pragma verify = false;
+pragma opaque;
+pragma timeout = 600;
+let p = pow_spec(value_of_U256(a), value_of_U256(b));
+aborts_if p >= P64 * P64 * P64 * P64;
+ensures value_of_U256(result) == p;
 
@@ -663,7 +731,7 @@ move implementation of native_sub.
fun sub_noborrow(a: &mut U256, b: &U256) {
     let borrow = 0;
     let idx = 0;
-    let len =(WORD as u64);
+    let len = (WORD as u64);
     while (idx < len) {
         let a_bit = Vector::borrow_mut(&mut a.bits, idx);
         let b_bit = Vector::borrow(&b.bits, idx);
@@ -723,6 +791,20 @@ move implementation of native_sub.
 
 
 
+
+
+
+Specification + + + +
pragma opaque;
+aborts_if value_of_U256(a) + value_of_U256(b) >= P64 * P64 * P64 * P64;
+ensures value_of_U256(a) == value_of_U256(old(a)) + value_of_U256(b);
+
+ + +
@@ -745,6 +827,20 @@ move implementation of native_sub. + + +
+Specification + + + +
pragma opaque;
+aborts_if value_of_U256(a) - value_of_U256(b) < 0;
+ensures value_of_U256(a) == value_of_U256(old(a)) - value_of_U256(b);
+
+ + +
@@ -767,6 +863,20 @@ move implementation of native_sub. + + +
+Specification + + + +
pragma opaque;
+aborts_if value_of_U256(a) * value_of_U256(b) >= P64 * P64 * P64 * P64;
+ensures value_of_U256(a) == value_of_U256(old(a)) * value_of_U256(b);
+
+ + +
@@ -789,6 +899,20 @@ move implementation of native_sub. + + +
+Specification + + + +
pragma opaque;
+aborts_if value_of_U256(b) == 0;
+ensures value_of_U256(a) == value_of_U256(old(a)) / value_of_U256(b);
+
+ + +
@@ -811,6 +935,20 @@ move implementation of native_sub. + + +
+Specification + + + +
pragma opaque;
+aborts_if value_of_U256(b) == 0;
+ensures value_of_U256(a) == value_of_U256(old(a)) % value_of_U256(b);
+
+ + +
@@ -835,26 +973,44 @@ move implementation of native_sub. - - -## Module Specification +
+Specification -
pragma verify = false;
+
pragma opaque;
+aborts_if pow_spec(value_of_U256(a), value_of_U256(b)) >= P64 * P64 * P64 * P64;
+ensures value_of_U256(a) == pow_spec(value_of_U256(old(a)), value_of_U256(b));
 
- + -
fun value_of_U256(a: U256): num {
-   ( a.bits[0]             // 0 * 64
-     + a.bits[1] << 64     // 1 * 64
-     + a.bits[2] << 128    // 2 * 64
-     + a.bits[3] << 192    // 3 * 64
-   )
+
fun pow_spec(base: num, expon: num): num {
+   // This actually doesn't follow a strict definition as 0^0 is undefined
+   // mathematically. But the U256::pow of Rust is defined to be like this:
+   // Link: https://docs.rs/uint/0.9.3/src/uint/uint.rs.html#1000-1003
+   if (expon > 0) {
+       let x = pow_spec(base, expon / 2);
+       if (expon % 2 == 0) { x * x } else { x * x * base }
+   } else {
+       1
+   }
 }
 
+ + + +
+ + + +## Module Specification + + + +
pragma verify = true;
+
diff --git a/build/StarcoinFramework/docs/VMConfig.md b/build/StarcoinFramework/docs/VMConfig.md index c98107c4..8aa3ef34 100644 --- a/build/StarcoinFramework/docs/VMConfig.md +++ b/build/StarcoinFramework/docs/VMConfig.md @@ -682,7 +682,7 @@ Initialize the table under the genesis account -
aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS();
+
aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS();
 aborts_if exists<Config::Config<VMConfig>>(Signer::address_of(account));
 aborts_if
     exists<Config::ModifyConfigCapabilityHolder<VMConfig>>(
diff --git a/build/StarcoinFramework/source_maps/Account.mvsm b/build/StarcoinFramework/source_maps/Account.mvsm
index d2c78183dc45cf8e928968485ce4f104f9a6c11f..8891e1bd507845462f9bf38bb77d9f941fc56b4a 100644
GIT binary patch
literal 39479
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

literal 39479
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
Ok)Cy_lm0Kcy7@0htdUs&

diff --git a/build/StarcoinFramework/source_maps/Arith.mvsm b/build/StarcoinFramework/source_maps/Arith.mvsm
index 47538147a878509c9fac2522c8b736653a7de8f2..5db69c5673e64c4a8e78a29bcedf03924785e4e2 100644
GIT binary patch
literal 5765
zcma*rdrXye9LMqB^BfSYG$BH~pm_lmQsijVoLVSeLBN9&5RGw2Jx9zF4^p!xxGuWd
zYUTa1wu+EyS}{hn`DepRtwpi5hL^eiOKZ+Kx0+6SKXQJX|9uYI`yck&?|C?Te$VgA
zsq1e0b4k_@9Vb${{#v!d2@bt~HUH+ndlnaD934D#ckS8F;OxBr%~ChxMp&~N_wbPN^WZOyq!wFj_jaRw{gC**Ks$~4Mfa&(wHfv@nOXWl_?%DbOLF8R
z(;1hpl&6qiQ$WhEP$wx#%Hybulp^JM)G(z=`7P=Kjh510{UIsuv7X_xe^|;}NC)|d
zl=k5tBc*-z$4WVqE9cOoQcgtW(l{yYc1n}d?xu7pS99gH^q7?EP!*IRWhttR9+$ET
zRYRFlhT?L(l$FT!lqKa-R4q-A(!LxfN@?FtlcaouEAOJoQtn2*N!e1iqdI7cl<%PS
z&{QekLcL8-NZEqgOVgyZZ_w#d+Bf(NDUWgG<1|yseW=5fBjrc&HFKrxLH5!tDf>|U
zG+W9p)c2IY;gKC+K{BoziK-KH4ltkGZ81fIu!a7*yzb@wmIBw2KI_(_sz{%8<)}*1
zXI%}dj`UggB5DgI%fILaR6UK7awDpm^!d3K6`=(F_`DQj=29Y43gntBA5LQ80L0%K$!uAdSZBYR-I6bS1v?l$huhz+XSt>Qu5KnaYe!z_7`5*SZ^
zhy6jRBcIu(m(*=6x$Rlb$^7PSKO6-6(qU9LsZ@MtbthKxLAiJk$O4NKc*dA95GMn_|nS{zEJ$c#}j-EX2i&syc&vNDGNKc;2Q6;1&&tlXv(vzos
z+v>@4GwVf3PoCRQ+euHJTT#uVC(jmCE9uEIhI)ncZ2IN_#NpOSzvbAD}0tJd8R*bEQ0pIz;oNd=K>@6-fCm%D?)2DZfGWP@$B)s6Glx
z*@^m&5;%-M=9|nD{`gZ<8%d(b|gZ}^L2%Q%wsVcTYEUQqA=;UW#*gx-bc$MwK
zy(EWE$sSZMg%)`OfgMVJMt-F*r+0?3QBKPmPEK!zq7ks6HucG=nXv4BDyOEyGRRS+
zo?n1kL9QZ?oLY;kBWFN<)>W`I{Zvk^hc%Gp)?b7qoSPi-D-(@MCa09sOL+lxkz%AghdNKOQZ}J3
zQJj?K#K%i%Zk*9lKH$j@X^fO@sCzV4%GQCI2~u_Pg?t2T--7@8(9-5z=?_aa1$u
zyZI>U80ovY0dG|FxOw)BeQ$q9E3^a#%$_
zm8(xNtdzq3zKe|;)W>)R?y_g=4Xg=vw4ch4@f&8Z;Z~+T<*Tr(NuToNs5PWdxp}|(
zl$+P9Px&sMyqokX51{stKIP`k>Qnyj#mZa$3{SpFdIP(Gx=DHiyN0?>dIM`i-66e!
z-9ojJ-oWmo9+BR_?hQ!2fwd#=lHR~hpgKrzVCI164a{5=dINjQli!ivzdNpE2G
zJX`Ax%v`^EulmTmPo(!MGgEI%ea!ntdRsCx^$uk2JGVSXQQTi~lq}^KR055YG9ERW
zQlxa-^T;D*A}Wc-OF15uMiZn=L3t=u$`I5vnkc3Dn=naA^QUpLlnZ!rE=`d#54DJ<
zN@>rtb()lB;g~MvQsynAbScfu3@Hnkw}NI$X=Y|gnZvxflr80Kl)Y@tl5z{mPqU@m
zhN`3-DZQvF3Sy1lgQ_LV;gJ84se>J~Eo-;@43}Y7NbfB-P&Y~MEmu+3N$)MKs5a7j
WOFOEA^xkqCb%*rcatZaAEb9*d_Ay8R

diff --git a/build/StarcoinFramework/source_maps/Block.mvsm b/build/StarcoinFramework/source_maps/Block.mvsm
index 7db0d81ff718e0e0b1a93f9e362c88f108cf41a1..eada550c3273fb9784b22f392661014db4b43f12 100644
GIT binary patch
literal 3875
zcmb8xOKeP09LMo9?M$m$Wzc%mTT6*V2(chUn>L0HDN3r6>2wU!=*+Y;cOnEygT(t0
zi9}ODf(@|{gpCLl3n4Zh3ke&cHtMyJ2;UPVcE4ki@9uNYx%b@rPkZ3prM9zo&rID^
z*3+2lNHp|^E^Jx<=ydwd=AQ1xSpzRyj4`d`qkn(CKut$Fwl&X~17d~qTzb`B9#FC$
z^^ugTWY^gaJEt(7gS&{i?BKp&^7HLks5|UJ?Iz<_@-*r!DR&if-N8M?JaurdF>fiL
zxBgjVOmOh;m+!E0Gju!YQ(A-yQJ#EyE4#^I(d~uCoFMyixZ7vYZ=~<`7U}`%yS4HM
zInWz}jOio$^Xpd;}#
zC?MqtR4)}sc@y=V3Z)!CeWF29))X+kR3v2?YB>#-GQ`f!$YLpnAxBY(lp9#Dg&dB)
zx|mTQQ{ej5EEK$&3TD*Mt$V%&@>f!?a6r7izYkO6+6&->;}11tRtRP
z{2=tW<*8hw+a5aJ8P-_t=kiANhvw
zp$16L>wNZZB0aAoQB|bp_3tz3c}=ihiuAl@QTs^GtCfdIPvJ4tane(G1a*}36sA#K
zq^GbI)kj0++q{ChN5iB%iMmfgDgW+1T*?ouH$Wq#e1dvIBc0?sWSNt+yO&E@#$UV&
z8YSg-)+<4dc9J8IW1OVjeXNxAs79)gvI@0;#yQDaDC)dPS8|mX`7rQ+$GQRS%iLFWN&2XY)||9zLC#Q^A}Zr8-07o7;~5c^zRi2mo_%l9ZxZ4LaZ>zt;6>Au#%rp
zUr4zX?7Gfj=LE)gaJMjb9o%8G_aC5`(HB)C)(n*G5I`qpd%E>uC@OGMB_2vJL36XG#NXpw#u1d%t|svdR`~lBZ$@WI))4(
z^}Lp&8c5G;5vqjryiUK9p4Sf6>mog`r%`>R=heyq(o=W?b(8cI4x)xgPhmIe6zM7S
zQLkv0oYzOFF`6yqZPYl;k#c(XY$>N$FT`Jy94S8_f6!bf`3pJEN!s0Wr7T9RqdY0I
zPz5yKNv=jNaFTZSg;Lg_Vw5js395n?ImrXa#ZJ=hzC_A1s0*}I$|lrFDsYm$$YoB_
z?p`S6bJROpF69%{S6U%uVHUrTX{D4~P&;Uqlpg9Bt(LM2)k{TEPVzPvk;PJ8MfM}t
kNNLponLzIL(p|f^RYa@ySC($y6Rj-YTe)@LwlZV>0GzAmj{pDw

diff --git a/build/StarcoinFramework/source_maps/ChainId.mvsm b/build/StarcoinFramework/source_maps/ChainId.mvsm
index 0e87e0ce5fa7de36bba7c7e3c2d01c033b3b0bad..24fc09e8ad0b0a6329a22012edc5bb9e7beb4ed7 100644
GIT binary patch
literal 2200
zcma)+J!?~87>1vme4L_IOT|UeNd>8(lR}}wu?bC}A2z8mrD_QY+ALM^Yb!2}1?l2H
z5Za-VUnLPuG;(DWT+&^%!f|FCl6*mHH0t
zy@!X)?JMFo=s_H1tOKA2@rS&Vm}xn(b65q)NOKaa0$FK}U|ocqG|ylSK`hNG)+Goi
zznC+748Axv>Set^eGPj48(5z}&;Je9I_UZP?w%Q-p5SDk^3%-<=v6_jf$nt~YYud;
zX{;I0y?l4i3^-Vy(Z0L-&zA2iVp=iiUc0dlg6`FWwF`7F-`z6
z$)I~3!5RSF>k!sq(7k+j&kXp{o~F}ac(1Fd4bZ)=W8DYctBG|DbT8lCGXwr&7C3_s
z!_VO|>MH179jsTNdp*T!gYMRxAU
jUojaSElhXsMAmmcDUT=ReD{`F--Yr-tu&T&Z)NN+jpTLw

literal 2200
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
Ze9@XTeV-oGrTNUwHOygY7FHdM`2p)|gQx%i

literal 1041
zcma)(y-LGS97k_HY*PiH;vxtR;^3xF;NS;NF0D{qVhFK=kg7=r4WjMbZe2PH;-W*}
zz||)Z9CUGUCjtJ|vx(J%iZs9Z$3A9N
an&pdn(sW&VP?P2>H+z`V(k!eR81n=5V|qOR

diff --git a/build/StarcoinFramework/source_maps/CoreAddresses.mvsm b/build/StarcoinFramework/source_maps/CoreAddresses.mvsm
index b1ee983c590776820cfbbfcfda124f506e8aa2a5..9c738c264e9fcd4dde760c129d505a734c89671e 100644
GIT binary patch
literal 799
zcmaEMw{eRG$8pcM9SdKIItEK96)k&Qn)lehPB^F8=v{$o1Oo#@DiAXQF*0D}b%go
rHi9Z0fU5FKuCkP5_%K#U9+d7bl%
zQXNxLic*Vngx5EJ&?44|r6K+Hlg7)pSu?gB9@L6ygWs%`@@
r8$p%pfU52QF*`w(FxwdzMO^*-L*m_C{ak}RgX0~Yo&7`oLKqkTixECn

diff --git a/build/StarcoinFramework/source_maps/Dao.mvsm b/build/StarcoinFramework/source_maps/Dao.mvsm
index 5ddfa9195f9155818fbb9d8af9dd8aa4dee3b04b..05c7c6d62f16243bc51c2fa9021d4ae1786527f9 100644
GIT binary patch
literal 52329
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

literal 52329
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

diff --git a/build/StarcoinFramework/source_maps/Epoch.mvsm b/build/StarcoinFramework/source_maps/Epoch.mvsm
index 97cd7f8ed9314002f8d4650857d193bdc3961bdb..838a4c9deb71dcdb68ed0a07de587d3873c86447 100644
GIT binary patch
literal 25467
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
b?MV1cO|--LZ7PxMOeI=U9g+CfXo>j;F?Rz
zz0eB-8WV}Sj0K{JI7AW?1xyrF2n1*FD_n3v0t5z{NW2lAH`!~v`@JrCuKJw+IXma=
z`TgHczSLPi>-E;B=WHI@{(FckG}lZnH4{M70hoi#`J>)|NXPVtL$Cb
z%-VvTFSb9yr<0=48#wPeRV-zWV;zT}F8W@zF-O4oD)Oa)>|kH9FsRCZivI;vWwQCg
zfSva;<`n)}2>4s)E>#m;t!3?X#+1KUDirN(zNiL_GT>vV8|v@NWi#pjv9Jb)&4Ze$
zp`Lf)*BWE4gITC|`4-+?u;d}%bSknOpELtlW#E^l@01k_9OB-SZtkf!@RZN;8Dj0j<(>XP+m{
z6Vy8m^QHL%)29u
zwG@^}vl6QvJcL}T!5ABi6&&u%m9i?{x8W8XpIDUZIDj|;I&0s=8gqzS7T
zbRRMuYbNME#C=9|AJRd+XF&HMQLHtf`w+)m2fDjhiM0`QcM-wr1l?V@Un<>Q9H8Do
z(A~vhtRtYii!rQ2pu3CxSQF4B@51k}F2XEnj${1@&C+ydpDoSqX~y(|?t;3oHi3sr
zq|j*0ZZMXgS2cAL@4?*b*j|$3eZ&#acb;P&a?0wfY+t~b55QY;e26&;l>?<*(cY1>
zv+`~HBlKh73+)&zWJ>+=WqC^(=?gWb{8V~)9QYQ$CyW4JC3*H^c!xpn{Re
z)=AJwlM)X;XVjDKfa;f
zSJD!N7l09ruth=`>6<^yGUl~au_)YD9d4?&}Cdo6Lpw391p@1rpJi`U*
zk>nZ5sB<#J!Lq0zqlH9SMSfDdD4$Su>JVk~>7AnN;~k^aCCXXU9GRjVM9ouJlqRZ|
fx<$EwS|p|QSavd4|PAl~b^rhx&

literal 1304
zcma*ly-LGi7{&4TP12zCqbk~{H{d8vj#5G>bx4P_lR}LWB~U^!E>40%K`Xim-h&dW
zci~jQP0-GTil0!dpeI7X?X>XUew>gzZC{T!GRA#9sa;xYOU=$pD4%bXy$m!7N5
zyw3_D7LY{$f6~Z$ffxFr<8KAtw&_;fb-(QI>;ksQ=041MJSdsGfQpd9M;BEgatN#H
zhFf9F2cXrM>wNkOu7MLaLPdz5;TY-!
z>GWWmP)#&QW*edO|}~_MSdWOGBopY(c)FF)9u0
aO(P*EEjwQ*Wi8usa!x5@n)#w#5aJgmF7zn?

diff --git a/build/StarcoinFramework/source_maps/IdentifierNFT.mvsm b/build/StarcoinFramework/source_maps/IdentifierNFT.mvsm
index 229b4a05111c2578e9aca5c9babaec52955e9ec0..16a1d56c5402cfa558bd1fb33143627e78f4d0f9 100644
GIT binary patch
literal 7918
zcmb7}Z%oxy9EZ>S141B@1`eFIWZ6ayHMc?=qa<8t7y)9Ic*T1!!qN)@3tZWA|tHmJ4F!=3N>!Kz3^+NGEkV3PHtuET5aMwV}K1y&>Y
zrD^96NOKqC?S`NVN}L}`v-B{1eq(maAW6*Ebi
z-IzU)EKU1F4zF_!Q`dp>!K_Da2G<&Y4Yv(kYkU`O2LzmI{0Gc45MLV!#j2as0eY~~
zn8grqa7XdXDoEGIXOJaa1$}(_v4%h&ANy$f_}s}#XM;XI0jxyO$7h^1=JE6sWU;j{
z-ZP+&Pcc>n=;LGGlRiEjjJFT;@!5m*3Fzaq9jgl_%4dHCs~=LN`8C#Am?X_lvCcuN
zH0|s+OEZo)nFN!id4-w%m{X)_&&Ms&%wfE_kS5Ixth*synzlY24pQb?V`hPK#NC0M
z1FjKQi2E@3;_8}Xx{I$u4MQ++d)8c)SgkeOYigYXZUOrJ5Uh<=*Qv2zM0^=s(y$lr
zD3}bLh8K9apS}H%Z}A}3VbE##IhJSZH0;K@i>{
z$G|y@`;fl{*DM~uy#j$ixT;Cu+D-G%t5THps$bpSVN$r^)IXu(9wDT>l)~2^{ngQu+Udm8?ytP%d8D~C%Beb
zH*OCEf+2@G`v&tnNN9+LqqR@zE5hH%rpm3-rr@Q6&+#)*AMObts$^kq!E5!#mS!bZ
z7<6GS!|DNDn0v7ff-cN$SYLoHOgpMP)V?{xC@;t0+(4E}Qt~>b)jJFkZCw~^J6?7+m9qUcdoqPk<
zcF>*Nvvz<(fu{1MV+J@!S0?gp;2K@IxcT7tY2_i*V(<>EOo45PZQj_@tig(b&I`|c
z3mkgM#%g1p1LwWljQkR~?%n&id%$jANxcO>ILFz0Guo5GV&m}R!&@)odCbn6>0|NOmO>(
zWeH}9H@4%QC^15>1DBiqA-u!ja(_C`8cu+&%66;|y%o#)eFy6r==;-UtYOggdlG8|
zbp6`db^YeCM+-sM?_{iLpzGJZCw+gaX1sNv?@v*zdeHZ$Wmp?P-=B)H-UI!e$yTg)
zL4SkXh_w^+oy^Xz?_@_9?>Oi?Str()pzmb%eCRvbFO2sq=sVf>SigY@q!gBxhWMLs
hsPM6(vhp$(WPh;qk@C<31qFpA{5|@HAO36l%|GbGB{l#6

literal 7815
zcmb7}ZA_JA7{~9!Il@su%#5Z6N@N=>C5BtAEh&irEoFFkQ}B4=9JW&d4e5oXxx}?n
z5N2EJOVe3tEGTiHn`JGx+6dM{b2T}X&Dzq|i(9oKn*E;T{lQQFJGb8#_<22V*Y&^e
z=OK4x`N^KptpDPt3r?+jq5rVg3nz4&zD{ijkR{f
zo8z(e4G)I+b*`wCs5a&jB&Fa#9P5av|8N=k3V8n7wrHpFgEhuvfKQ3}NGlOE$5nz!)0di!cN_TRlT5{0
z0ZG!d$M;LKl6oNsNOLt-HO!G_5te5sOS1s$90aA=g0&syN^=nFB+QfMlUQSrD$N+y
z6gVa0>dVG4Zj({E?due)nrm6QW=pRGlrtMFMLHg|xhPdf}M4S&f2(A&g
z4EJ{M&1rkORj=X&sH-91Uy)m=601H++{T;(E*U)y0`b=7HdVU{u?Aeyuotf%%wnB}
zgIwIOcR%D)+>NydbQ*SJdA3f&omhW@&bTqGpFwXCPG2*18m{3Um4Hse46Iu~r=fkQ
zIt^Q?*8w^WTdnV__I@srb2LM}Wu(MXY1*1u(zNN2EzKg1d>1$jXU7(r37of^&mun$
zu37vl?g8-on<7uB0DKGaZE$@38b_VIa7t&1q!S1m`x(M=k`{HY>;72>w9W
zq0j0t8z9&oYl_96(p!Wsm|tL?2i=$x
zScTNojhTg20JY1?1+sf~l0ZhG;Cu7Y8y^{Yx&3Tx5
zCHJgUaA?ree488x=jfV1J`1kVbs6^xIKHjSpk4)UU}avc<>O?T_kmKHOR$!M&I`{h
z2Zy!f&4@9B;C%0fkVnAv-i_m)0mpkcg?ho$9izFEH`Sfq+p5DC+hV*2K;P<{v9dtl
z>P#%p*3rBW>oL%Q+kh1T9k|ukOdYtxn8!f}?k=o8(1C03y$;+n)cXo_;7(#CKnLze
zSkvIJ+SHOGjo{qmTajbn+T>lh-QEG5_BK73{owZP<0$5+SKDzS;@gaA1DB1^QYI}M
zTsAg&)LaF6dVE+Zpr_|Au4@aXo}MzSde9r2Lafc8=gb~m&)I9#I|O>p+Oc+ko-_NL
z^qhS{y$R5B_A%DypyzB9YZCOF4PpHQ`eVi=tiM5j+C7Uk3wpC;kFGaMx%6=!=*?0p
z)^gCBB|9Jbvqw4g)`Q+G6=6LD#y`Kbsw&JMYr~~=6`MkvI3fFk4I4w@`%6knEBQn5
LbwB*iOfvrh08*CK

diff --git a/build/StarcoinFramework/source_maps/IdentifierNFTScripts.mvsm b/build/StarcoinFramework/source_maps/IdentifierNFTScripts.mvsm
index a0254968017aa265928c10a57b883aaf34b87ff2..1ea7b7cf7196fab923c60d3b047fee74879b6835 100644
GIT binary patch
literal 715
zcmWgL{BYswgim+F{;j=n>u2sC`-8b*_mh9B$)5OngeNB1yC#!?VFC~{GN1xR5zmy=
zypqhc%+w-3w~*lEqRfJlVg@D#22lbghG#J_!~!uBJ5Zl*YDpp?4RJulsXz=;@06cX
zNl1MSP;E01GqM$@=B1<-5mMg+R67ZX85o!eyZ#(d;Z=~~1pT=TsOlOJGZ9n?Qgt1O
zi7-?$n}I}P+tH5

literal 715
zcmY$^_1M)D@`w5HDS^FSOFnSlmRp(2%M{{mrK9+E!OEKb9;plrF+j}7fC?BzJX2Eh
zN;1p#0K7HpyFRZOl;r@rZX@|05P$FrwCN54#Y$SUKUVcA;@roL1GP5RRqL@
M0}rIC7>F4d01rk66951J

diff --git a/build/StarcoinFramework/source_maps/MintDaoProposal.mvsm b/build/StarcoinFramework/source_maps/MintDaoProposal.mvsm
index 9e0fa0eaa7866271b76123483823a3a698d1ea3e..b505ef005086892e65368104ebc3966d14611845 100644
GIT binary patch
literal 3085
zcma);OK4L;7)B@0rcK(^xX>zCC`uJU6A)DJfu)5C)@n?xhDeE1y$i&f#BxVAviijTDEK{~C81
z0$IDP+`*VJd5Bb;tdl?ERMdbe3crN#aP`3C|DB-rB$$Lgg|&EFKwp~olbvCy
zM=%4@oWT4DL21_ZHzdt}nEkb4buFEwE$6R{=y10
z8WWS|W6U6Cqcm%`sY#lx)N6;hG&f*vhGuCtVI^UiG^cij;^%}=HXGssKM>+#w_=e$-`=X@Xa
z(x7v`9qSP2ocCj8LFYV!br{0(W~8t#gU;kxtc##C>0n&~oypqlI+IVR_Z)O4$FW|3
z&SdRk=}dm1-W=#m#zV%e0G-LN)N8>^$TOP8{0z&bxr%zL!NWrouQO&1c+Gh$?m7sD
zz2$rdZU=aN$a|3cz~e{70O}w#IHOM1$~gslOnoX8(MO^Bs>!Xqg>wgVQ+S5;7Iag1
zhxG|`Q+R+i3%V)%z~b%o&=k&NMlp3$s9G^FzC>3#ZSC*PSbO?1-M#6(N4q+W`3srK
BBEtXx

literal 3085
zcma);Pe_wt9LJyiac(-B=^-pAh{D1!f(is9GBtzDTGK#?*O%=rhPutYGu*{X5JVtZ
z*Qjm<-3`KH9nvm~$RMcfP#PUZhcfZdXUd}6_Z@t0pXc{Hd!Fa}d)}Fex!A*nsMGtR
z?{N9{^MTf98^0e9-)M`iU0g4|>Me~JW3u3b|9`$%e>zj>wzC)V*<9AO$Na|3h+6k>
z?t}3wa|NsHq2hsnG40@!a|fx`0=`HhJL+T-#hjxSu@}9qGDL|dk-C6|D7CfTm`?D8
zww9s%6S$|r-QFt2HIm*I;FKUNr`
z(tJzJ2xfyctG8*JH1|>O5X7X}j&&3orP+*i47N+NVjTw$SNSFFX|d8PJ+_|LxNkOn
zH+?Om^ZEgI8T{dKUIxoUOL!DC<_SbM6KbS9r-y$7Ai
z>c!HT{7$_x=uF0HjM)J?lRv4~g4ra`=nLj5G)r?Q^>%@WhbUHS%x>_S^F6rxAsF(O
z^G@6@@cfYXBM*YdkBSl0t5D}mIY}$!jM+u?sgOaRg37BVw{i|=9&}T9hxHM3Q}~Sa
z6?9Wrz*+&_6np%Va%l`b)xo>x!|0B8h!omk<$KE7ME6;WtV-7ic|&`wvvq7sfxD<6Cwv=R3us+9^?Q
zOf%HI545{2H>YCe<1c}#%B)>bvfW@z4(fZ{yk%#5T`zCtoNl{c1wLViSCHuQdfj|i
zw4mbzoPkLnf(nlBdh&rT5%DuLeu&y#^88Yd<=efEI%S!#yI`j3ueyxakOF;~+pyA5
zA#cim?7bPYQkr?pcQ8Sk;hV3LX881RX@;-3TAJY}oG8u9JohcAk!BaxUZ|C3cwOtH
zS=DIFL`X=}1Qtw^<}9o)VX`!rVkKdUG&`_tsF$XPbpRTqImWv@hS@01z#4=Im;Og;
z;}AqGdgpL2j{8NoEARL!Rj=Wep)yL@I#O-SQJ9vqJu5rj53Qc@{%A!gdI#gioQ6bi
z&<-uPSS;!D{m$9`1kub=Zqy=jY=u)y2YdPpr
z(tzcIPW$h$3ZT9n86A9K`w!W=k_HGR@K)
zWxaW*Xyp44a=1TJk)>DWukL;^8<`6_J;)ihuARdoa#4qEHz$Z&U0o`WyVGV
zzC3cP_d&xagQM-0bHAJ)zrN(=nf~r&YlioYw;p};`~8arW6VK_!Mnd$Td$XQ2Sz$=
zZ=F{ha0j>eUdb!lg&JdCikydV#vqo+dOMtAR{7^}CjwuI*N|=mqTIs6I1f`BpmJ`&
z`W%!uit}9r?@ye6BY5-bjA;ips+Rt5hB1#J>ic|x`vPj3OH&`s@hv-__nmTCt(0mu
zW)U>L3A78An^!SQ@zYQj&)Fp<52TE7p?SzHT6V7DdPOVm6zmZdc$XEPLesEUaf^e|
zf=&=H2GidLl^oyoQdfN9lVbv3VHBk04t3F}L!
zktd}VYb(U1S!S0p%vx!NZ@x~N;nOFi8NT9rX@;M0nlyjpY5sr)X%?{dLQsU*xm?xzyUE_}f|;*d$vwP!7SOFE%&J?-Qu2KYx|PhqS_Zn6q_Nh4ZY9gHR)B6L
zDJ&m!*?)yq0$ui9SUW+NeYmHE3cBo1V?6_1_Tj4OlBdm;G9-
zZqQ}F3Tq9t$_5d`+6A+unZv3=n>06K4a00{hO5t!<^=gBVXicfVf_m8q!~7u`O>^b
zzQ16BH2=Z61s_ZE3f5IvD9zhgcOb%jWKYtV0}!=|AH*GnL?T)f{{i&0TzY2{v>1}kZYLM*%9}>-fLP+q?OKjO+)1E{<%j?q9_2{~U8JrP4x(<+U6!hpihIIn;==v6G4D{&Qjx`Q?bOqKKFf}b*
tnT)l$FKc!5XS@3{J=?lEnJK}apY``;`g^TRN4CrA+5APvrk>82c@5BCb$|c>

diff --git a/build/StarcoinFramework/source_maps/NFT.mvsm b/build/StarcoinFramework/source_maps/NFT.mvsm
index 0335d3ffcdba550c4e59df57c6d0161642b1b513..8e1f763d924331fc4d457094f759de91ba223923 100644
GIT binary patch
literal 36623
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

diff --git a/build/StarcoinFramework/source_maps/NFTGallery.mvsm b/build/StarcoinFramework/source_maps/NFTGallery.mvsm
index 29a82216a72771669d9d54c95f4c311bf5afa539..37d36a0c2afa01a1c7c9f701d7c155d3339f69ae 100644
GIT binary patch
literal 15843
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

literal 15843
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

diff --git a/build/StarcoinFramework/source_maps/NFTGalleryScripts.mvsm b/build/StarcoinFramework/source_maps/NFTGalleryScripts.mvsm
index 9038fe950ca198dceb5e1544c10ac5b7a4253474..bb1dd369b28416bd8ef0c4c06d244e40b0026e19 100644
GIT binary patch
literal 888
zcmWgL{BYswgim+F{;j=n>u2sC`-8b*_mh9B$)5OngeNB1Td|XY!3c;M8BhVEpr2ca
zdty#bYEflya#3bMNihQx1A{05<6Z!bdI!Wz>_F|lsU?YoG`t5Y{szP#^-lRIm4wvu
zb}=xB05Kz5acW*lY7rszvOu-UK+M3vOxX1?K!wR5!wLG+9H=SK^
z2vl|xWGJzLcMGWaArKQAct3z@{{t~Ik%1@J&A=cI#7vnfgu+=9s7xD(If_z~Q!~p5
zM~o3ru@w+AFt8Gim};QHCLkspF)ctsrVt9}i$G?Kz53?z&Z4o|
zxu;8qQ>$NRo_V9qZGWaa##XjZ#Lu66nK8y(fe`%v3sohu4Hs=U+mOq)x$TX1E^N%Y
zX!ac^6oKN6s+1}SBbWLGN~}X_@vLwtyV@8q#%O
zYV~xZ<;F}x(3z)jA3@NW7jWPB{j0k2xvre&^b02E2H
z@Jvx@x}1CiV$$4(wGWD=S$O{?(wwE=b10SO6RdgIB+VCC3s5G_5v*5GE=}KBga9A@
z6WRO>L36i^`wfETE>grxfKbeH+p|tyUD@5Zdm$1eIrULv8lk%N--fn2b7{A&&kB&a
zWsdj><(K>oX}O-)t!JyF;53-Hj$Q(<6Lj$%im2rCGRGo2A)Lzgtix&0|=%
zp<0@SK-5U{KK;gFi!>*&CLu1(VXS*lE6pjaX$bItGhS@WV+gvSW^iXA=z@BS`vD>W
z7u0XuPzhHy>-1O~dq?fGIQkC1#OZZft+bP|`&7vR^dsQMO}@=R#39hTW)5o+^sX7j
sdJTHle8l6o$W$jdzBb%!DK;u}ws{
zGOL9KVMz%IMu8ChEFy+XDvO99$TroY7D7MNbCZE~?;Ut{&pF?@_kQo0!u_Tr6S=Fy
zvx(%)d`0r>#(3pZ~
z_7x`(g0hvWxGD%DS9k?VY(Z-GL^(q68bF}K0*%rm%m!SBrTxQkx@x@<0!&E%b&Whaw4C!bf7EqkZb7*n-UXs4}IQq?r!
zH$yO#u(L{DS8L3A2p_l8eU7pRX?q$BDEAA_Z_rof4^|~J1ZB^&m{ph|X?9}{L5Vbr
z&lHxX%gN`URGJ&Hwn3RRi|@Z&nh)sr7%HSWhxG(1rTG+V9;&1{j`bX>rRiA<;N!!;
zCz~I^Z|;_GKZD=gg-Un{5Gc*3x?LxyuIwh<%@FdFoYt^05vWi6+t5~TCYkCQuzX~0
zi6fSw`k1#NtyDhWr)O)S-~gCL9la=CFX-qMyXxqT&~FrU^iE-21RcFASl2;EZw%`)
z=;-xhy#^hVM_8{w$7Bj?5p+z7r|Xz(n1cxa|~-7)=2Xf)-?F|znLsEW)}P|s5`iG;CDg2zpK0`%HB~str2~LSK^#-5?0bl+XJd(JNhp0;wInb2;wN{UGosD0D9M4
t!+HjK*Sy2}1bWxRu)cxbHJin$2X>{-&!Fj^L
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
W@U)DK0)Js4Ef?mb6{S!2ng0dWU~T;X

literal 26473
zcmb81d306Py~lTQlMo;f5lN7007F27icFD*kPwm^5+Dg=029zlNJ0#dfeeTe25ks}
z%H#kFLBQHXaPDBGs8rBap+c+ps-;EjdrK;V0?$5+Mf=&$9BSV`-+fu@vlc7)oZsH}
zoIU)0=bW2wesI^v%iim?XlPEt;K5J7^1|5-MVs#%b1rsE@4fpE|KsJtGGk05guwUz
zh4h$GQaZ1sqP$>Hb#_TL|EY^K<{J@hTxVkn!GtLD4A$QuM8?eMLQF7WD&~BwI#Aw5
zoXrm2YdCK^c%8c%69b{LW;uXD?vA4xMDonaux6(Bo_k*5eMV#ZPhGbnyOwbIidzhjRg9^(kK-
zXUtkKA->X*T6KZeVLoJSrno#$`w@Q)dS$cbf7-BGEgoh}6_}7tC8eb`jnxgR&(+wC
z5E|WaK%k_otggJiULE)c4*C>aPE71@WBPz$C0B7T5;F`}f7s73!!h-Gda19n_3^};
z3VIE?8Y>a>O5lBZhxtgn<)CNTEUbGVQhp+9-3tz%ncbZ@_#6LZfTHO95O*
z&RN?;5+kRfwo#3SpW?j?rjH&uKD-FfBgdLCpm$BLuX;RW5^p-_@o+uXt)R!lOss0q
zrv7?M!Yl7O`5y04nTKldZQ^?nlU#U
zb0u6R&0bh>&_kNxSbgDgX

hAx4`0v9cjnnqKR@rCC9|X1G$CGqD2D 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 X@9@<0^gMrlJ}u{Grxv7T`piE8l#*g< diff --git a/build/StarcoinFramework/source_maps/Timestamp.mvsm b/build/StarcoinFramework/source_maps/Timestamp.mvsm index 81df43a5ec63925724f495222ce01489d3ec15f2..5ca75a3efcc5d8838dd19790aac10d848bb31f38 100644 GIT binary patch literal 3370 zcmb7`O-NKx7>3WCQKwPI(b4D!mo0RcwJ6epVZ6qTaVDL?qQIMp*~IAR%t$TTNI#2q zLBB+9+O!BF!az-lXwjkwDJTqD2t{DlqK&(Ht}xK8+`f1su=>3e zn(TTxS!}(3Z)s`vs+ldQ{XipS$K##4>}8rSRX*ob^+@-=qz}n zdohhZ1}17u3mD7qEwvT9)$3u{J(aa%h=ZW_p##eWy$|oPeuLhJr&x2K?~NI(y^Vg( z_;#!|&}Te=)ed2~OO?@UrD+o{33bv;VGTk=ng_AEp+TB1)+z9DX+GfhU>5wpe$TKM zA?*9rdyTyeR%|q1I6ahi|Kss1@V7G!hRaG7aXa2_&_x`?>HuBDkFnl?F5=5rH$fM1 zWlj3juM%$!^yBvvi(2>b_<3doQ%yrP^zJk?7OkKonSO-8CaTKc)qB8H5(Ho_C zmUxrUB+VYI;}G*@j$k(XGQH7Tr0H2jFje(-DxGx?+bKKaWGvIT`RSybtP@W-5^0Y`piVG242bWYTdH>C}MTpK;PDw6lo-qgnV5&<_*nHI5L^@* zwQ=D>B7>p_xl#yf;VPl>Q4m-gl?bVFwpM59rzX(zVn~Q|DSX2{#<4@*YNGx z`|QlvMpOH%!@G~0wyeuHmm2RMIU4@@@`Z>jfCc|HE0{=UQ$vNm?4VC%Uy1UG?mtWj zOEY~$3xTD^oWXhmdd#93&?kDmPUJS2R;KH-s82zk?KIXZ_|$bRVSRuS)qIY%0;Q^1 z9Nn*)W{zv%VM(7$L^eTufxiC!{BW+IC3g#Z2WkgWxztd4C|M}hkk)gLUcpjkRhdm^ zGUX{tG8#M!{JJgOf26`qJvEG87$$MDKpl7nUCOwmT#M_55bw!q6 zqzVG6`H^@VP_CNQ#0!CkZMqN<=>^lwoRzy|9Q7gSnaX1ggPy4zma+9r8FLOis1K?{ z=D{?|S6f%8TBH&5b!`*$59sSM=4oPjD6Cr*B6q+v4_SDPx&r!a*Rgg$pY1Bv8t7Rt zqnntbAA{pHBCQ~n*ITL$+ciCe-P5u*fj9~JKJ;TvfxZv^ut)>w`>;v8@1Wls@32zD z)X#W3RuAZB`~+4n1l3(Cj$Wafqr|%gm8y9IYZ9teGmkX_A=RA1x(gmI%}4wmEP(gd zZxQB+MFukYOMRK-e>{E#{&vPexU94yZp1qYdJ&gnodUgx=do5nFX9QT zY0!(fxF-G7Zxin)=#SrTEPuI|gJH}Fre5y9Fn2*O_b*scV(LYF4C@T&MO=?{7HZVI z7e^1PW|nv(P^+5fur5NxlX(TR&XZ|IuUAcDje?X`*={V6Y_nZE?!+w#AACBllW?LP xPLJKorAikDrHmyQBq$7$tk!B*TAfk0yL>H-c zBluV}TER_)D!39Ab)%wSef$UFN)QU_H;Vyxze(WBCf_-8?mg$;$;|z+sfB~vt}l7z z+^M`Q?OEJ;YwP^*nO_gS?&?1=_xSUynLU97{QpUms-v#obnC&%hQH7A_T zkjPaVr#!zpe%4bVlj!X*M2Q`wSxD(JI%!q}U6k<@{dpLYaqIO)%MVmJpOC+S8DB~+ z_Lx;5A+@e<2mi94BXtLVx7UviYv|IEP*iL*nl7TI3CoO0HY8 zN$v4u!K|;>tZ>}(YVOF$sMl<&n1JLLAsdYOHR5D|!$b0rKIfip$=R-A4uUP$BQil5 zcR`OxRJ0zE59C__Jt7aWzJMN)0oJoO+yOaEMXZ(3Bh6@6Gtz94?*e3{8DL$4oHUPN zU530gqka~od5wH+=#}P8tZ67pa|-JQl%yFQg{9JbM!px&C(U`R*HD(`Tda4mOqw06 z_fU~$w4#1#{v=<9YhZ;mqnt7B+Ve@XD-i$cx{BQnBN%^K$s@!!pwIpymctuRpZ$-R zNlbnA4`U62KKnbchCrYF&^ih+9=|(dwja89Ssy?@6o#aO@Nb5?<%dvfp&t91pT@oo u1}gh^oIjwOcMoe0bn~L;>*lS`nr#H#yj576K{sy;)^^YrcNuE{%>DuR(JGh# literal 2661 zcmb7`y=zlp6o=2vO`4=>i>=Z&AgEY%PzT8%D(FxZ>c=8cj1J+FTv1vQX>LRvL`cU{ zR4537I%sUMi0D#^U~y7Jw+_-p>tq-I06*}#!v(kBP2kCr=bZQ4_dVym8GY`ydmoQ| z9@%ns?%nH?&e8SK31{(VVdD14vfbZPS}?OEaNz%s(^s7IY7MUvT&dTN`#!&qid4;n zSqq$Ou|DqCiZ`zMDr6dcHVjeXJkkOrbr~;GW^bW`GM3Rlgdu6KQmHpR z&2g-|&@IjAJaf`~M7}4`Bh6=6bI>czr&w+1lV&su8>IP(d@Il|&G%SeU_hFySYKhI zG#9bH!6s=&Pc$sezvLU_8pumC${FLXz3G}wLHw(0275M)p#5bfFA+b2p8a1~3EqHu z_E#`nOg;N&uu7n3{}9#%(6b*}7a_*-$I@n}po5q7Y4mepNGb^bW~f`fj9Lx#*w_3+ w>^2yv?B8+ROq|1;$6Nw^c+vX$@OHCu0rcVR#M%$~@D5-d27Pf4VI2Xpf2vG&8vpJ4AOhKL<47PVhlPY34b{K}n?6?z6T5WcsO~tIm zUk?SzaKuR@?MO^Tynww0a_!D!TYFsT@1X96LRYs|I$hR%PEZ9MB;Z?jkIratm6K5V zNz_xW9_@@QcjS=#+PVSei9h zwU8stN~|8pm1YF%VaSta0BarOOEa~5fi%yu-k=J;a?;$7nTcF&1J*AvQkrM5&cP^Y7V`TnhRday zV7>8}qouhBs}Zh{rXQ;X#z=DsRuINY)4^H^V^_&&cJ#AN~M{~dE=$|HR~OL zE2Vi9>qnR%%@bI^!$fJG#5x6&qmtFTMQ^pxn3A#_2j&&R8K4mV}ouK=aCamS4`;-t? z2k1T}fwc~FpRyk7InaH|CagC=_bG2;?E~GX9KbpPx=%TZ^%Lkmr5Ni3r12reN{m?x z8Dyhw^d1)bc{5~?jkcrjhJj?GgTx(!3GVOIz5j443kPlYBG`Wuip8C9gkP-6 z6en4us5H~8R!+n;$ULjfC+bcZNLE`$TmmxAY7Y_gB>bPO)=T^cFp#YF6>-NQ-K;iY zyfGEvHjT0>hY(kR&T4b9BA~O{R;=xyv)V^k`#@*4KCGWXXSLHqXGFuk~1KC!}+y`Uf))Q{Sn^ zVwHiuQ_aL$1o}?31j`0}r`pRoW0?9*m3sCxzRGiQjj4hRszf#VVo1A6SjerAL6um8 z{tyhLN<2;6R`|bF;$7D0gUov0--!4NGOrT(dE73c|CyaNv2gr+WpgKqs-jIMZVse9 zf~!OJL&jxg89^}^H}GEhLBgMffmD^Zh}#3k+^(y{tbFE$psPd~);!Qvq6#Yrx=PH) zS^&CA6k+WGT_qmHdL4A{+ky24=qi!gT~~?O1pO?fUXh| ztcO8Yi2&9*&@;N!?s`V|A?tk(x}F@yIs&?${EBrBbUi5?V$4*~_2d?;g`n$60LuYA zqualxh))~g0R zqg#Zv4D^i7i&X=9MpudTT~Rudw;h;!K~LTeVEqDm^7aMRe$bP*ZCHnxa8$_Kz!I$G zaE&x;u!1mInk85vm?F({obxlxYo+-V);5?b&HJ&o!*$Y3?S8#9ONa5U!wu4$g*6{; zl%^lcfl6tv#(Dy#N%I)b-HSP0ny&RS+$7DNSf9fTY3|251~a9(7i%BPlIGi3?k{e( zG?!vIaEmnSuv+0(X%=90!5nG+!8yOgyiJ;~V0{9&OYg#=Xd#eXs`tte3E`2%MjK3Hi@Ov7XJXL{OUxVds wX{_~os|TBj7hm^ORr#750#>!p+tj~^x23izV9dn-obAF!3!5AISIaa10^_lo9smFU literal 8503 zcmbuDd2Ccw6o+pGy08jWwzhzlO;IUW8j*Euhf*w^(oUt2;Nvm#N=KOKFpDihj3N*P z15sm88x2N{22@Z2io^w3Ebd}#jEWLNG%krojSH^dD^4KskKars`Tk+PbMJj`I_I2w z-Z@ZYJ=t;k_l}?UPHum6TT$!n2Y+6=C%LAqv~kFhH`^y}F~)3%EI9XH)*ye(j>PRi zBGeL@Z%6FqPR#T)<{hz~uh^I+VDfV8K%gZVNvMeB*b(RxwPQ{sVKv+FW)*V_{$|Ka zgu+fdVTYqC;$iF^kZmUu%`Gvd??-(Z`ntNc!dY$I=mb>IaRNSd_ee$pE1kH~e?mR& z>XBr4nIn&sH`WLlG+!RO^pG9_t4E`(l^daVr^jWLzmR<#1kh%xSe_(k~fj zOc~@P+9Fnyn($R(hOpS zp}#bzV?|(qG#|m*3Fk|5Kh|LwD9z(oAHpDMeu4EJDB9oC&LUtY(5H$w!yIKM_!iqUzx{6R_xvI#e z#8txi?ygaL^~x4IXeHA460Ret2@0&PHx!74q6w=d#u|YYbeC!MeF@^XLf1=91=_)2 z%!$i~evG*1At#;;1k&(-#61l(fx1t*WVkUUp!<}`SkpoGDKoJafbLW3v6g}EQ-WBl zK=&zeto5M#l#N*TgYHw>v37#)Q=Y==0Ntm&j&%ZbpYj>j7ohu;L0Dfx8edYhz?e0V zK{i^8z5)8An~k<1KLipJ5x>;>x z5tl-6n?_lcgNQ3ZXSJDFVbEFa39Q|qv)W5o9iX#XC)QV>v)V6MgGZ#3)kb4Y0-e=n zVby}pYS&|}0-e=bIpp{@BuZ>u1My7M8`WrI`Q{SnE zVHJbEQ%%8|3;IsA7|RBIr#i|xqnP?mm3sCx{*Gg5&Jsze3)d`P=WSjbI~L6vAj zUkBZ(6894K1pMDB@f>S(LT0`1w?zB~nOBM29B!A;^~_FNG!#2i+1yE@s%Ybhn+9o* z;N~IMLB?feDM3*f-u+(rX2S1-?o^ehi8~0!%+OV$EZ3NspsPeN)-2Ffq8uv#x=PH( zx(0NW=#RAzbd}hIwF7kTy9#S3=qi!gT~~>#@{E}Sx=PH$ssmjmDzU0SSBVm=4WO$; z80$9BRl<+89`uYZwY#3ty~uh;K-ZJ^u}*-lC*NTG1-hQ}?QP5i(Dh_0)*R6F#E<2G zp3!aPj8RNIqk9$W1JEKUyfh22f^dm6|Kgm7FfWznJy^S7f;4Z!+6|XUGqwBW(k$%9TZb#8S%x(m zCQ7po%YhPUwqo4{lcaf)=iZJvS(>i(FkC6ky;w(}RGP=IPQnyv9>wZ_GHE`8<^JNX zlI9XD2c}AM9##`vEzLZv)i6z(-*e7)F{exOQLI;BhBP;09fX}&wXX40Smkp)RW(*sMV1-jZ>+IuJ&US+{I`Emt=FnAudAx{XPcq_`J~oU zeyyj{+shQ5U2VRvqM_Pr)%g6Dr@Gp=&|7idxgVcd?A(ugn4+`M{yI-hy{Ft?<*Tv0 xjkQ&E-in@P)Y;EH<>kJH8oyQH^VWAQ;%%&|_Zu_nKWF=Qqd5&VU907oe*k;}?ZN;6 diff --git a/build/StarcoinFramework/source_maps/TransactionPublishOption.mvsm b/build/StarcoinFramework/source_maps/TransactionPublishOption.mvsm index e5f12bf58a88e85803dfffad0e0e4dc9124f0000..733e3e93e2a408774df0e8d91ebacb059c944958 100644 GIT binary patch literal 2360 zcmbW2PiWIn9LIlY*VR9@`{NF-7ez%8@i3S-afUXufh;LaI#(1PT{~+=Y|7fOqX-_n z48*fuWW#w9JUG(1c@YNUK@kPNZ!@~vFI(w{68d?+-^(}ez0jFoJ%jqf z&_?pd=AG4>sl)fZ+20SB9u=LBKfhg@n3^M^C7^(vALWQMU2V3jwT|mIi@}8Fwy#?) zc_B@v=%;R??|@>QIhG`<1I~K^XBl+yYVSUx44`{YZnF`!!c~k8fRgF_4?CC6F z3$h=Z_Xk+3AjX<+V6A~TYkr2+jhW&ZGV5m@<_1Wx=2KV|)Wi={^Bk;EfG=YXKrz7q z)(pEJWX;E@w+K?K`5e|eaELW;!&(Mu)(qE34{IiH(<#u)ni*Kb0LzZaa|Lr8f!WWR z(z*m9EYNw}^)o<9)Lp&^`!!I~e>ZBx4Yqej-(Z`lcp4_Z!NUIh z1{*@X5x{RSX;wgl_9w6qhe7n9&%?d|b{q5+jB#bB2thx9Hz#|rkHmvD5BQ+N{(R6+ zQ12DsgO=u75aD=yiBse~px7?oL+cpy73}>zq~KV}fURkAYrFw50DSZ_u%&k41ZFOO=bqfoz{E$Kx^6jZw)49(0tg)SQSC+_$+M#r>b$ug{bSrckD uYn4q$u@R+zvVT#=A*C=0i{uytJRyrab5rF zOqDA;ff56ZT=uIicSh8AQmT2gQ9GPNbqh%8=D)DRKEnSUH+PEJE~1-&QhYRbFzZn; zkInlntPenD%~!BCL5wxOz)Iqzan}3@^D{`W<|3?V^z3BKaaa?ei#3N}nV_3B!|6S& zIgfr%K`(1QgY^dVvF0sU>p)@6@Q(DeW}+Ks1Ou#@hIIs_So0mucoOCyYX;US5aEI@ zC`3zuq^MiI40{zw%AZAzxL}*8*$O5l_yrs7$D0K33-%2i55wdaES%3T*irP$0)D{) z^E`+!eyoq^7>FM9ao8%@YtR=^;{}r<1pN@+d@zH(Q&(Uu06yq&J|FZG^jiUZ(1E!I zBD@}7^boxVB=7M%^c6)v!2f@TlD$OxKyXYpP#5Agz(;=_)_uT7e+JeAK#7#5o0F=c zXN6kKl_xaQmT0h)De47V0^KlybEAIMNru|x>Xc<(itY5+p{u!DQ(o zqSpQa5(Z&w;zukdi9Z0J3r}MEGv# zTfoc;vdnBI$M8o;h@2%vw6IlnH*Hz<3Pqm{on!S&lyIxQUzE!J9S(NLMkU7fQPgv4 zwtg%&)WjxlP&oJooF4PLut!Lw`6(Y@GpER)zlYv>8L_lQg?^+|@P9L4iYB8$oy zs9Drb+E-$!K#Dvpv=wn3SwpGy78Nl}@^dP8V{$}Cjy R8cS1|ff`1GRO)>S@dH!oaZLaK literal 1530 zcmajfy-Pw-9LDi;y_#fNY1)h7k{MJGxD*w%L{QO|5WT?VDh^`zSl1&sMG=Ah11-@Q zv<5B>xduWtwe|)LO)dQaJ(oJr_6XnY^E;k<^xV`#D?WAmJP>lv9={jc%XdeK_0x8C z!Mz#(Xf-abEFr``GSL5z5zD!@tl9-ts>oc)DOPIALn*S}q$$J-5=KPTrKK=gRkpLo z=2kJYfdXbGon`pTFGMyVL^!`&DU>Z)bMi%(4P9dOYZNQgT(>Bd^*ikCkc~==9ip&f z*Dd{6Y^a4zwo%ag2Am%A2e2ndB>5>HV>9Q-pudOSx{t~x)_X!GmHH(8R8HV|rcr>( zIjDKmLFEk8EDBON2BlCZm1|I&C`9EBltf)rZb5CMFqKPxYeuMSKsHe~mHOY*L*+fz zdqKTazC(SYD3z~JZzx8kz9oHBdY9h7rH@nThl-*El|CpF^;4-|IfGOtu-*t7qA~;J Sy~dJMrlCgBFqL|rLi_-Vm17qG diff --git a/build/StarcoinFramework/source_maps/TransactionTimeoutConfig.mvsm b/build/StarcoinFramework/source_maps/TransactionTimeoutConfig.mvsm index 7048000d1ec64516dff26abdc9490c9cf4677278..1d2e6e979b79e4da58b9ccc765481b0ba19466d5 100644 GIT binary patch literal 1242 zcmb7?zb`{k6vxkdeSI|=NGwcN3pE%dni`CThN=6WX|lvdq7`;1>YA&B=h5U-#B0!peZ%?y zeb!s7PtccGDTu6qqxP9$9Y9ev*RT%3Rn2dDJjN`krm=dEW2Et-$Q+3E@5PlVTQ;S6 Re(4$FCFqOW!|D%Xe*r@ezcc^< literal 1242 zcmb7?D@?;s6oyatXps{Lz!C%&!@~gv`~a~K(sW}~&?ak3c-bK!At0Bj2_#|&G=UHv z2?T*6!QxmzjAV}QPT@|u$>+ZF-*fJ{jhp*=_dy1?uaC}}rNZmP?aJ1B$D6zBT6@Q1 zFD+L@cEEza#~Lcu+#qtj*bjrEzgY>Bcs>l){VHZd32orCO`@fl-&j^gB&UZyIwEgC zf$jA>(Zav5e@sP+^d8>ufO&_ssTtKAC2t(EsmvM76xUDMB1>Qn52tl|j`{@pT>Dth zCRiVAm5Zw&8OQa!FbQI>Ee-MG>hh`#wAGNR%^FT$A%eQ zY1L&}FX*VY!(phM+PbPLJu^1CF}Jyuv#Qpq+38+i_3PPx?+@p^{>gbgpYQK`{d}J9 z?{U1zs+#Q0Z~ic0>iXOT3${0onlroint5XjUP#OQ@#y(&3Z^>esv!#g|6f#{aAl;l zYF6dETFxC8LH5QvcK}?JGS6XMhA0_xc#Lyp5EUDqJ|$8SR*|RSRzZvsPa&NHA!JP0ojOe0*0I2ZH?KZ*4e=nR+e8w`4|gU8T=J&AZ#pa**-Rv7dlGy==p zwd8U25Y|elEzQMPOQ4Q47u+-JO7k%0Nr;o?R;)cxPnyAe)|ckz#QP64kme1nPy@e2 z)M~nb8G~t<&R%E(z`7v@;y&p8T6gz@dXizN4?`%nblUV;71hcg&-$MT4ZhiJrDbK6 zk*X^7sbjQo7R=kNF-^1t*IaM6X9@fQ=Pog1HIi=WBm#Ab_-h9+wFpH zncm0Bg%k{|-k5`lHv;s=Y>kx(dSeE&q&H?I@#ccwm=Uabpf~2XOHq!}X5wuFy)idn z?T2_7^A^^Bp^-HI;;ne+8cTBlW)fx-X%587ho;iZ!5RS%NV5L+D!s-V4K=J+lJ{W>7O?Pf1SSM@~?pE(xCTu6-Ztx=}C#*JKG~z%{*uMxF zgQ=&%$Eyd1G5Zk7{uV>m2CGIf~VoC)Im|^V!9N-Xj-@*$7kbk)U;*bW@1e8+6i5#CjZb z(jAFa20H2HU`0SD-Jo@ybe|>O%b=^_VEO5!dzyHkf=;@7unvJvy1`o3N%w2w)oN@> zy3MhYKquV(7uR%`I4Gpq(@)VtoqjrCF~Ds{@jy8H<$&Dbj4?E$AT4FL}le zn1-+EyW^bu16WhmA8`+Yi@L9CmP>r(rvI4XO8ORFvwD_{5=7M*C5L!JKxdRBtW?k$ z#hdwHIMhGv>fFDE1(bE>sYrzm+@Dzu7NJ&4`6j-ob*B03@Z(E$$f{I>6m)^1+D9qTuQtt zpiAzzv37zkxff&Y0$p<7!HOm|>yrC8W(ZT4+$&T)beV% zE3WW?FTnVYYiI)RMIm-Zq_TW^nc8#3sN*3juBy7Ul3JjAn#|Fuyw}PCOO9Se?6p3= zTpz!}ssWv&*I}&(y^@w;9RaniBHe+la{ z=)8Xdt2y(j^L{K=Gthbe8Zi?vb>0tJ*LlAO@g4%5_k$Ix^ZsJuEeD^jt46Sn+DP2+UEelp6L22`)2LlT{M-kZ<9ib8Cg@Syj`a@c zQS;^(U|8zYT06H8tfRIF_va8DG87`K5LbgS^X*4H05P>IB6CU%_2$;L&h3CW@7vPl z6!cmCBlc{WgPsSrpR`PA<>ypkMlQz{&vq(kB@!1=`6`s*e>9?M-Gg%w&`4pEE_8`B)R6gEWJ)F;$v#i8miQ zn#_fm>C*fe)>7zXGJlELS(=NmehOWrxeBWWGNt)E)=KCq%^*ExN%K1KZbCO{)=%Q} zg6`5x#7c!8((I3w582Y(#WNOS_LOFj&3j369Pvt^w=_$!o`62m9E(*BhN6GK1Kgp3 zwPwo49R}9R{ZY7M!B{qxp-u+V-OvuiT|h3ELvjZ%nu`lvo?ONZVe0Z^59T3n%hrP@ z)nENHX}KHdul_x-azK|n4YB%yAxrja$Bz@hx*W#fKI;9Dp@g1`#RpcpjS^2Rj-~?#5)6e^_<7L z2zvE+^9JZOaTeuWpE>`rl8AUZ?*zm+%~|92VL9-OG_8G8N|y3 zUEF#z8+6Iq8>=tq3mI?bfi78lV)X+3dL`()E^en0ZwBb!K6!IC=#q6F)=xl}taGuJ zf&N9)3asZr7q{MA1G;2gj`b?&lC=cuHP9vNCale%OIB}g2VID6z}g795Dn(tu$WpU zQZa%x2V~-A-}P;mPyKOoy>H1GD-mA=jx>2npT)c6155J=)@9JA^ct)!pik-GN%bk+ zihH3ppmY39T5gMJ*w|P3xmu{Heb!=d;~+Z5zy47PunA@Y7|Xc6sDr@xU#DiH&IijK z?qa;3#f1MEE#Q&vWWO45Bf*~aj=NA_>H^W8wxuZrGjlKJk{4oWi!XfuR<)LyZ literal 17184 zcmb80d2m+c6^GyCO9F&7Vc$$3Y+*4N76XV7NC-hlZ1|Fb6+<9_h9zJU3KV6eGNqGH z26UhW1X5H63q`55M5xT52#$l$QE(7j6#}wj2UKKH`@G2Q^uOPMndhI(^PPL&<-F&7 z_kK*6ws^+#EB9WC$*BrYJF>O9|H|b}28138y5#%2+&bDUSjSa|dmbWVDoUr9m6WUDUB&$l zLQ{+8DmT=V{RQNJzVRW5>7WyFB-SX<`?ep}V9?van^|DEd|Y?udVqC?lW|kPI>TwW z4})cfv+>4)X@;Ld{0-8;$nk#h-9zw&NjQTzEt^bwwDwY2@`+o{F{wdpvii^uj zDk{{cj&X%kU{1FGl-XLD1>;D%QK8(`_x*0nq6dTwSNz8GmI) zA0szXFtIu@hZAoc=)~-R)dzH92CJkKvz&MfKqqDi)}S zrZVPrtnZ>|#sdI7Cd=@hSGhUiQu`;2#G}ExgK?`Z-VuhilG?TINp_MefRRD(c z*xAdukHC7+9mPH2{g9y@twa10d&-}tP`;u_qjX1t>&)7t%1mUE4r1{Q0&_y=~ zs~B|AO~WbyU37!1>!Q1qc$-0Y!@>5`MfY>!T>@Qn_h20YU37!Jtc&iC#EXuz6y4TX z380H^E3EFIi*5s~9-xbE3|4*6MfW-*nt<6>W?TkV0ko55FRY(Kduaw&?;y?J5^n`` zl;#qwjc}hd4`F=>3DVq-brKS#IR)zybdqMncyBw%#~T~WN5 z35G-c*!?^^2kR`~@@@)*3@vReVq@@?Rc?*ph$DSulR3tR)s^T4w0C__<6DsfxQD!N z8Qw9(<6s(I!@jh2poizpwqPiq%=nbDs~Z zYkp%kTmO65oC9!&c;7O-48$xj4Q~`rz za__|21-j*~!m0(`a^J>^q%`Z6`(w-yrf#`MU^c|(h962pm)+9tPeof=*?J%LGQWX>Uz(eB;HxjkJ>I^T?AeC&taVh zUH3o1YR!7;x*vnp5_H|aOw3l8y6y*8*L6RYcw<1<{a}acx?e@Sm7weXR;*V**Zo~s z`#{(IBUr~k*ZnZo=U`}MR`+!7?_fQZcHzEt$G82G>HzK`@M$Hp`j@?&D+8VX`B-y6 z=YKL*D(L+8=3Fo=@6fJ1BLwTLO~8HPj&GZ_>A17OG;7xpzxToA{GP`80rafx#X1Oj z*1Y*67`A$O2i_imb=H>SJ_nH@LnE>taU&Qj-$B$5AgW$j$^1e?zxn!o&h3U+@7v1d zT=ZZ2kJzi_Q1mRY{iJ1XN9X2&GFA%cmp(8*-B!|ZG_{e31$a}3rL=pxPFZ0st{r-}Cr zbTgUNm_4Mq0&5i{o6J9A_LAmutlvX#X|Bh58Tv?bE!H}?Uz$OAN|EL@;@yD0(u_;s zRDcJhnTXXBQl&W@YYg<0=3Crj7_+}LgK9oNnuWwGhJn(YhBX@=l;#syWngIfA8NsS zJ+SsnnYfRD_2K?_+=*apn~G6qfa%%L8;G?)EtgYr8!wUv7rH$;j~T+$?a3a@L*ABG z5AIZd_3y)#`-1-JpNf?Ry5(ttH3$q5&qAC7p-|VP2UI^9 z(TQ#W8kNi{np;s)YH`743tV6IK2K_+Bn^~Y+)VrXjH}@^iINbNi}A;l@H_lz;uBie)@zD=@ZkgHVTo@xM;}3Uv`! zp5a#Et@NSgA}_{T1$vQ#>+3~cPrMr7e^aR`>)w`a4%Rfv!X4-RkYPOv5GO*UaY1(C z?gHC$zYCaO0WW{$FpuMX3VN1zWBm*CEC+Y1Q|SldMYXe}(pAi8Ox+pJ7RzYKj#Px;64#H&H{eMu3ZMnwghZ_*iCM zZejYk-29wyl#BO&$<8TAADf*~_-JNcc5Vi@>i?LN8!k-G50B2x%YG~~BjTq&hI4ZZ gM`UN+{dlBn<;`$jX8QR2yoq-{k~txJd^qI(3sG!x^#A|> diff --git a/build/StarcoinFramework/source_maps/TreasuryWithdrawDaoProposal.mvsm b/build/StarcoinFramework/source_maps/TreasuryWithdrawDaoProposal.mvsm index 9e4d2a1880ba5f17afffe9bab3b2716471928474..697914b5425469d6b13035b740a216ac43801eb2 100644 GIT binary patch literal 4756 zcma)wcJ4=9&d26%%bDIVVf3-3+YB+BvDj$<5d`RQ3;ijm65bm-YG=gbhCC5J;ylE-R~?sH#^V!ao+R( z{_lHE9bY|i&&JD_t(kW&JahWfwI}kIw&x2U&g_4;^D}$jhC8N>F^9o||NmL5oY428 zR@fe|P423O-t@2+Yzc#A5P9_uV@`>F7jd!~ddw*EajYjnd2=}PDZE9Tf54JGKFb{2 zVC9_PdB5SP8SKTKjeRA)g>(#-=%@N~sWF{B>F1Eg?SV`#s_ks}p_iAtTqDg0>ow?-W)mxff;3&M z)6gT$_p!c!UTMCL^(FL4Ga0>Kn!W7)J7JkLe`e(0;aX`XL0m4)J&gPktdQmm)+}5n z%>!76;Cg8u#ySc&NVAAF4=bgaRFoT~d4~SJhgH%%kM%1INb@+>Z?IaLv2_trl$&~% zO%G`g!3ehv9Vri>y|}ZGrpC|Vy#ZGDWPBjIwJ2)oGJJ*>7l4e(g;~J65|1Fwq*q;r zZ^{|77IYadVBHG34Bw7*ALuf?4(m41WjKRX1zj??VC?{1GVjN#fG(NI=-qPVr|546 zmP+$ItPen!;TN$!0$qk1SS`?H_ypF+km98NByY@DkTzsr*;P%D^b@#m%rPuxK+RIwbk`*9r}8(x?gAoVQa#j3MPGdNwsP57?^$? zeFrayN08ep=~YL65Bj66;&g(SH-`9O&pLqwDB* zcX0y&9sTuK4}gyTgIF6tNBKj;WH6X=iDlTVu zNLx-SxHU+7W{0@DAs717UMN4D_MyH4Rwl(qS$+kl1+c?p5dWgnD{;rtJd5===*Vtm z?599Sb_nZf(2?!IS_3+=$_syQ3w? z9UOB;O6B5qd)P7qSO00-!*1CgvWr{ovg?#wdz(Ep=Ga_iU$=y6S`h+`PbVi2D PgX8Yt=F-@x(_#JvzM0j+ literal 4756 zcma)ByXlW5E6+K|1i3cL_Z(`!YPSUE~#dT^cH5sS76S{G`Q)hR( ztU(hvXq6}mB4Pk95)4`|Uf^QlP0+-`1rQQQ6+M}lc&QikGnh%deW%Ii(*3+Y^X7ej z@6Gbj8^2|~-8$7cz2VE5!Oo|?OYA9bJGc5k>C)swo5pgBEo00Qu_AjgS92q|)xJ->fy1e-ZaGBunm`a<8m4<{ETWD>csz zoES~Ay~aEX={YZ`_;U6?Gm{(88F(eHGOyS6d*mfBL;5`rGxbM7@5&rj0XpRVy~)@+ zF_Y3fgSiZ=q!}$jN}AEjOG`6ar`6J|@-z+Tl;(b{58)1J?#4O@UD9k~wV+#?Wvm}y zjWidr&cRw~euQ-%dZihS-Y3lgcK^e$PMX&l`A_JVW)#E$X}-nC@4$L#?!|f!?v&;M zti!NDnn$pX!(GzMW1WCOX+{<0ZfRbize})Dnpd!Xfgx#rf%PlgBhApd2{Fn|HDycy zaSy>dZW}sc9zgqW7a&fJKZN%&Br=WgKz1tidQ+F-A8BzJ$e3K1t9XBhBSe|w-u zny0W%gD%5wVtoa=4A-!lpv&+g*4Gf@q(0lpDFAUpb{=;LQZYmJJMJG4`|7fS%tkOV zFKXSWeW4!jCN+q9FLZgky^>S*s%~3d?}pL0KqB*6(+`@n&b;67jLQ8(l=N?fsX#CSWBRzAC0b~pXuTT z0y_FzupS2;{U@=W1|9uvSRXfJ^}sF^a0i}&}HBR*5{zhz%15DFv)dRvFPLrwv!#V zM+(K!omMVkhHn4UvT{z*+HQ@$XcZm1;8>H^_HoCd0UN(aeM8QPG6#*qh!_t;dFX^TC_x!)iC^*hZx|Kv08ckavkeZO<=cgxmH zJ$qMj)2!8zt9}>~^kpAg{A1?jKj+_hYvOB1mtVTNDx-xlS>QAO|IZf~o_$*m|F=vO zh>kHP7K~4sC0L^%Nf(`*V$2jUVZKULb}HU9@Kq`E8LU~hstM>NG$O9GWn~A}V{L#i zY1U(H1iv(QVC@8l%TLJU^MgyT>hPw6?$tc3`4ApnSzc8=MYXm?Ph;XByvoJS#eBfp zk5tyyKB;Q2U>S|zuO2g9x!dq|Shr^EMCBgD`xHzMJq@eyR)d}fZ?$?Fc2RFP=xOji zRY1W5K}fv;K> z4q^=kmu$WdFW**`{T+%m0(3Te*VoxRj(X!kXY&NC8qnEXjrADlY_7mM+}0&=pT&F* zqGgxnV$B1c&9kxQfX?O_STjLq^A@bFptE^1)(+6w{4Ulm(AnI8wHtIczY#KZHhVXT z&gKi${2p{RpU3(cbT=sLm8Q2&ouj4Hs{);)MIlq?Xg%he zpmX%akg0Rj`y1&TJw?rL;a1tDuR~^UX?issj%yb?8*>?4viWzsE1!bQ{+Ttao)ivX4`5D(I1| z!IbkJ*}g$CW4;UGOSUcr*#BY9q4KGK9io-CDeNX^t8T=^$O@|eGzLZ z=xJSqwG#BSdVf(pt^25V0Q4E{ZLEW!&uHH8=`-3n>iq)xjCK+0chG0FV^~)}pV8vu zI3<8SqorV_fqN#PTH!- z`cXA}fHCFZvW5!0O3-VVh&9PpMb;0&&X_%|?a+r_cv+y=Fc9lbTNPP9UUy^ev$n$; z_Tx2!Uc+&$6SgX{esDjJxzySYYj_!N8R#`MU^UvR$T|{!Wpb|C>2X-YHN3w-uOW)- zM~Bv+!)7Iqn}!?DJC>pE_YY8;K;Q4%us*hhb&Rb@Gv*C&=|clvBj`S?$9l_Fb$N~* zK|F5D$|v4Qtka;MV@+6}gMN;Ei}f8i1o^^l#w-GtUM3fT%zcu>D_L;q)oHxXLHFuB)&+3erG~8^$&9Ta^)P*uLtkI8UXqSIsLJ22mOPb zURb>$RYsq^@<8Y$&Bw6jKsRaDVoitc(wu=c6VjylB-Yc=Lz>tl6ORs{(5d==}1ouJdaR_11#Uuhm!^LFd;dtj(bF zs~&3$==@q9GIf4!$9xBLer?6t20Fi%V4VS-HAk?%0G%~EvAzVIHQv>A)?B6DHPBh} zC)Rb)S>tQX9Sk~aexRNoQ)kWhAya3~1a1yrl>j6FYKEgZv2Hg{US`Dq@d{DNE04>aQL7+wxD^z;^OjQxr6cpCMH-^ wR9-M5STs1Vpd`%13@Hi@8Wt?N@vnZ9VE=V!{)j<&L+>rm3+4|Qmg_VB0Y%D)pa1{> literal 13404 zcma)?Yfx2H7>3t|18AWZrUsgV38Ipfd6{&ynDHps5%hqXIHr&kIGTlKrjn5Y;@vJ* z-XpECnZ{7NIC-J|*mM!?Vqj)=6BD~>+SvVB&e=cu^{zAX{DEh_z0W$|Uhi6a?}BdA zS6@z>fA-AmS>3~5-gjcuk~K|>KKN>HN_gb#>5aR>n*+wwf@l8!@dD%e4H(E@3q*lG zVvP9*jHk@3SYtxaNf#ZHU`!sED6deJ&Bq%DUXd~Ft)+3Ie%oqB^ocZ2_} z0D$L(oc^#aM+m7;}|0cVNB(S4(pn)=r3*W*ycZ zXd}(FSg%7{Y5G?{J86DJy;E?FG*4oE57$bw8S5-0NV5T}1=>r~ze=x@W(vP#8g!6m za>VQ?&0d&&p_4SzBj)weyajVGBuX<1YX~Gs^AE=IU+65&%UHH%7is2Vh2aKij>8%c zU8R|al@HydnT-{KWNF$XPkStkPLv-ww)Ss;)^bOp75PK!|rG5_e zJb0z5@HDJqpbg}xmEz5`Ri#;i^)Tpc_K&Z#xr%z#ptE@y)^gCp*3a#ZRy@<69bT+?$RSPlmS3-QW9=V&EXm96S>r(p-;PFq&~ zrgd1mLFdj2h4a0sxTSFyPU;{~P_&XG4}2B8kII{6^K+S7>7gC2xRto7h9 z2v}P|55fklO`t=(9IF9zh`){X5$F)F#X1angY6$(Z?M0k-VdPTz6I-N&~e{{^$R$B z`B%Epe_*1VTIF@ry%1GYtX78ap}lV_(<^#t<7mA^aBSHm)UH-{Y1u~*7lLlt60CC2 zEn9)L7<9`%hV?k;mYs^V3v|nF#(E9(xK?7-fo@s<=(=SOQSU?0EqfU26VNTY59?EK zIMK2=k^qe7%~egf5U(7f1Kb;x+n$Sk0M+ zyjsxRx*h9H(B1kX);7@Hx&^BqbhrB7Nq6h#)N2IYttYTfg6`HPtS>-!>t|Ta;LxpD z_7~ON+O`$<`atie{-Rz2rruBa&8PQMeW^DH^nU7gtf8RyQ(drzf!61ItarenL3_|58Q?OX-GtZI zx?IX~sWt|2Ea;ge7pnmDOcKPJ1P+(es1C-A2A36k4qh(k75fCNyKPmbC^-TP5G!n1 zX)ea91U&)|VpV~jOV?nn1&0ac3=5_6cCqB}9Q6X;Z=lD@OQs<3@$^(xk<4u`a5;w+ zcq>7l!+NX@z{k^*U=HTp;BpQV@d`kn!~Iw#z{k_mYcuAr;BpS<@h*Tq2kt`{5BPX` z;@(5e1K@HF2l47bpTkF3hk=i$BcU^9D!80O8eUJ(=g=Q(0Pyj2*fhuTxD4zkN?-4B z%uMm1ulK(x+Q!afI>tUp?hUNMaHJ{k`I`+Jc_PE_3j9 zn0g*d#7Y8(AP=#?%>|dS8iO|$^jJ;ADzH^u#;P1~u`Mg-{7S59&|_7GwG{MNJ&E-c zI4ou6wm0Tca2c!lcnd&})ncqAwyMimy^Q#(Ei1=rCsrNkvD%2W3-nm+!`crHi@D=G zY&(7Bft!BMs2T4J=&`zpbqO5botfX&m_^|B?#x@5`ysYyR#}i@H1>b3_9sLV%-8d={iJAopk*%2Y^nxTd{5f zopf!mCV|ec(O45f=hq;t0?_&8A6@6yW7Jy&I={-XmVnN$Dy(YI`Sk$SQqcJ|Gh*ue zT7kI|bbi%fEeD-n#aO#RXU%r3I?!3O8fzEmtnrVov*rl(j)Kmb2CQSCv!)TN33S%f zV;u*bH3uW6&YA<5--6DXW~?7TXU%t5r=h!?ng7LN5$N#J%0HMfm_208IILEnlkR6~ zw#L*+_fy2wN%tdW0yTBgwP2nDopk#nH65M;?BL$ftL`_Y-bZZ!oi+7XM{MEPz=YiJ z@E8*l96K&E!~lkZd3jUvvodo6CO#MrPstr0437xqPKYw`Bg4VW{9yRXf1^!;{cm>8 S_{>oD@F}5S&dB^M&-@1o$xu}Q diff --git a/build/StarcoinFramework/source_maps/VMConfig.mvsm b/build/StarcoinFramework/source_maps/VMConfig.mvsm index ae330f4ac463fe43868afab3c2aa9b43793ce843..08c4f2ad21893aa65fdca6469e9281e411f4a061 100644 GIT binary patch literal 28614 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 T$^)qPR8-1^r~=+R>y3W_?j8ZD literal 28614 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 aborts_if global(txn_sender).authentication_key == DUMMY_AUTH_KEY && Authenticator::spec_derived_address(Hash::sha3_256(txn_authentication_key_preimage)) != txn_sender; aborts_if global(txn_sender).authentication_key != DUMMY_AUTH_KEY && Hash::sha3_256(txn_authentication_key_preimage) != global(txn_sender).authentication_key; @@ -978,7 +978,7 @@ module Account { spec txn_epilogue_v2 { pragma verify = false; // Todo: fix me, cost too much time - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); aborts_if !exists(txn_sender); aborts_if !exists>(txn_sender); aborts_if txn_max_gas_units < gas_units_remaining; @@ -989,9 +989,9 @@ module Account { aborts_if txn_gas_price * (txn_max_gas_units - gas_units_remaining) > 0 && global>(txn_sender).token.value < txn_gas_price * (txn_max_gas_units - gas_units_remaining); aborts_if txn_gas_price * (txn_max_gas_units - gas_units_remaining) > 0 && - !exists>(CoreAddresses::SPEC_GENESIS_ADDRESS()); + !exists>(CoreAddresses::GENESIS_ADDRESS()); aborts_if txn_gas_price * (txn_max_gas_units - gas_units_remaining) > 0 && - global>(CoreAddresses::SPEC_GENESIS_ADDRESS()).fee.value + txn_gas_price * (txn_max_gas_units - gas_units_remaining) > max_u128(); + global>(CoreAddresses::GENESIS_ADDRESS()).fee.value + txn_gas_price * (txn_max_gas_units - gas_units_remaining) > max_u128(); } } diff --git a/sources/Block.move b/sources/Block.move index ac4328a8..c1e115c3 100644 --- a/sources/Block.move +++ b/sources/Block.move @@ -54,7 +54,7 @@ module Block { spec initialize { aborts_if !Timestamp::is_genesis(); - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); aborts_if exists(Signer::address_of(account)); } @@ -64,7 +64,7 @@ module Block { } spec get_current_block_number { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); } /// Get the hash of the parent block. @@ -73,7 +73,7 @@ module Block { } spec get_parent_hash { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); } /// Gets the address of the author of the current block @@ -82,7 +82,7 @@ module Block { } spec get_current_author { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); } /// Call at block prologue @@ -108,9 +108,9 @@ module Block { } spec process_block_metadata { - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); - aborts_if number != global(CoreAddresses::SPEC_GENESIS_ADDRESS()).number + 1; + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); + aborts_if number != global(CoreAddresses::GENESIS_ADDRESS()).number + 1; } spec schema AbortsIfBlockMetadataNotExist { diff --git a/sources/ChainId.move b/sources/ChainId.move index 9101ae1b..927777a8 100644 --- a/sources/ChainId.move +++ b/sources/ChainId.move @@ -32,7 +32,7 @@ module ChainId { spec initialize { aborts_if !Timestamp::is_genesis(); - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); aborts_if exists(Signer::address_of(account)); ensures exists(Signer::address_of(account)); } @@ -62,33 +62,33 @@ module ChainId { } spec is_dev { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); - ensures exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); + ensures exists(CoreAddresses::GENESIS_ADDRESS()); } spec is_test { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); - ensures exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); + ensures exists(CoreAddresses::GENESIS_ADDRESS()); } spec is_halley { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); - ensures exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); + ensures exists(CoreAddresses::GENESIS_ADDRESS()); } spec is_proxima { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); - ensures exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); + ensures exists(CoreAddresses::GENESIS_ADDRESS()); } spec is_barnard { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); - ensures exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); + ensures exists(CoreAddresses::GENESIS_ADDRESS()); } spec is_main { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); - ensures exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); + ensures exists(CoreAddresses::GENESIS_ADDRESS()); } spec get { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); - ensures exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); + ensures exists(CoreAddresses::GENESIS_ADDRESS()); } } } diff --git a/sources/ConsensusConfig.move b/sources/ConsensusConfig.move index 886a38ef..03644354 100644 --- a/sources/ConsensusConfig.move +++ b/sources/ConsensusConfig.move @@ -79,7 +79,7 @@ module ConsensusConfig { spec initialize { aborts_if !Timestamp::is_genesis(); - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); aborts_if uncle_rate_target == 0; aborts_if epoch_block_count == 0; aborts_if base_reward_per_block == 0; @@ -144,11 +144,11 @@ module ConsensusConfig { } spec get_config { - aborts_if !exists>(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists>(CoreAddresses::GENESIS_ADDRESS()); } spec fun spec_get_config(): ConsensusConfig { - global>(CoreAddresses::SPEC_GENESIS_ADDRESS()).payload + global>(CoreAddresses::GENESIS_ADDRESS()).payload } /// Get uncle_rate_target @@ -212,7 +212,7 @@ module ConsensusConfig { } spec compute_reward_per_block { - aborts_if !exists>(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists>(CoreAddresses::GENESIS_ADDRESS()); include Math::MulDivAbortsIf{x: spec_get_config().base_reward_per_block, y: new_epoch_block_time_target, z: spec_get_config().base_block_time_target}; } diff --git a/sources/ConsensusStrategy.move b/sources/ConsensusStrategy.move index a8ac064a..99cb8b61 100644 --- a/sources/ConsensusStrategy.move +++ b/sources/ConsensusStrategy.move @@ -31,7 +31,7 @@ module ConsensusStrategy { spec initialize { aborts_if !Timestamp::is_genesis(); - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); aborts_if exists>(Signer::address_of(account)); aborts_if exists>(Signer::address_of(account)); ensures exists>(Signer::address_of(account)); @@ -43,7 +43,7 @@ module ConsensusStrategy { } spec get { - aborts_if !exists>(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists>(CoreAddresses::GENESIS_ADDRESS()); } } } diff --git a/sources/CoreAddresses.move b/sources/CoreAddresses.move index b2adda71..3f234c86 100644 --- a/sources/CoreAddresses.move +++ b/sources/CoreAddresses.move @@ -16,16 +16,10 @@ module CoreAddresses { @0x1 } - /// Specification version of `Self::GENESIS_ACCOUNT`. - - spec fun SPEC_GENESIS_ADDRESS(): address { - @0x1 - } - - /// Assert signer is genesis. public fun assert_genesis_address(account: &signer) { - assert!(Signer::address_of(account) == GENESIS_ADDRESS(), Errors::requires_address(ENOT_GENESIS_ACCOUNT)) + assert!(Signer::address_of(account) == GENESIS_ADDRESS(), + Errors::requires_address(ENOT_GENESIS_ACCOUNT)) } spec assert_genesis_address { pragma opaque; @@ -35,7 +29,7 @@ module CoreAddresses { /// Specifies that a function aborts if the account does not have the Diem root address. spec schema AbortsIfNotGenesisAddress { account: signer; - aborts_if Signer::address_of(account) != SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != GENESIS_ADDRESS(); } /// The address of the root association account. This account is @@ -46,13 +40,6 @@ module CoreAddresses { @0xA550C18 } - /// Specification version of `Self::ASSOCIATION_ROOT_ADDRESS`. - - spec fun SPEC_ASSOCIATION_ROOT_ADDRESS(): address { - @0xA550C18 - } - - /// The reserved address for transactions inserted by the VM into blocks (e.g. /// block metadata transactions). Because the transaction is sent from /// the VM, an account _cannot_ exist at the `0x0` address since there @@ -60,12 +47,5 @@ module CoreAddresses { public fun VM_RESERVED_ADDRESS(): address { @0x0 } - - /// Specification version of `Self::VM_RESERVED_ADDRESS`. - - spec fun SPEC_VM_RESERVED_ADDRESS(): address { - @0x0 - } - } } diff --git a/sources/Dao.move b/sources/Dao.move index 2f0c1cdb..63600df0 100644 --- a/sources/Dao.move +++ b/sources/Dao.move @@ -180,7 +180,7 @@ module Dao { } spec schema AbortIfTimestampNotExist { use StarcoinFramework::CoreAddresses; - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); } spec module { @@ -264,7 +264,7 @@ module Dao { pragma addition_overflow_unchecked; include AbortIfDaoConfigNotExist; include AbortIfDaoInfoNotExist; - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); aborts_if action_delay > 0 && action_delay < spec_dao_config().min_action_delay; include CheckQuorumVotes; @@ -766,7 +766,7 @@ module Dao { spec proposal_state { use StarcoinFramework::CoreAddresses; include AbortIfTimestampNotExist; - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); aborts_if !exists>(proposer_address); let proposal = global>(proposer_address); diff --git a/sources/Epoch.move b/sources/Epoch.move index 81e1d751..de12b7ea 100644 --- a/sources/Epoch.move +++ b/sources/Epoch.move @@ -110,9 +110,9 @@ module Epoch { spec initialize { aborts_if !Timestamp::is_genesis(); - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); - aborts_if !exists>(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); + aborts_if !exists>(CoreAddresses::GENESIS_ADDRESS()); aborts_if exists(Signer::address_of(account)); aborts_if exists(Signer::address_of(account)); @@ -198,7 +198,7 @@ module Epoch { spec adjust_epoch { pragma verify = false; //timeout - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); aborts_if !exists(Signer::address_of(account)); aborts_if global(Signer::address_of(account)).max_uncles_per_block < uncles; aborts_if exists(Signer::address_of(account)); @@ -303,7 +303,7 @@ module Epoch { } spec start_time { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); } /// Get uncles number of current epoch @@ -313,7 +313,7 @@ module Epoch { } spec uncles { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); } /// Get total gas of current epoch @@ -323,7 +323,7 @@ module Epoch { } spec total_gas { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); } /// Get block's gas_limit of current epoch @@ -333,7 +333,7 @@ module Epoch { } spec block_gas_limit { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); } /// Get start block's number of current epoch @@ -343,7 +343,7 @@ module Epoch { } spec start_block_number { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); } /// Get end block's number of current epoch @@ -353,7 +353,7 @@ module Epoch { } spec end_block_number { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); } /// Get current epoch number @@ -363,7 +363,7 @@ module Epoch { } spec number { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); } /// Get current block time target @@ -373,7 +373,7 @@ module Epoch { } spec block_time_target { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); } } diff --git a/sources/FixedPoint32.move b/sources/FixedPoint32.move index 2534a0d2..e1a4b13c 100644 --- a/sources/FixedPoint32.move +++ b/sources/FixedPoint32.move @@ -51,9 +51,17 @@ module FixedPoint32 { /// conversion (where `FixedPoint32` is used for) is not relevant for the rest of the contract /// control flow, so we can assume some arbitrary (but fixed) behavior here. pragma opaque = true; - pragma verify = false; + include MultiplyAbortsIf; ensures result == spec_multiply_u64(val, multiplier); } + spec schema MultiplyAbortsIf { + val: num; + multiplier: FixedPoint32; + aborts_if spec_multiply_u64(val, multiplier) > MAX_U64 with Errors::LIMIT_EXCEEDED; + } + spec fun spec_multiply_u64(val: num, multiplier: FixedPoint32): num { + (val * multiplier.value) >> 32 + } /// Divide a u64 integer by a fixed-point number, truncating any /// fractional part of the quotient. This will abort if the divisor @@ -74,9 +82,18 @@ module FixedPoint32 { spec divide_u64 { /// See comment at `Self::multiply_64`. pragma opaque = true; - pragma verify = false; + include DivideAbortsIf; ensures result == spec_divide_u64(val, divisor); } + spec schema DivideAbortsIf { + val: num; + divisor: FixedPoint32; + aborts_if divisor.value == 0 with Errors::INVALID_ARGUMENT; + aborts_if spec_divide_u64(val, divisor) > MAX_U64 with Errors::LIMIT_EXCEEDED; + } + spec fun spec_divide_u64(val: num, divisor: FixedPoint32): num { + (val << 32) / divisor.value + } /// Create a fixed-point value from a rational number specified by its /// numerator and denominator. This function is for convenience; it is also @@ -101,14 +118,32 @@ module FixedPoint32 { spec create_from_rational { /// See comment at `Self::multiply_64`. pragma opaque = true; - pragma verify = false; + include CreateFromRationalAbortsIf; ensures result == spec_create_from_rational(numerator, denominator); } + spec schema CreateFromRationalAbortsIf { + numerator: u64; + denominator: u64; + let scaled_numerator = numerator << 64; + let scaled_denominator = denominator << 32; + let quotient = scaled_numerator / scaled_denominator; + aborts_if scaled_denominator == 0 with Errors::INVALID_ARGUMENT; + aborts_if quotient == 0 && scaled_numerator != 0 with Errors::INVALID_ARGUMENT; + aborts_if quotient > MAX_U64 with Errors::LIMIT_EXCEEDED; + } + spec fun spec_create_from_rational(numerator: num, denominator: num): FixedPoint32 { + FixedPoint32{value: (numerator << 64) / (denominator << 32)} + } /// create a fixedpoint 32 from u64. public fun create_from_raw_value(value: u64): FixedPoint32 { FixedPoint32 { value } } + spec create_from_raw_value { + pragma opaque; + aborts_if false; + ensures result.value == value; + } /// Accessor for the raw u64 value. Other less common operations, such as /// adding or subtracting FixedPoint32 values, can be done using the raw @@ -116,20 +151,6 @@ module FixedPoint32 { public fun get_raw_value(num: FixedPoint32): u64 { num.value } - - // **************** SPECIFICATIONS **************** - - - /// Uninterpreted function for `Self::multiply_u64`. - spec fun spec_multiply_u64(val: u64, multiplier: FixedPoint32): u64; - - /// Uninterpreted function for `Self::divide_u64`. - spec fun spec_divide_u64(val: u64, divisor: FixedPoint32): u64; - - /// Uninterpreted function for `Self::create_from_rational`. - spec fun spec_create_from_rational(numerator: u64, denominator: u64): FixedPoint32; - - } } diff --git a/sources/GenesisSignerCapability.move b/sources/GenesisSignerCapability.move index f9ade7a2..07daa754 100644 --- a/sources/GenesisSignerCapability.move +++ b/sources/GenesisSignerCapability.move @@ -15,9 +15,12 @@ module StarcoinFramework::GenesisSignerCapability { cap: Account::SignerCapability, } - public(friend) fun initialize(signer:&signer, cap: Account::SignerCapability) { + public(friend) fun initialize(signer: &signer, cap: Account::SignerCapability) { CoreAddresses::assert_genesis_address(signer); - assert!(Account::signer_address(&cap) == CoreAddresses::GENESIS_ADDRESS(), Errors::invalid_argument(ENOT_GENESIS_ACCOUNT)); + assert!( + Account::signer_address(&cap) == CoreAddresses::GENESIS_ADDRESS(), + Errors::invalid_argument(ENOT_GENESIS_ACCOUNT) + ); move_to(signer, GenesisSignerCapability{cap}); } diff --git a/sources/MintDaoProposal.move b/sources/MintDaoProposal.move index 0e3caa9d..18ff68cc 100644 --- a/sources/MintDaoProposal.move +++ b/sources/MintDaoProposal.move @@ -64,7 +64,7 @@ module MintDaoProposal { // copy from Dao::propose spec. include Dao::AbortIfDaoConfigNotExist; include Dao::AbortIfDaoInfoNotExist; - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); aborts_if exec_delay > 0 && exec_delay < Dao::spec_dao_config().min_action_delay; include Dao::CheckQuorumVotes; let sender = Signer::address_of(signer); diff --git a/sources/ModifyDaoConfigProposal.move b/sources/ModifyDaoConfigProposal.move index 97b2aeb1..4778a311 100644 --- a/sources/ModifyDaoConfigProposal.move +++ b/sources/ModifyDaoConfigProposal.move @@ -88,7 +88,7 @@ module ModifyDaoConfigProposal { // copy from Dao::propose spec. include Dao::AbortIfDaoConfigNotExist; include Dao::AbortIfDaoInfoNotExist; - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); aborts_if exec_delay > 0 && exec_delay < Dao::spec_dao_config().min_action_delay; include Dao::CheckQuorumVotes; let sender = Signer::address_of(signer); diff --git a/sources/NFT.move b/sources/NFT.move index 051f4d58..d6cde2c1 100644 --- a/sources/NFT.move +++ b/sources/NFT.move @@ -1,5 +1,5 @@ address StarcoinFramework { -///Non-fungible token standard and implements. +/// Non-fungible token standard and implementations. module NFT { use StarcoinFramework::Signer; use StarcoinFramework::Errors; @@ -48,11 +48,17 @@ module NFT { burn_events: Event::EventHandle>, } - struct NFTTypeInfoCompat has key{ + struct NFTTypeInfoCompat has key { info: NFTTypeInfoExt, } - fun new_nft_type_info(sender: &signer, info: NFTTypeInfoExt, meta: Metadata): NFTTypeInfo { + /// Deprecated. Use `new_nft_type_info_v2` instead. + fun new_nft_type_info( + sender: &signer, + info: NFTTypeInfoExt, + meta: Metadata + ): NFTTypeInfo { NFTTypeInfo { counter: 0, info, @@ -72,21 +78,23 @@ module NFT { } /// Note: this function is deprecated - public fun nft_type_info_ex_info(): NFTTypeInfoExt acquires NFTTypeInfo, NFTTypeInfoCompat { - if(exists>(CoreAddresses::GENESIS_ADDRESS())) { + public fun nft_type_info_ex_info( + ): NFTTypeInfoExt acquires NFTTypeInfo, NFTTypeInfoCompat { + if (exists>(CoreAddresses::GENESIS_ADDRESS())) { let info = borrow_global_mut>(CoreAddresses::GENESIS_ADDRESS()); *&info.info - }else { + } else { let info = borrow_global_mut>(CoreAddresses::GENESIS_ADDRESS()); *&info.info } } /// Note: this function is deprecated, please use nft_type_info_counter_v2 - public fun nft_type_info_counter(): u64 acquires NFTTypeInfo, NFTTypeInfoV2 { - if(exists>(CoreAddresses::GENESIS_ADDRESS())){ + public fun nft_type_info_counter( + ): u64 acquires NFTTypeInfo, NFTTypeInfoV2 { + if (exists>(CoreAddresses::GENESIS_ADDRESS())) { Self::nft_type_info_counter_v2() - }else { + } else { let info = borrow_global_mut>(CoreAddresses::GENESIS_ADDRESS()); *&info.counter } @@ -102,8 +110,11 @@ module NFT { *&info.meta } - public fun upgrade_nft_type_info_from_v1_to_v2(sender: &signer, _cap: &mut MintCapability) acquires NFTTypeInfo{ - if(exists>(CoreAddresses::GENESIS_ADDRESS())) { + public fun upgrade_nft_type_info_from_v1_to_v2( + sender: &signer, + _cap: &mut MintCapability + ) acquires NFTTypeInfo { + if (exists>(CoreAddresses::GENESIS_ADDRESS())) { let nft_type_info = move_from>(CoreAddresses::GENESIS_ADDRESS()); let NFTTypeInfo { counter, meta, info, mint_events } = nft_type_info; @@ -121,8 +132,10 @@ module NFT { } } - public fun remove_compat_info(_cap: &mut MintCapability): NFTTypeInfoExt acquires NFTTypeInfoCompat{ - let compat_info = move_from>(CoreAddresses::GENESIS_ADDRESS()); + public fun remove_compat_info( + _cap: &mut MintCapability + ): NFTTypeInfoExt acquires NFTTypeInfoCompat { + let compat_info = move_from>(CoreAddresses::GENESIS_ADDRESS()); let NFTTypeInfoCompat{info} = compat_info; info } @@ -226,10 +239,17 @@ module NFT { } public fun get_info(nft: &NFT): NFTInfo { - return NFTInfo { id: nft.id, creator: nft.creator, base_meta: *&nft.base_meta, type_meta: *&nft.type_meta } + NFTInfo { + id: nft.id, + creator: nft.creator, + base_meta: *&nft.base_meta, + type_meta: *&nft.type_meta, + } } - public fun unpack_info(nft_info: NFTInfo): (u64, address, Metadata, NFTMeta) { + public fun unpack_info( + nft_info: NFTInfo + ): (u64, address, Metadata, NFTMeta) { let NFTInfo { id, creator, base_meta, type_meta } = nft_info; (id, creator, base_meta, type_meta) } @@ -254,8 +274,9 @@ module NFT { public fun initialize(_signer: &signer) { } - /// Used in v7->v8 upgrade. struct `GenesisSignerCapability` is deprecated, in favor of module `StarcoinFramework::GenesisSignerCapability`. - public fun extract_signer_cap(signer: &signer): Account::SignerCapability acquires GenesisSignerCapability{ + /// Used in v7->v8 upgrade. struct `GenesisSignerCapability` is deprecated, + /// in favor of module `StarcoinFramework::GenesisSignerCapability`. + public fun extract_signer_cap(signer: &signer): Account::SignerCapability acquires GenesisSignerCapability { CoreAddresses::assert_genesis_address(signer); let cap = move_from(Signer::address_of(signer)); let GenesisSignerCapability {cap} = cap; @@ -264,7 +285,11 @@ module NFT { /// Register a NFT type to genesis /// Note: this function is deprecated, please use `register_v2` - public fun register(sender: &signer, info: NFTTypeInfoExt, meta: Metadata) acquires NFTTypeInfo { + public fun register( + sender: &signer, + info: NFTTypeInfoExt, + meta: Metadata + ) acquires NFTTypeInfo { let genesis_account = GenesisSignerCapability::get_genesis_signer(); let type_info = new_nft_type_info(sender, info, meta); move_to>(&genesis_account, type_info); @@ -279,7 +304,7 @@ module NFT { /// Register a NFT type to genesis public fun register_v2(sender: &signer, meta: Metadata) { - assert!(!is_register(), Errors::invalid_argument(ERR_NFT_TYPE_ALREADY_REGISTERED)); + assert!(!is_registered(), Errors::invalid_argument(ERR_NFT_TYPE_ALREADY_REGISTERED)); let genesis_account = GenesisSignerCapability::get_genesis_signer(); let type_info = new_nft_type_info_v2(sender, meta); @@ -290,34 +315,48 @@ module NFT { } /// Check the NFTMeta is register - public fun is_register(): bool { + public fun is_registered(): bool { exists>(CoreAddresses::GENESIS_ADDRESS()) } + /// deprecated. Use "is_registered" instead. + public fun is_register(): bool { + is_registered() + } + /// Add MintCapability to `sender` public fun add_mint_capability(sender: &signer, cap: MintCapability) { move_to(sender, cap); } /// Remove the MintCapability from `sender` - public fun remove_mint_capability(sender: &signer): MintCapability acquires MintCapability { + public fun remove_mint_capability( + sender: &signer + ): MintCapability acquires MintCapability { let addr = Signer::address_of(sender); assert!(exists>(addr), Errors::requires_capability(ERR_NO_MINT_CAPABILITY)); move_from>(addr) } - ///Destroy the MintCapability + /// Destroy the MintCapability public fun destroy_mint_capability(cap: MintCapability) { let MintCapability {} = cap; } - /// Mint nft with MintCapability, `creator` will been the NFT's creator. + /// Mint nft with MintCapability, `creator` will been the NFT's creator. /// Note: this function is deprecated, please use `mint_with_cap_v2` - public fun mint_with_cap(creator: address, cap: &mut MintCapability, base_meta: Metadata, type_meta: NFTMeta, body: NFTBody): NFT acquires NFTTypeInfo, NFTTypeInfoV2 { - if (exists>(CoreAddresses::GENESIS_ADDRESS())){ + public fun mint_with_cap( + creator: address, + cap: &mut MintCapability, + base_meta: Metadata, + type_meta: NFTMeta, + body: NFTBody + ): NFT acquires NFTTypeInfo, NFTTypeInfoV2 { + if (exists>(CoreAddresses::GENESIS_ADDRESS())) { mint_with_cap_v2(creator, cap, base_meta, type_meta, body) - }else { - let nft_type_info = borrow_global_mut>(CoreAddresses::GENESIS_ADDRESS()); + } else { + let nft_type_info = + borrow_global_mut>(CoreAddresses::GENESIS_ADDRESS()); nft_type_info.counter = nft_type_info.counter + 1; let id = nft_type_info.counter; let nft = NFT { @@ -333,17 +372,23 @@ module NFT { base_meta, type_meta, }); - return nft + nft } } - /// Mint nft with MintCapability, `creator` will been the NFT's creator. - public fun mint_with_cap_v2(creator: address, _cap: &mut MintCapability, base_meta: Metadata, type_meta: NFTMeta, body: NFTBody): NFT acquires NFTTypeInfoV2 { + /// Mint nft with MintCapability, `creator` will been the NFT's creator. + public fun mint_with_cap_v2( + creator: address, + _cap: &mut MintCapability, + base_meta: Metadata, + type_meta: NFTMeta, + body: NFTBody + ): NFT acquires NFTTypeInfoV2 { let nft_type_info = borrow_global_mut>(CoreAddresses::GENESIS_ADDRESS()); nft_type_info.counter = nft_type_info.counter + 1; let id = nft_type_info.counter; let nft = NFT { - id: id, + id, creator, base_meta: copy base_meta, type_meta: copy type_meta, @@ -355,12 +400,17 @@ module NFT { base_meta, type_meta, }); - return nft + nft } /// Mint nft, the `sender` must have MintCapability /// Note: this function is deprecated, please use `mint_v2` - public fun mint(sender: &signer, base_meta: Metadata, type_meta: NFTMeta, body: NFTBody): NFT acquires NFTTypeInfo, NFTTypeInfoV2, MintCapability { + public fun mint( + sender: &signer, + base_meta: Metadata, + type_meta: NFTMeta, + body: NFTBody + ): NFT acquires NFTTypeInfo, NFTTypeInfoV2, MintCapability { let addr = Signer::address_of(sender); assert!(exists>(addr), Errors::requires_capability(ERR_NO_MINT_CAPABILITY)); let cap = borrow_global_mut>(addr); @@ -368,7 +418,12 @@ module NFT { } /// Mint nft, the `sender` must have MintCapability - public fun mint_v2(sender: &signer, base_meta: Metadata, type_meta: NFTMeta, body: NFTBody): NFT acquires NFTTypeInfoV2, MintCapability { + public fun mint_v2( + sender: &signer, + base_meta: Metadata, + type_meta: NFTMeta, + body: NFTBody + ): NFT acquires NFTTypeInfoV2, MintCapability { let addr = Signer::address_of(sender); assert!(exists>(addr), Errors::requires_capability(ERR_NO_MINT_CAPABILITY)); let cap = borrow_global_mut>(addr); @@ -381,21 +436,26 @@ module NFT { } /// Remove the BurnCapability from `sender` - public fun remove_burn_capability(sender: &signer): BurnCapability acquires BurnCapability { + public fun remove_burn_capability( + sender: &signer + ): BurnCapability acquires BurnCapability { let addr = Signer::address_of(sender); assert!(exists>(addr), Errors::requires_capability(ERR_NO_BURN_CAPABILITY)); move_from>(addr) } - ///Destroy the BurnCapability + /// Destroy the BurnCapability public fun destroy_burn_capability(cap: BurnCapability) { let BurnCapability {} = cap; } /// Burn nft with BurnCapability - public fun burn_with_cap(_cap: &mut BurnCapability, nft: NFT): NFTBody acquires NFTTypeInfoV2 { + public fun burn_with_cap( + _cap: &mut BurnCapability, + nft: NFT + ): NFTBody acquires NFTTypeInfoV2 { let NFT { creator: _, id: id, base_meta: _, type_meta: _, body } = nft; - //only NFTTypeInfoV2 has burn_events EventHandle + // only NFTTypeInfoV2 has burn_events EventHandle if (exists>(CoreAddresses::GENESIS_ADDRESS())) { let nft_type_info = borrow_global_mut>(CoreAddresses::GENESIS_ADDRESS()); Event::emit_event(&mut nft_type_info.burn_events, BurnEvent { @@ -406,7 +466,10 @@ module NFT { } /// Burn nft, the `sender` must have BurnCapability - public fun burn(sender: &signer, nft: NFT): NFTBody acquires NFTTypeInfoV2, BurnCapability { + public fun burn( + sender: &signer, + nft: NFT + ): NFTBody acquires NFTTypeInfoV2, BurnCapability { let addr = Signer::address_of(sender); assert!(exists>(addr), Errors::requires_capability(ERR_NO_BURN_CAPABILITY)); let cap = borrow_global_mut>(addr); @@ -419,25 +482,33 @@ module NFT { } /// Remove the BurnCapability from `sender` - public fun remove_update_capability(sender: &signer): UpdateCapability acquires UpdateCapability { + public fun remove_update_capability( + sender: &signer + ): UpdateCapability acquires UpdateCapability { let addr = Signer::address_of(sender); assert!(exists>(addr), Errors::requires_capability(ERR_NO_UPDATE_CAPABILITY)); move_from>(addr) } - ///Destroy the UpdateCapability + /// Destroy the UpdateCapability public fun destroy_update_capability(cap: UpdateCapability) { let UpdateCapability {} = cap; } /// Update the NFTTypeInfoV2 metadata with UpdateCapability - public fun update_nft_type_info_meta_with_cap(_cap: &mut UpdateCapability, new_meta: Metadata) acquires NFTTypeInfoV2{ + public fun update_nft_type_info_meta_with_cap( + _cap: &mut UpdateCapability, + new_meta: Metadata + ) acquires NFTTypeInfoV2{ let info = borrow_global_mut>(CoreAddresses::GENESIS_ADDRESS()); info.meta = new_meta; } /// Update the NFTTypeInfoV2 metadata, the `sender` must have UpdateCapability - public fun update_nft_type_info_meta(sender: &signer, new_meta: Metadata) acquires UpdateCapability, NFTTypeInfoV2 { + public fun update_nft_type_info_meta( + sender: &signer, + new_meta: Metadata + ) acquires UpdateCapability, NFTTypeInfoV2 { let addr = Signer::address_of(sender); assert!(exists>(addr), Errors::requires_capability(ERR_NO_UPDATE_CAPABILITY)); let cap = borrow_global_mut>(addr); @@ -445,13 +516,22 @@ module NFT { } /// Update the nft's base_meta and type_meta with UpdateCapability - public fun update_meta_with_cap(_cap: &mut UpdateCapability, nft: &mut NFT, base_meta: Metadata, type_meta: NFTMeta) { + public fun update_meta_with_cap( + _cap: &mut UpdateCapability, + nft: &mut NFT, + base_meta: Metadata, type_meta: NFTMeta + ) { nft.base_meta = base_meta; nft.type_meta = type_meta; } /// Update the nft's base_meta and type_meta, the `sender` must have UpdateCapability - public fun update_meta(sender: &signer, nft: &mut NFT, base_meta: Metadata, type_meta: NFTMeta) acquires UpdateCapability { + public fun update_meta( + sender: &signer, + nft: &mut NFT, + base_meta: Metadata, + type_meta: NFTMeta + ) acquires UpdateCapability { let addr = Signer::address_of(sender); assert!(exists>(addr), Errors::requires_capability(ERR_NO_UPDATE_CAPABILITY)); let cap = borrow_global_mut>(addr); @@ -464,7 +544,10 @@ module NFT { } /// Borrow NFTBody mut ref for update body with UpdateCapability - public fun borrow_body_mut_with_cap(_cap: &mut UpdateCapability, nft: &mut NFT): &mut NFTBody { + public fun borrow_body_mut_with_cap( + _cap: &mut UpdateCapability, + nft: &mut NFT + ): &mut NFTBody { &mut nft.body } } @@ -516,13 +599,21 @@ module IdentifierNFT { } /// Grant nft as IdentifierNFT to `sender` with MintCapability, sender will auto accept the NFT. - public fun grant(cap: &mut MintCapability, sender: &signer, nft: NFT) acquires IdentifierNFT { + public fun grant( + cap: &mut MintCapability, + sender: &signer, + nft: NFT + ) acquires IdentifierNFT { Self::accept(sender); Self::grant_to(cap, Signer::address_of(sender), nft); } - /// Grant nft as IdentifierNFT to `receiver` with MintCapability, the receiver should accept the NFT first. - public fun grant_to(_cap: &mut MintCapability, receiver: address, nft: NFT) acquires IdentifierNFT { + /// Grant nft as IdentifierNFT to `receiver` with MintCapability, the receiver should accept the NFT first. + public fun grant_to( + _cap: &mut MintCapability, + receiver: address, + nft: NFT + ) acquires IdentifierNFT { assert!(exists>(receiver), Errors::not_published(ERR_NFT_NOT_ACCEPT)); let id_nft = borrow_global_mut>(receiver); assert!(Option::is_none(&id_nft.nft), Errors::already_published(ERR_NFT_EXISTS)); @@ -530,7 +621,10 @@ module IdentifierNFT { } /// Revoke the NFT from owner. - public fun revoke(_cap: &mut BurnCapability, owner: address): NFT acquires IdentifierNFT { + public fun revoke( + _cap: &mut BurnCapability, + owner: address + ): NFT acquires IdentifierNFT { assert!(exists>(owner), Errors::not_published(ERR_NFT_NOT_EXISTS)); let id_nft = move_from>(owner); assert!(Option::is_some(&id_nft.nft), Errors::not_published(ERR_NFT_NOT_EXISTS)); @@ -539,15 +633,18 @@ module IdentifierNFT { } /// Check `owner` is owns the IdentifierNFT + public fun owns(owner: address): bool acquires IdentifierNFT { + exists>(owner) && + Option::is_some(&borrow_global>(owner).nft) + } + /// deprecated. Use `owns()` instead. public fun is_owns(owner: address): bool acquires IdentifierNFT { - if (!exists>(owner)) { - return false - }; - let id_nft = borrow_global>(owner); - Option::is_some(&id_nft.nft) + owns(owner) } - public fun get_nft_info(owner: address): Option> acquires IdentifierNFT { + public fun get_nft_info( + owner: address + ): Option> acquires IdentifierNFT { if (!exists>(owner)) { return Option::none>() }; @@ -628,7 +725,11 @@ module NFTGallery { } /// Transfer NFT from `sender` to `receiver` - public fun transfer(sender: &signer, id: u64, receiver: address) acquires NFTGallery { + public fun transfer( + sender: &signer, + id: u64, + receiver: address + ) acquires NFTGallery { let nft = withdraw(sender, id); assert!(Option::is_some(&nft), Errors::not_published(ERR_NFT_NOT_EXISTS)); let nft = Option::destroy_some(nft); @@ -636,7 +737,10 @@ module NFTGallery { } /// Get the NFT info by the NFT id. - public fun get_nft_info_by_id(owner: address, id: u64): Option> acquires NFTGallery { + public fun get_nft_info_by_id( + owner: address, + id: u64 + ): Option> acquires NFTGallery { let gallery = borrow_global_mut>(owner); let idx = find_by_id(&gallery.items, id); @@ -651,14 +755,19 @@ module NFTGallery { } /// Get the NFT info by the NFT idx in NFTGallery - public fun get_nft_info_by_idx(owner: address, idx: u64): NFT::NFTInfo acquires NFTGallery { + public fun get_nft_info_by_idx( + owner: address, + idx: u64 + ): NFT::NFTInfo acquires NFTGallery { let gallery = borrow_global_mut>(owner); let nft = Vector::borrow>(&gallery.items, idx); NFT::get_info(nft) } /// Get the all NFT info - public fun get_nft_infos(owner: address): vector> acquires NFTGallery { + public fun get_nft_infos( + owner: address + ): vector> acquires NFTGallery { let gallery = borrow_global_mut>(owner); let infos = Vector::empty(); let len = Vector::length(&gallery.items); @@ -672,42 +781,56 @@ module NFTGallery { } /// Deposit nft to `sender` NFTGallery - public fun deposit(sender: &signer, nft: NFT) acquires NFTGallery { + public fun deposit( + sender: &signer, + nft: NFT + ) acquires NFTGallery { Self::accept(sender); let sender_addr = Signer::address_of(sender); deposit_to(sender_addr, nft) } /// Deposit nft to `receiver` NFTGallery - public fun deposit_to(receiver: address, nft: NFT) acquires NFTGallery { + public fun deposit_to( + receiver: address, + nft: NFT + ) acquires NFTGallery { let gallery = borrow_global_mut>(receiver); Event::emit_event(&mut gallery.deposit_events, DepositEvent { id: NFT::get_id(&nft), owner: receiver }); Vector::push_back(&mut gallery.items, nft); } /// Withdraw one nft of NFTMeta from `sender`, caller should ensure at least one NFT in the Gallery. - public fun withdraw_one(sender: &signer): NFT acquires NFTGallery { + public fun withdraw_one( + sender: &signer + ): NFT acquires NFTGallery { let nft = do_withdraw(sender, Option::none()); Option::destroy_some(nft) } /// Withdraw nft of NFTMeta and id from `sender` - public fun withdraw(sender: &signer, id: u64): Option> acquires NFTGallery { + public fun withdraw( + sender: &signer, + id: u64 + ): Option> acquires NFTGallery { do_withdraw(sender, Option::some(id)) } /// Withdraw nft of NFTMeta and id from `sender` - fun do_withdraw(sender: &signer, id: Option): Option> acquires NFTGallery { + fun do_withdraw( + sender: &signer, + id: Option + ): Option> acquires NFTGallery { let sender_addr = Signer::address_of(sender); let gallery = borrow_global_mut>(sender_addr); let len = Vector::length(&gallery.items); let nft = if (len == 0) { Option::none() - }else { + } else { let idx = if (Option::is_some(&id)) { let id = Option::extract(&mut id); find_by_id(&gallery.items, id) - }else { + } else { //default withdraw the last nft. Option::some(len - 1) }; @@ -715,16 +838,22 @@ module NFTGallery { if (Option::is_some(&idx)) { let i = Option::extract(&mut idx); let nft = Vector::remove>(&mut gallery.items, i); - Event::emit_event(&mut gallery.withdraw_events, WithdrawEvent { id: NFT::get_id(&nft), owner: sender_addr }); + Event::emit_event( + &mut gallery.withdraw_events, + WithdrawEvent { id: NFT::get_id(&nft), owner: sender_addr } + ); Option::some(nft) - }else { + } else { Option::none() } }; nft } - fun find_by_id(c: &vector>, id: u64): Option { + fun find_by_id( + c: &vector>, + id: u64 + ): Option { let len = Vector::length(c); if (len == 0) { return Option::none() @@ -762,7 +891,10 @@ module NFTGalleryScripts { } /// Transfer NFT with `id` from `sender` to `receiver` - public(script) fun transfer(sender: signer, id: u64, receiver: address) { + public(script) fun transfer( + sender: signer, + id: u64, receiver: address + ) { NFTGallery::transfer(&sender, id, receiver); } } diff --git a/sources/OnChainConfigDao.move b/sources/OnChainConfigDao.move index a0489253..dbfbcb2c 100644 --- a/sources/OnChainConfigDao.move +++ b/sources/OnChainConfigDao.move @@ -64,7 +64,7 @@ module OnChainConfigDao { // copy from Dao::propose spec. include Dao::AbortIfDaoConfigNotExist; include Dao::AbortIfDaoInfoNotExist; - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); aborts_if exec_delay > 0 && exec_delay < Dao::spec_dao_config().min_action_delay; include Dao::CheckQuorumVotes; let sender = Signer::address_of(signer); diff --git a/sources/PackageTxnManager.move b/sources/PackageTxnManager.move index 1614c88d..22cb8d67 100644 --- a/sources/PackageTxnManager.move +++ b/sources/PackageTxnManager.move @@ -427,7 +427,7 @@ address StarcoinFramework { } spec package_txn_prologue { - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); include CheckPackageTxnAbortsIf{}; } @@ -457,7 +457,7 @@ address StarcoinFramework { } spec package_txn_epilogue { - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); aborts_if spec_get_module_upgrade_strategy(package_address) == 1 && success && !exists(package_address); aborts_if spec_get_module_upgrade_strategy(package_address) == 1 diff --git a/sources/Timestamp.move b/sources/Timestamp.move index b52d1337..0dd5da96 100644 --- a/sources/Timestamp.move +++ b/sources/Timestamp.move @@ -35,7 +35,7 @@ module Timestamp { move_to(account, milli_timer); } spec initialize { - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); aborts_if exists(Signer::address_of(account)); ensures exists(Signer::address_of(account)); } @@ -49,10 +49,10 @@ module Timestamp { global_milli_timer.milliseconds = timestamp; } spec update_global_time { - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); - aborts_if timestamp <= global(CoreAddresses::SPEC_GENESIS_ADDRESS()).milliseconds; - ensures global(CoreAddresses::SPEC_GENESIS_ADDRESS()).milliseconds == timestamp; + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); + aborts_if timestamp <= global(CoreAddresses::GENESIS_ADDRESS()).milliseconds; + ensures global(CoreAddresses::GENESIS_ADDRESS()).milliseconds == timestamp; } // Get the timestamp representing `now` in seconds. @@ -60,11 +60,11 @@ module Timestamp { now_milliseconds() / MILLI_CONVERSION_FACTOR } spec now_seconds { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); ensures result == now_milliseconds() / MILLI_CONVERSION_FACTOR; } spec fun spec_now_seconds(): u64 { - global(CoreAddresses::SPEC_GENESIS_ADDRESS()).milliseconds / MILLI_CONVERSION_FACTOR + global(CoreAddresses::GENESIS_ADDRESS()).milliseconds / MILLI_CONVERSION_FACTOR } // Get the timestamp representing `now` in milliseconds. @@ -73,12 +73,12 @@ module Timestamp { } spec now_milliseconds { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); - ensures result == global(CoreAddresses::SPEC_GENESIS_ADDRESS()).milliseconds; + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); + ensures result == global(CoreAddresses::GENESIS_ADDRESS()).milliseconds; } spec fun spec_now_millseconds(): u64 { - global(CoreAddresses::SPEC_GENESIS_ADDRESS()).milliseconds + global(CoreAddresses::GENESIS_ADDRESS()).milliseconds } /// Marks that time has started and genesis has finished. This can only be called from genesis. @@ -94,7 +94,7 @@ module Timestamp { } spec set_time_has_started { - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); aborts_if !exists(Signer::address_of(account)); aborts_if exists(Signer::address_of(account)); ensures exists(Signer::address_of(account)); @@ -107,7 +107,7 @@ module Timestamp { spec is_genesis { aborts_if false; - ensures result == !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + ensures result == !exists(CoreAddresses::GENESIS_ADDRESS()); } /// Helper function to assert genesis state. @@ -125,7 +125,7 @@ module Timestamp { } spec schema AbortsIfTimestampNotExists { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); } } } diff --git a/sources/TransactionFee.move b/sources/TransactionFee.move index 43b56eea..47a2fb5c 100644 --- a/sources/TransactionFee.move +++ b/sources/TransactionFee.move @@ -33,7 +33,7 @@ module TransactionFee { spec initialize { aborts_if !Timestamp::is_genesis(); - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); aborts_if exists>(Signer::address_of(account)); } @@ -62,8 +62,8 @@ module TransactionFee { } spec pay_fee { - aborts_if !exists>(CoreAddresses::SPEC_GENESIS_ADDRESS()); - aborts_if global>(CoreAddresses::SPEC_GENESIS_ADDRESS()).fee.value + token.value > max_u128(); + aborts_if !exists>(CoreAddresses::GENESIS_ADDRESS()); + aborts_if global>(CoreAddresses::GENESIS_ADDRESS()).fee.value + token.value > max_u128(); } /// Distribute the transaction fees collected in the `TokenType` token. @@ -87,8 +87,8 @@ module TransactionFee { spec distribute_transaction_fees { pragma verify = false; -// aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); -// aborts_if !exists>(CoreAddresses::SPEC_GENESIS_ADDRESS()); +// aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); +// aborts_if !exists>(CoreAddresses::GENESIS_ADDRESS()); } } diff --git a/sources/TransactionManager.move b/sources/TransactionManager.move index faafac61..70aa0b2b 100644 --- a/sources/TransactionManager.move +++ b/sources/TransactionManager.move @@ -181,7 +181,7 @@ module TransactionManager { spec epilogue { pragma verify = false;//fixme : timeout include CoreAddresses::AbortsIfNotGenesisAddress; - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); aborts_if !exists(txn_sender); aborts_if !exists>(txn_sender); aborts_if txn_max_gas_units < gas_units_remaining; diff --git a/sources/TransactionPublishOption.move b/sources/TransactionPublishOption.move index bdcaf2ac..285f55ec 100644 --- a/sources/TransactionPublishOption.move +++ b/sources/TransactionPublishOption.move @@ -64,7 +64,7 @@ module TransactionPublishOption { spec initialize { aborts_if !Timestamp::is_genesis(); - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); include Config::PublishNewConfigAbortsIf; include Config::PublishNewConfigEnsures; } @@ -107,7 +107,7 @@ module TransactionPublishOption { spec schema AbortsIfTxnPublishOptionNotExist { include Config::AbortsIfConfigNotExist{ - addr: CoreAddresses::SPEC_GENESIS_ADDRESS() + addr: CoreAddresses::GENESIS_ADDRESS() }; } diff --git a/sources/TransactionTimeout.move b/sources/TransactionTimeout.move index a4ff2b63..0f8e55e5 100644 --- a/sources/TransactionTimeout.move +++ b/sources/TransactionTimeout.move @@ -35,19 +35,19 @@ module TransactionTimeout { current_block_time < txn_timestamp && txn_timestamp < max_txn_time } spec is_valid_transaction_timestamp { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); include Timestamp::AbortsIfTimestampNotExists; aborts_if Block::get_current_block_number() != 0 && Timestamp::now_seconds() + TransactionTimeoutConfig::duration_seconds() > max_u64(); - aborts_if Block::get_current_block_number() != 0 && !exists>(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if Block::get_current_block_number() != 0 && !exists>(CoreAddresses::GENESIS_ADDRESS()); } spec schema AbortsIfTimestampNotValid { - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); include Timestamp::AbortsIfTimestampNotExists; aborts_if Block::get_current_block_number() != 0 && Timestamp::now_seconds() + TransactionTimeoutConfig::duration_seconds() > max_u64(); - aborts_if Block::get_current_block_number() != 0 && !exists>(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if Block::get_current_block_number() != 0 && !exists>(CoreAddresses::GENESIS_ADDRESS()); } } } diff --git a/sources/TransactionTimeoutConfig.move b/sources/TransactionTimeoutConfig.move index b5f44570..57ddf4b0 100644 --- a/sources/TransactionTimeoutConfig.move +++ b/sources/TransactionTimeoutConfig.move @@ -30,7 +30,7 @@ module TransactionTimeoutConfig { spec initialize { aborts_if !Timestamp::is_genesis(); - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); include Config::PublishNewConfigAbortsIf; include Config::PublishNewConfigEnsures; } diff --git a/sources/Treasury.move b/sources/Treasury.move index 05cc02a7..d7901c3e 100644 --- a/sources/Treasury.move +++ b/sources/Treasury.move @@ -162,7 +162,7 @@ module Treasury { spec issue_linear_withdraw_capability { aborts_if period == 0; aborts_if amount == 0; - aborts_if !exists(StarcoinFramework::CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(StarcoinFramework::CoreAddresses::GENESIS_ADDRESS()); } /// Withdraw tokens with given `LinearWithdrawCapability`. @@ -218,7 +218,7 @@ module Treasury { spec withdraw_amount_of_linear_cap { pragma verify = false; //timeout, fix later - aborts_if !exists(StarcoinFramework::CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(StarcoinFramework::CoreAddresses::GENESIS_ADDRESS()); aborts_if Timestamp::spec_now_seconds() < cap.start_time; aborts_if Timestamp::spec_now_seconds() - cap.start_time >= cap.period && cap.total < cap.withdraw; aborts_if [abstract] Timestamp::spec_now_seconds() - cap.start_time < cap.period && Math::spec_mul_div() < cap.withdraw; diff --git a/sources/TreasuryWithdrawDaoProposal.move b/sources/TreasuryWithdrawDaoProposal.move index a485ec57..5b3668c1 100644 --- a/sources/TreasuryWithdrawDaoProposal.move +++ b/sources/TreasuryWithdrawDaoProposal.move @@ -74,7 +74,7 @@ module TreasuryWithdrawDaoProposal { // copy from Dao::propose spec. include Dao::AbortIfDaoConfigNotExist; include Dao::AbortIfDaoInfoNotExist; - aborts_if !exists(CoreAddresses::SPEC_GENESIS_ADDRESS()); + aborts_if !exists(CoreAddresses::GENESIS_ADDRESS()); aborts_if exec_delay > 0 && exec_delay < Dao::spec_dao_config().min_action_delay; include Dao::CheckQuorumVotes; let sender = Signer::address_of(signer); diff --git a/sources/U256.move b/sources/U256.move index 2370a833..4917f2b8 100644 --- a/sources/U256.move +++ b/sources/U256.move @@ -1,19 +1,45 @@ address StarcoinFramework { /// Helper module to do u64 arith. module Arith { + use StarcoinFramework::Errors; + const ERR_INVALID_CARRY: u64 = 301; + const ERR_INVALID_BORROW: u64 = 302; + + const P32: u64 = 0x100000000; + const P64: u128 = 0x10000000000000000; + + spec module { + pragma verify = true; + pragma aborts_if_is_strict; + } + /// split u64 to (high, low) public fun split_u64(i: u64): (u64, u64) { (i >> 32, i & 0xFFFFFFFF) } + spec split_u64 { + pragma opaque; // MVP cannot reason about bitwise operation + ensures result_1 == i / P32; + ensures result_2 == i % P32; + } + /// combine (high, low) to u64, /// any lower bits of `high` will be erased, any higher bits of `low` will be erased. public fun combine_u64(hi: u64, lo: u64): u64 { (hi << 32) | (lo & 0xFFFFFFFF) } + spec combine_u64 { + pragma opaque; // MVP cannot reason about bitwise operation + let hi_32 = hi % P32; + let lo_32 = lo % P32; + ensures result == hi_32 * P32 + lo_32; + } + /// a + b, with carry public fun adc(a: u64, b: u64, carry: &mut u64) : u64 { + assert!(*carry <= 1, Errors::invalid_argument(ERR_INVALID_CARRY)); let (a1, a0) = split_u64(a); let (b1, b0) = split_u64(b); let (c, r0) = split_u64(a0 + b0 + *carry); @@ -22,27 +48,51 @@ module Arith { combine_u64(r1, r0) } + spec adc { + // Carry has either to be 0 or 1 + aborts_if !(carry == 0 || carry == 1); + ensures carry == 0 || carry == 1; + // Result with or without carry + ensures carry == 0 ==> result == a + b + old(carry); + ensures carry == 1 ==> P64 + result == a + b + old(carry); + } + /// a - b, with borrow public fun sbb(a: u64, b: u64, borrow: &mut u64): u64 { + assert!(*borrow <= 1, Errors::invalid_argument(ERR_INVALID_BORROW)); let (a1, a0) = split_u64(a); let (b1, b0) = split_u64(b); - let (b, r0) = split_u64((1 << 32) + a0 - b0 - *borrow); - let borrowed = if(b==0) {1} else {0}; - let (b, r1) = split_u64((1 << 32) + a1 - b1 - borrowed); - *borrow = if(b==0) {1} else {0}; + let (b, r0) = split_u64(P32 + a0 - b0 - *borrow); + let borrowed = 1 - b; + let (b, r1) = split_u64(P32 + a1 - b1 - borrowed); + *borrow = 1 - b; combine_u64(r1, r0) } + + spec sbb { + // Borrow has either to be 0 or 1 + aborts_if !(borrow == 0 || borrow == 1); + ensures borrow == 0 || borrow == 1; + // Result with or without borrow + ensures borrow == 0 ==> result == a - b - old(borrow); + ensures borrow == 1 ==> result == P64 + a - b - old(borrow); + } } /// Implementation u256. module U256 { + spec module { + pragma verify = true; + } + use StarcoinFramework::Vector; use StarcoinFramework::Errors; const WORD: u8 = 4; - + const P32: u64 = 0x100000000; + const P64: u128 = 0x10000000000000000; const ERR_INVALID_LENGTH: u64 = 100; const ERR_OVERFLOW: u64 = 200; @@ -54,8 +104,15 @@ module U256 { bits: vector, } - spec module { - pragma verify = false; + spec U256 { + invariant len(bits) == 4; + } + + spec fun value_of_U256(a: U256): num { + a.bits[0] + + a.bits[1] * P64 + + a.bits[2] * P64 * P64 + + a.bits[3] * P64 * P64 * P64 } public fun zero(): U256 { @@ -77,9 +134,12 @@ module U256 { Vector::push_back(&mut bits, high); Vector::push_back(&mut bits, 0u64); Vector::push_back(&mut bits, 0u64); - U256 { - bits - } + U256 { bits } + } + + spec from_u128 { + pragma opaque; // Original function has bitwise operator + ensures value_of_U256(result) == v; } #[test] @@ -98,18 +158,32 @@ module U256 { from_bytes(&data, true) } + spec from_big_endian { + pragma verify = false; // TODO: How to interpret the value of vector data of bytes + } + public fun from_little_endian(data: vector): U256 { // TODO: define error code. assert!(Vector::length(&data) <= 32, Errors::invalid_argument(ERR_INVALID_LENGTH)); from_bytes(&data, false) } + spec from_little_endian { + pragma verify = false; // TODO: How to interpret the value of vector data of bytes + } + public fun to_u128(v: &U256): u128 { assert!(*Vector::borrow(&v.bits, 3) == 0, Errors::invalid_state(ERR_OVERFLOW)); assert!(*Vector::borrow(&v.bits, 2) == 0, Errors::invalid_state(ERR_OVERFLOW)); ((*Vector::borrow(&v.bits, 1) as u128) << 64) | (*Vector::borrow(&v.bits, 0) as u128) } + spec to_u128 { + pragma opaque; // Original function has bitwise operator + aborts_if value_of_U256(v) >= P64 * P64; + ensures value_of_U256(v) == result; + } + #[test] fun test_to_u128() { // 2^^128 - 1 @@ -145,9 +219,18 @@ module U256 { } } }; - EQUAL + return EQUAL } + // TODO: MVP interprets it wrong + // spec compare { + // let va = value_of_U256(a); + // let vb = value_of_U256(b); + // ensures (va > vb) ==> (result == GREATER_THAN); + // ensures (va < vb) ==> (result == LESS_THAN); + // ensures (va == vb) ==> (result == EQUAL); + // } + #[test] fun test_compare() { let a = from_u64(111); @@ -165,6 +248,11 @@ module U256 { a } + spec add { + aborts_if value_of_U256(a) + value_of_U256(b) >= P64 * P64 * P64 * P64; + ensures value_of_U256(result) == value_of_U256(a) + value_of_U256(b); + } + #[test] fun test_add() { let a = Self::one(); @@ -178,6 +266,11 @@ module U256 { a } + spec sub { + aborts_if value_of_U256(a) < value_of_U256(b); + ensures value_of_U256(result) == value_of_U256(a) - value_of_U256(b); + } + #[test] #[expected_failure] fun test_sub_overflow() { @@ -199,6 +292,13 @@ module U256 { a } + spec mul { + // pragma verify = false; + pragma timeout = 200; // Take longer time + aborts_if value_of_U256(a) * value_of_U256(b) >= P64 * P64 * P64 * P64; + ensures value_of_U256(result) == value_of_U256(a) * value_of_U256(b); + } + #[test] fun test_mul() { let a = Self::from_u128(10); @@ -212,6 +312,12 @@ module U256 { a } + spec div { + pragma timeout = 160; // Might take longer time + aborts_if value_of_U256(b) == 0; + ensures value_of_U256(result) == value_of_U256(a) / value_of_U256(b); + } + #[test] fun test_div() { let a = Self::from_u128(10); @@ -227,6 +333,11 @@ module U256 { a } + spec rem { + aborts_if value_of_U256(b) == 0; + ensures value_of_U256(result) == value_of_U256(a) % value_of_U256(b); + } + #[test] fun test_rem() { let a = Self::from_u128(10); @@ -241,6 +352,18 @@ module U256 { a } + spec pow { + // Verfication of Pow takes enormous amount of time + // Don't verify it, and make it opaque so that the caller + // can make use of the properties listed here. + pragma verify = false; + pragma opaque; + pragma timeout = 600; + let p = pow_spec(value_of_U256(a), value_of_U256(b)); + aborts_if p >= P64 * P64 * P64 * P64; + ensures value_of_U256(result) == p; + } + #[test] fun test_pow() { let a = Self::from_u128(10); @@ -268,11 +391,81 @@ module U256 { assert!(carry == 0, 100); } + // TODO: MVP find false examples that violate the spec + // spec add_nocarry { + // aborts_if value_of_U256(a) + value_of_U256(b) >= P64 * P64 * P64 * P64; + // ensures value_of_U256(a) == value_of_U256(old(a)) + value_of_U256(b); + // } + + #[test] + #[expected_failure] + fun test_add_nocarry_overflow() { + let va = Vector::empty(); + Vector::push_back(&mut va, 15891); + Vector::push_back(&mut va, 0); + Vector::push_back(&mut va, 0); + Vector::push_back(&mut va, 0); + + let vb = Vector::empty(); + Vector::push_back(&mut vb, 18446744073709535725); + Vector::push_back(&mut vb, 18446744073709551615); + Vector::push_back(&mut vb, 18446744073709551615); + Vector::push_back(&mut vb, 18446744073709551615); + + let a = U256 { bits: va }; + let b = U256 { bits: vb }; + add_nocarry(&mut a, &b); // MVP thinks this won't abort + } + + #[test] + fun test_add_nocarry_like_native_1() { + let va = Vector::empty(); + Vector::push_back(&mut va, 15891); + Vector::push_back(&mut va, 0); + Vector::push_back(&mut va, 0); + Vector::push_back(&mut va, 0); + + let vb = Vector::empty(); + Vector::push_back(&mut vb, 18446744073709535724); + Vector::push_back(&mut vb, 18446744073709551615); + Vector::push_back(&mut vb, 18446744073709551615); + Vector::push_back(&mut vb, 18446744073709551615); + + let a1 = U256 { bits: va }; + let a2 = copy a1; + let b = U256 { bits: vb }; + add_nocarry(&mut a1, &b); + native_add(&mut a2, &b); + assert!(compare(&a1, &a2) == EQUAL, 0); // MVP thinks this doesn't hold + } + + #[test] + fun test_add_nocarry_like_native_2() { + let va = Vector::empty(); + Vector::push_back(&mut va, 26962); + Vector::push_back(&mut va, 24464); + Vector::push_back(&mut va, 6334); + Vector::push_back(&mut va, 19169); + + let vb = Vector::empty(); + Vector::push_back(&mut vb, 29358); + Vector::push_back(&mut vb, 26500); + Vector::push_back(&mut vb, 15724); + Vector::push_back(&mut vb, 11478); + + let a1 = U256 { bits: va }; + let a2 = copy a1; + let b = U256 { bits: vb }; + add_nocarry(&mut a1, &b); // MVP thinks this abort + native_add(&mut a2, &b); + assert!(compare(&a1, &a2) == EQUAL, 0); + } + /// move implementation of native_sub. fun sub_noborrow(a: &mut U256, b: &U256) { let borrow = 0; let idx = 0; - let len =(WORD as u64); + let len = (WORD as u64); while (idx < len) { let a_bit = Vector::borrow_mut(&mut a.bits, idx); let b_bit = Vector::borrow(&b.bits, idx); @@ -285,6 +478,12 @@ module U256 { } + // TODO: Similar situation with `add_nocarry` + // spec sub_noborrow { + // aborts_if value_of_U256(a) < value_of_U256(b); + // ensures value_of_U256(a) == value_of_U256(old(a)) - value_of_U256(b); + // } + native fun from_bytes(data: &vector, be: bool): U256; native fun native_add(a: &mut U256, b: &U256); native fun native_sub(a: &mut U256, b: &U256); @@ -293,65 +492,53 @@ module U256 { native fun native_rem(a: &mut U256, b: &U256); native fun native_pow(a: &mut U256, b: &U256); - spec fun value_of_U256(a: U256): num { - ( a.bits[0] // 0 * 64 - + a.bits[1] << 64 // 1 * 64 - + a.bits[2] << 128 // 2 * 64 - + a.bits[3] << 192 // 3 * 64 - ) - } - - spec from_u128 { - pragma opaque; - ensures value_of_U256(result) == v; - } - - spec to_u128 { - pragma opaque; - aborts_if value_of_U256(v) >= (1 << 128); - ensures value_of_U256(v) == result; - } - - spec add { + spec native_add { pragma opaque; - // TODO: mvp doesn't seem to be using these specs - aborts_if value_of_U256(a) + value_of_U256(b) >= (1 << 256); - ensures value_of_U256(result) == value_of_U256(a) + value_of_U256(b); + aborts_if value_of_U256(a) + value_of_U256(b) >= P64 * P64 * P64 * P64; + ensures value_of_U256(a) == value_of_U256(old(a)) + value_of_U256(b); } - spec sub { + spec native_sub { pragma opaque; - // TODO: mvp doesn't seem to be using these specs - aborts_if value_of_U256(a) > value_of_U256(b); - ensures value_of_U256(result) == value_of_U256(a) - value_of_U256(b); + aborts_if value_of_U256(a) - value_of_U256(b) < 0; + ensures value_of_U256(a) == value_of_U256(old(a)) - value_of_U256(b); } - spec mul { + spec native_mul { pragma opaque; - // TODO: mvp doesn't seem to be using these specs - aborts_if value_of_U256(a) * value_of_U256(b) >= (1 << 256); - ensures value_of_U256(result) == value_of_U256(a) * value_of_U256(b); + aborts_if value_of_U256(a) * value_of_U256(b) >= P64 * P64 * P64 * P64; + ensures value_of_U256(a) == value_of_U256(old(a)) * value_of_U256(b); } - spec div { + spec native_div { pragma opaque; - // TODO: mvp doesn't seem to be using these specs aborts_if value_of_U256(b) == 0; - ensures value_of_U256(result) == value_of_U256(a) / value_of_U256(b); + ensures value_of_U256(a) == value_of_U256(old(a)) / value_of_U256(b); } - spec rem { + spec native_rem { pragma opaque; - // TODO: mvp doesn't seem to be using these specs aborts_if value_of_U256(b) == 0; - ensures value_of_U256(result) == value_of_U256(a) % value_of_U256(b); + ensures value_of_U256(a) == value_of_U256(old(a)) % value_of_U256(b); } - spec pow { + spec native_pow { pragma opaque; - // TODO: mvp doesn't seem to be using these specs - // aborts_if value_of_U256(a) * value_of_U256(b) >= (1 << 256); - // ensures value_of_U256(result) == value_of_U256(a) / value_of_U256(b); + aborts_if pow_spec(value_of_U256(a), value_of_U256(b)) >= P64 * P64 * P64 * P64; + ensures value_of_U256(a) == pow_spec(value_of_U256(old(a)), value_of_U256(b)); + } + + spec fun pow_spec(base: num, expon: num): num { + // This actually doesn't follow a strict definition as 0^0 is undefined + // mathematically. But the U256::pow of Rust is defined to be like this: + // Link: https://docs.rs/uint/0.9.3/src/uint/uint.rs.html#1000-1003 + if (expon > 0) { + let x = pow_spec(base, expon / 2); + if (expon % 2 == 0) { x * x } else { x * x * base } + } else { + 1 + } } + } } diff --git a/sources/VMConfig.move b/sources/VMConfig.move index 63acadaa..6a938d2d 100644 --- a/sources/VMConfig.move +++ b/sources/VMConfig.move @@ -397,7 +397,7 @@ module VMConfig { } spec initialize { - aborts_if Signer::address_of(account) != CoreAddresses::SPEC_GENESIS_ADDRESS(); + aborts_if Signer::address_of(account) != CoreAddresses::GENESIS_ADDRESS(); aborts_if exists>(Signer::address_of(account)); aborts_if exists>( From fe2d1fd4bb4f96e549229ff0c3e802473aec9c1c Mon Sep 17 00:00:00 2001 From: whst Date: Mon, 11 Apr 2022 16:47:19 +0800 Subject: [PATCH 2/2] Fix NTF gas spectest error --- build/StarcoinFramework/BuildInfo.yaml | 2 +- .../bytecode_modules/IdentifierNFT.mv | Bin 1138 -> 1145 bytes .../source_maps/IdentifierNFT.mvsm | Bin 7918 -> 8089 bytes .../source_maps/IdentifierNFTScripts.mvsm | Bin 715 -> 715 bytes build/StarcoinFramework/source_maps/NFT.mvsm | Bin 36623 -> 36623 bytes .../source_maps/NFTGallery.mvsm | Bin 15843 -> 15843 bytes .../source_maps/NFTGalleryScripts.mvsm | Bin 888 -> 888 bytes sources/NFT.move | 9 ++++++--- spectests/nft/identifier_nft.move | 2 +- spectests/nft/test_nft.move | 4 ++-- 10 files changed, 10 insertions(+), 7 deletions(-) diff --git a/build/StarcoinFramework/BuildInfo.yaml b/build/StarcoinFramework/BuildInfo.yaml index f2b64a09..8498a05e 100644 --- a/build/StarcoinFramework/BuildInfo.yaml +++ b/build/StarcoinFramework/BuildInfo.yaml @@ -252,7 +252,7 @@ compiled_package_info: ? address: "0x00000000000000000000000000000001" name: YieldFarmingV2 : StarcoinFramework - source_digest: EFDC9CDA022ECCE3DE00576D1A30A7078D64BC8B20E0E891ABABCEE3A0EE7979 + source_digest: 474424D9D46208E41316F8EC90B53E54C4ACAF882152E7F474C387C7342035F1 build_flags: dev_mode: false test_mode: false diff --git a/build/StarcoinFramework/bytecode_modules/IdentifierNFT.mv b/build/StarcoinFramework/bytecode_modules/IdentifierNFT.mv index ea63c4977bfc3cc2b29e2c066fe75ff4b48424d5..1c6488f8d7253922724984f0c7ca7aab09b9204a 100644 GIT binary patch delta 97 zcmV-n0G|Ky2>A$*8Y0U92c83z0tm7N5C*~p9tz+E4h!xD0u1m4#sUqt2m%hcu{?zV z2>}KR00IdB2?4Xg0bl|k6%GmjI{+X91qBBQ0tx^<01N>O0XG0R1p){G0096NlS2eA DbZ8PK delta 89 zcmV-f0H*)>2=WM!8Y0302bBYq0tl%E5C*vg9tzh54h!W40u1K`$N~+o2m%hVu{?zV vv&sQr0wM+u3IIC*0|W&M3III-Hvl*V3;_iU2@C-X0RjjC0096MlS%|H^xYAv diff --git a/build/StarcoinFramework/source_maps/IdentifierNFT.mvsm b/build/StarcoinFramework/source_maps/IdentifierNFT.mvsm index 16a1d56c5402cfa558bd1fb33143627e78f4d0f9..36f4c4499cb085895fb81c591aa0885f7d5bf009 100644 GIT binary patch literal 8089 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 diff --git a/build/StarcoinFramework/source_maps/IdentifierNFTScripts.mvsm b/build/StarcoinFramework/source_maps/IdentifierNFTScripts.mvsm index 1ea7b7cf7196fab923c60d3b047fee74879b6835..ce05e9dc549c900b997237dba8105f5cb415e45a 100644 GIT binary patch literal 715 zcmYf6DJH`NlLlziF95YHt(3$ulbVA;dy_pOQ7lD|O0TnQcc&4Q0 zm1L%6rWX0Rg#;%TWfqhaGcYkQq!BQ2Miv9ZJRoLb2kP@pElDJ#VLnjtG9U)2cgjzx zB&2>XQ0);QW@IZ)%}YrwBBcH-Q0-+PW?*0@?0Wue1_m)8W+dp(=RhOHfhw5@ssyQ$ z0AeBxjRGo52N_Ci;AH?6=L0dZf!799+Y7|R2HrHF+BrZ>RN&nQDtrbqoM4b_0IGTp P#DoJ6r0N9_GcW)ES5z06 literal 715 zcmWgL{BYswgim+F{;j=n>u2sC`-8b*_mh9B$)5OngeNB1yC#!?VFC~{GN1xR5zmy= zypqhc%+w-3w~*lEqRfJlVg@D#22lbghG#J_!~!uBJ5Zl*YDpp?4RJulsXz=;@06cX zNl1MSP;E01GqM$@=B1<-5mMg+R67ZX85o!eyZ#(d;Z=~~1pT=TsOlOJGZ9n?Qgt1O zi7-?$n}I}P+tH5 diff --git a/build/StarcoinFramework/source_maps/NFT.mvsm b/build/StarcoinFramework/source_maps/NFT.mvsm index 8e1f763d924331fc4d457094f759de91ba223923..759a281cb84f64be4f781b6547473b2cc2bcf162 100644 GIT binary patch literal 36623 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 diff --git a/build/StarcoinFramework/source_maps/NFTGalleryScripts.mvsm b/build/StarcoinFramework/source_maps/NFTGalleryScripts.mvsm index bb1dd369b28416bd8ef0c4c06d244e40b0026e19..969cf7820406a00caea1b81f2d5b44d28d8433f7 100644 GIT binary patch literal 888 zcmYf6DJH`NlLlziF95YHt(3$ulbVA;dq)rBgVjyN@Kn09~er_S| zi8(o`MU}zHMVSR9#SBag3~2<6)9hkk&Ma6 z&A=c9#6$<4G*Gb;5EC1CmO!-*K+H^J-~|EIMgTEWW(uKj&H^gS0b-7#)a2C6GQts4 z3{+eV#0(6qgd=7TP~l-9CLA$GfvS!JG2w_g2~>3vh?xmS;Z&fiOF+y*P$fv!Wguo? F000N^UpD{% literal 888 zcmWgL{BYswgim+F{;j=n>u2sC`-8b*_mh9B$)5OngeNB1Td|XY!3c;M8BhVEpr2ca zdty#bYEflya#3bMNihQx1A{05<6Z!bdI!Wz>_F|lsU?YoG`t5Y{szP#^-lRIm4wvu zb}=xB05Kz5acW*lY7rszvOu-UK+M3vOxX1?K!wR5!wLG+9H=SK^ z2vl|xWGJzLcMGWaArKQAct3z@{{t~Ik%1@J&A=cI#7vnfgu+=9s7xD(If_z~Q!~p5 zM~o3ru@w+AFt8Gim};QHCLkspF)ct public fun owns(owner: address): bool acquires IdentifierNFT { - exists>(owner) && - Option::is_some(&borrow_global>(owner).nft) + if (!exists>(owner)) { + return false + }; + let id_nft = borrow_global>(owner); + Option::is_some(&id_nft.nft) } /// deprecated. Use `owns()` instead. public fun is_owns(owner: address): bool acquires IdentifierNFT { @@ -898,4 +901,4 @@ module NFTGalleryScripts { NFTGallery::transfer(&sender, id, receiver); } } -} \ No newline at end of file +} diff --git a/spectests/nft/identifier_nft.move b/spectests/nft/identifier_nft.move index b59f18ed..c6c9f5c9 100644 --- a/spectests/nft/identifier_nft.move +++ b/spectests/nft/identifier_nft.move @@ -93,7 +93,7 @@ module creator::XMembership { // check memebership in special method. public fun do_membership_action(sender: &signer) acquires XMembershipBurnCapability{ let addr = Signer::address_of(sender); - assert!(IdentifierNFT::is_owns(addr), 1001); + assert!(IdentifierNFT::owns(addr), 1001); let nft_info = Option::destroy_some(IdentifierNFT::get_nft_info(addr)); let now = Timestamp::now_milliseconds(); let (_id,_creator,_metadata,membership) = NFT::unpack_info(nft_info); diff --git a/spectests/nft/test_nft.move b/spectests/nft/test_nft.move index 77c79b30..c1d32f81 100644 --- a/spectests/nft/test_nft.move +++ b/spectests/nft/test_nft.move @@ -44,7 +44,7 @@ script { use creator::TestNFT::{Self, TestNFT}; fun main(sender: signer) { TestNFT::init(&sender); - assert!(NFT::is_register(), 1001); + assert!(NFT::is_registered(), 1001); TestNFT::mint(&sender); } } @@ -88,4 +88,4 @@ fun main(sender: signer) { let nft = NFTGallery::get_nft_info_by_id(sender_addr, 1); assert!(Option::is_some(&nft), 1000); } -} \ No newline at end of file +}