From 857e0dd5301037897ddd0500255d2890302f900a Mon Sep 17 00:00:00 2001 From: sirouk <8901571+sirouk@users.noreply.github.com> Date: Tue, 14 Nov 2023 15:11:16 -0500 Subject: [PATCH] [move] Clean up names (#99) Co-authored-by: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> --- Cargo.lock | 302 +++++++++--------- Cargo.toml | 72 ++--- framework/cached-packages/Cargo.toml | 2 +- .../src/libra_framework_sdk_builder.rs | 48 +-- .../sources/modified_source/coin.move | 2 +- .../modified_source/diem_governance.move | 28 +- .../modified_source/diem_governance.spec.move | 6 +- .../sources/modified_source/genesis.move | 20 +- .../modified_source/reconfiguration.spec.move | 4 +- .../sources/modified_source/stake.move | 4 +- .../modified_source/transaction_fee.move | 96 +++--- .../modified_source/transaction_fee.spec.move | 26 +- .../transaction_validation.move | 8 +- .../transaction_validation.spec.move | 14 +- .../modified_specs_only/block.spec.move | 4 +- .../consensus_config.spec.move | 4 +- .../gas_schedule.spec.move | 8 +- .../modified_specs_only/version.spec.move | 4 +- .../sources/multisig_account.move | 6 +- .../sources/ol_sources/burn.move | 8 +- .../sources/ol_sources/epoch_boundary.move | 9 +- .../sources/ol_sources/genesis_migration.move | 14 +- .../sources/ol_sources/infra_escrow.move | 4 +- .../sources/ol_sources/libra_coin.move | 111 +------ .../sources/ol_sources/libra_coin.orig | 117 +++++++ .../sources/ol_sources/libra_coin.ported | 107 +++++++ .../sources/ol_sources/match_index.move | 8 +- .../sources/ol_sources/mock.move | 24 +- .../sources/ol_sources/ol_account.move | 102 +++--- .../sources/ol_sources/ol_account.spec.move | 18 +- .../sources/ol_sources/oracle.move | 10 +- .../sources/ol_sources/pledge_accounts.move | 37 ++- .../sources/ol_sources/rewards.move | 14 +- .../sources/ol_sources/safe.move | 6 +- .../sources/ol_sources/slow_wallet.move | 10 +- .../sources/ol_sources/tests/burn.test.move | 15 +- .../ol_sources/tests/migration.test.move | 6 +- .../ol_sources/tests/rewards.test.move | 12 +- .../ol_sources/tests/slow_wallet.test.move | 12 +- .../sources/ol_sources/tests/tower.test.move | 3 - .../tests/validator_reward.test.move | 16 +- .../ol_sources/tests/vote_lib/safe.test.move | 4 +- .../ol_sources/validator_universe.move | 4 +- framework/releases/head.mrb | Bin 594562 -> 587944 bytes smoke-tests/src/helpers.rs | 2 +- tools/genesis/src/genesis_functions.rs | 2 +- tools/query/tests/view.rs | 2 +- types/src/move_resource/gas_coin.rs | 2 +- .../{tower_state.rs => libra_coin.rs} | 13 +- 49 files changed, 726 insertions(+), 624 deletions(-) create mode 100644 framework/libra-framework/sources/ol_sources/libra_coin.orig create mode 100644 framework/libra-framework/sources/ol_sources/libra_coin.ported rename types/src/move_resource/{tower_state.rs => libra_coin.rs} (91%) diff --git a/Cargo.lock b/Cargo.lock index 40ed9bc26..4aecbb67f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1599,7 +1599,7 @@ dependencies = [ [[package]] name = "diem" version = "2.0.2" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "async-trait", @@ -1680,7 +1680,7 @@ dependencies = [ [[package]] name = "diem-accumulator" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "diem-crypto", @@ -1690,7 +1690,7 @@ dependencies = [ [[package]] name = "diem-aggregator" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -1708,7 +1708,7 @@ dependencies = [ [[package]] name = "diem-api" version = "0.2.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "async-trait", @@ -1749,7 +1749,7 @@ dependencies = [ [[package]] name = "diem-api-types" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "async-trait", @@ -1776,7 +1776,7 @@ dependencies = [ [[package]] name = "diem-backup-cli" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "async-trait", @@ -1823,7 +1823,7 @@ dependencies = [ [[package]] name = "diem-backup-service" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -1845,7 +1845,7 @@ dependencies = [ [[package]] name = "diem-bitvec" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "serde 1.0.163", "serde_bytes", @@ -1854,7 +1854,7 @@ dependencies = [ [[package]] name = "diem-block-executor" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "arc-swap", @@ -1879,7 +1879,7 @@ dependencies = [ [[package]] name = "diem-block-partitioner" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -1899,7 +1899,7 @@ dependencies = [ [[package]] name = "diem-bounded-executor" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "futures", "tokio", @@ -1908,7 +1908,7 @@ dependencies = [ [[package]] name = "diem-build-info" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "shadow-rs", ] @@ -1916,7 +1916,7 @@ dependencies = [ [[package]] name = "diem-cached-packages" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", "diem-framework", @@ -1929,7 +1929,7 @@ dependencies = [ [[package]] name = "diem-channels" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "diem-infallible", @@ -1941,7 +1941,7 @@ dependencies = [ [[package]] name = "diem-cli-common" version = "1.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anstyle", "clap 4.4.2", @@ -1951,7 +1951,7 @@ dependencies = [ [[package]] name = "diem-compression" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "diem-logger", "diem-metrics-core", @@ -1963,7 +1963,7 @@ dependencies = [ [[package]] name = "diem-config" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -1993,7 +1993,7 @@ dependencies = [ [[package]] name = "diem-consensus" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "arc-swap", @@ -2055,7 +2055,7 @@ dependencies = [ [[package]] name = "diem-consensus-notifications" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "async-trait", "diem-crypto", @@ -2070,7 +2070,7 @@ dependencies = [ [[package]] name = "diem-consensus-types" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -2093,7 +2093,7 @@ dependencies = [ [[package]] name = "diem-crash-handler" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "backtrace", "diem-logger", @@ -2105,7 +2105,7 @@ dependencies = [ [[package]] name = "diem-crypto" version = "0.0.3" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "ark-ec", @@ -2142,7 +2142,7 @@ dependencies = [ [[package]] name = "diem-crypto-derive" version = "0.0.3" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "proc-macro2 1.0.59", "quote 1.0.28", @@ -2152,7 +2152,7 @@ dependencies = [ [[package]] name = "diem-data-client" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "async-trait", "diem-config", @@ -2179,7 +2179,7 @@ dependencies = [ [[package]] name = "diem-data-streaming-service" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "async-trait", "diem-channels", @@ -2205,7 +2205,7 @@ dependencies = [ [[package]] name = "diem-db" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "arc-swap", @@ -2253,7 +2253,7 @@ dependencies = [ [[package]] name = "diem-db-indexer" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -2279,7 +2279,7 @@ dependencies = [ [[package]] name = "diem-db-tool" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "async-trait", @@ -2303,7 +2303,7 @@ dependencies = [ [[package]] name = "diem-debugger" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "clap 4.4.2", @@ -2334,7 +2334,7 @@ dependencies = [ [[package]] name = "diem-enum-conversion-derive" version = "0.0.3" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "proc-macro2 1.0.59", "quote 1.0.28", @@ -2344,7 +2344,7 @@ dependencies = [ [[package]] name = "diem-event-notifications" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "async-trait", "diem-channels", @@ -2361,7 +2361,7 @@ dependencies = [ [[package]] name = "diem-executor" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "arr_macro", @@ -2392,7 +2392,7 @@ dependencies = [ [[package]] name = "diem-executor-test-helpers" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "diem-cached-packages", @@ -2416,7 +2416,7 @@ dependencies = [ [[package]] name = "diem-executor-types" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -2437,7 +2437,7 @@ dependencies = [ [[package]] name = "diem-fallible" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "thiserror", ] @@ -2445,7 +2445,7 @@ dependencies = [ [[package]] name = "diem-faucet-core" version = "2.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "async-trait", @@ -2479,7 +2479,7 @@ dependencies = [ [[package]] name = "diem-faucet-metrics-server" version = "2.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "diem-logger", @@ -2494,7 +2494,7 @@ dependencies = [ [[package]] name = "diem-forge" version = "0.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "again", "anyhow", @@ -2549,7 +2549,7 @@ dependencies = [ [[package]] name = "diem-framework" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "ark-bls12-381", @@ -2615,7 +2615,7 @@ dependencies = [ [[package]] name = "diem-gas" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -2638,7 +2638,7 @@ dependencies = [ [[package]] name = "diem-gas-algebra-ext" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "move-core-types", ] @@ -2646,7 +2646,7 @@ dependencies = [ [[package]] name = "diem-gas-profiling" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "diem-framework", @@ -2664,7 +2664,7 @@ dependencies = [ [[package]] name = "diem-genesis" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -2690,7 +2690,7 @@ dependencies = [ [[package]] name = "diem-github-client" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "diem-proxy", "serde 1.0.163", @@ -2702,17 +2702,17 @@ dependencies = [ [[package]] name = "diem-global-constants" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" [[package]] name = "diem-id-generator" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" [[package]] name = "diem-indexer" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "async-trait", @@ -2751,7 +2751,7 @@ dependencies = [ [[package]] name = "diem-indexer-grpc-fullnode" version = "1.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "base64 0.13.0", @@ -2788,12 +2788,12 @@ dependencies = [ [[package]] name = "diem-infallible" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" [[package]] name = "diem-inspection-service" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "diem-build-info", @@ -2816,7 +2816,7 @@ dependencies = [ [[package]] name = "diem-jellyfish-merkle" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -2842,7 +2842,7 @@ dependencies = [ [[package]] name = "diem-keygen" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "diem-crypto", "diem-types", @@ -2852,7 +2852,7 @@ dependencies = [ [[package]] name = "diem-language-e2e-tests" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -2890,7 +2890,7 @@ dependencies = [ [[package]] name = "diem-log-derive" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "proc-macro2 1.0.59", "quote 1.0.28", @@ -2900,7 +2900,7 @@ dependencies = [ [[package]] name = "diem-logger" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "backtrace", "chrono", @@ -2924,7 +2924,7 @@ dependencies = [ [[package]] name = "diem-mempool" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "async-trait", @@ -2964,7 +2964,7 @@ dependencies = [ [[package]] name = "diem-mempool-notifications" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "async-trait", "diem-runtimes", @@ -2978,7 +2978,7 @@ dependencies = [ [[package]] name = "diem-memsocket" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "bytes", "diem-infallible", @@ -2989,7 +2989,7 @@ dependencies = [ [[package]] name = "diem-metrics-core" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "prometheus", @@ -2998,7 +2998,7 @@ dependencies = [ [[package]] name = "diem-move-stdlib" version = "0.1.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "hex", @@ -3021,7 +3021,7 @@ dependencies = [ [[package]] name = "diem-moving-average" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "chrono", ] @@ -3029,7 +3029,7 @@ dependencies = [ [[package]] name = "diem-mvhashmap" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3044,7 +3044,7 @@ dependencies = [ [[package]] name = "diem-netcore" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "bytes", "diem-memsocket", @@ -3061,7 +3061,7 @@ dependencies = [ [[package]] name = "diem-network" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "async-trait", @@ -3104,7 +3104,7 @@ dependencies = [ [[package]] name = "diem-network-builder" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "async-trait", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3130,7 +3130,7 @@ dependencies = [ [[package]] name = "diem-network-checker" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "clap 4.4.2", @@ -3147,7 +3147,7 @@ dependencies = [ [[package]] name = "diem-network-discovery" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3173,7 +3173,7 @@ dependencies = [ [[package]] name = "diem-node" version = "1.6.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3238,7 +3238,7 @@ dependencies = [ [[package]] name = "diem-node-identity" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "claims", @@ -3250,7 +3250,7 @@ dependencies = [ [[package]] name = "diem-num-variants" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "proc-macro2 1.0.59", "quote 1.0.28", @@ -3260,7 +3260,7 @@ dependencies = [ [[package]] name = "diem-openapi" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "async-trait", "percent-encoding", @@ -3273,7 +3273,7 @@ dependencies = [ [[package]] name = "diem-package-builder" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "diem-framework", @@ -3286,7 +3286,7 @@ dependencies = [ [[package]] name = "diem-peer-monitoring-service-client" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "async-trait", "diem-channels", @@ -3312,7 +3312,7 @@ dependencies = [ [[package]] name = "diem-peer-monitoring-service-server" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", "bytes", @@ -3339,7 +3339,7 @@ dependencies = [ [[package]] name = "diem-peer-monitoring-service-types" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", "cfg_block", @@ -3352,7 +3352,7 @@ dependencies = [ [[package]] name = "diem-proptest-helpers" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "crossbeam", "proptest", @@ -3362,7 +3362,7 @@ dependencies = [ [[package]] name = "diem-protos" version = "1.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "pbjson", "prost", @@ -3373,7 +3373,7 @@ dependencies = [ [[package]] name = "diem-proxy" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "ipnet", ] @@ -3381,7 +3381,7 @@ dependencies = [ [[package]] name = "diem-push-metrics" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "diem-logger", "diem-metrics-core", @@ -3392,7 +3392,7 @@ dependencies = [ [[package]] name = "diem-rate-limiter" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "diem-infallible", "diem-logger", @@ -3406,7 +3406,7 @@ dependencies = [ [[package]] name = "diem-release-builder" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3442,7 +3442,7 @@ dependencies = [ [[package]] name = "diem-resource-viewer" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "diem-types", @@ -3454,7 +3454,7 @@ dependencies = [ [[package]] name = "diem-rest-client" version = "0.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3480,7 +3480,7 @@ dependencies = [ [[package]] name = "diem-retrier" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "diem-logger", "tokio", @@ -3489,7 +3489,7 @@ dependencies = [ [[package]] name = "diem-rocksdb-options" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "diem-config", "rocksdb", @@ -3498,7 +3498,7 @@ dependencies = [ [[package]] name = "diem-rosetta" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3532,7 +3532,7 @@ dependencies = [ [[package]] name = "diem-runtimes" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "tokio", ] @@ -3540,7 +3540,7 @@ dependencies = [ [[package]] name = "diem-safety-rules" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "diem-config", "diem-consensus-types", @@ -3564,7 +3564,7 @@ dependencies = [ [[package]] name = "diem-schemadb" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "diem-infallible", @@ -3578,7 +3578,7 @@ dependencies = [ [[package]] name = "diem-scratchpad" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "bitvec 0.19.6", "diem-crypto", @@ -3595,7 +3595,7 @@ dependencies = [ [[package]] name = "diem-sdk" version = "0.0.3" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3615,7 +3615,7 @@ dependencies = [ [[package]] name = "diem-sdk-builder" version = "0.2.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3634,7 +3634,7 @@ dependencies = [ [[package]] name = "diem-secure-net" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "diem-logger", "diem-metrics-core", @@ -3646,7 +3646,7 @@ dependencies = [ [[package]] name = "diem-secure-storage" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "base64 0.13.0", @@ -3668,7 +3668,7 @@ dependencies = [ [[package]] name = "diem-short-hex-str" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "mirai-annotations", "serde 1.0.163", @@ -3679,7 +3679,7 @@ dependencies = [ [[package]] name = "diem-speculative-state-helper" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "crossbeam", @@ -3691,7 +3691,7 @@ dependencies = [ [[package]] name = "diem-state-sync-driver" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "async-trait", @@ -3724,7 +3724,7 @@ dependencies = [ [[package]] name = "diem-state-view" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3738,7 +3738,7 @@ dependencies = [ [[package]] name = "diem-storage-interface" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "arr_macro", @@ -3765,7 +3765,7 @@ dependencies = [ [[package]] name = "diem-storage-service-client" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "async-trait", "diem-channels", @@ -3779,7 +3779,7 @@ dependencies = [ [[package]] name = "diem-storage-service-server" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", "bytes", @@ -3805,7 +3805,7 @@ dependencies = [ [[package]] name = "diem-storage-service-types" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", "diem-compression", @@ -3820,7 +3820,7 @@ dependencies = [ [[package]] name = "diem-temppath" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "hex", "rand 0.7.3", @@ -3829,7 +3829,7 @@ dependencies = [ [[package]] name = "diem-time-service" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "diem-infallible", "enum_dispatch", @@ -3842,7 +3842,7 @@ dependencies = [ [[package]] name = "diem-transaction-emitter-lib" version = "0.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "again", "anyhow", @@ -3873,7 +3873,7 @@ dependencies = [ [[package]] name = "diem-transaction-generator-lib" version = "0.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "again", "anyhow", @@ -3903,7 +3903,7 @@ dependencies = [ [[package]] name = "diem-transactional-test-harness" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3935,7 +3935,7 @@ dependencies = [ [[package]] name = "diem-types" version = "0.0.3" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "arr_macro", @@ -3968,12 +3968,12 @@ dependencies = [ [[package]] name = "diem-utils" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" [[package]] name = "diem-validator-interface" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "async-trait", @@ -3994,7 +3994,7 @@ dependencies = [ [[package]] name = "diem-vault-client" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "base64 0.13.0", "chrono", @@ -4010,7 +4010,7 @@ dependencies = [ [[package]] name = "diem-vm" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -4057,7 +4057,7 @@ dependencies = [ [[package]] name = "diem-vm-genesis" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -4078,7 +4078,7 @@ dependencies = [ [[package]] name = "diem-vm-logging" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "arc-swap", "diem-crypto", @@ -4094,7 +4094,7 @@ dependencies = [ [[package]] name = "diem-vm-types" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "diem-aggregator", @@ -4107,7 +4107,7 @@ dependencies = [ [[package]] name = "diem-vm-validator" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "diem-gas", @@ -4122,7 +4122,7 @@ dependencies = [ [[package]] name = "diem-warp-webserver" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6179,7 +6179,7 @@ checksum = "5474f8732dc7e0635ae9df6595bcd39cd30e3cfe8479850d4fa3e69306c19712" [[package]] name = "move-abigen" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6196,7 +6196,7 @@ dependencies = [ [[package]] name = "move-binary-format" version = "0.0.3" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "arbitrary", @@ -6213,12 +6213,12 @@ dependencies = [ [[package]] name = "move-borrow-graph" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" [[package]] name = "move-bytecode-source-map" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6233,7 +6233,7 @@ dependencies = [ [[package]] name = "move-bytecode-utils" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "move-binary-format", @@ -6245,7 +6245,7 @@ dependencies = [ [[package]] name = "move-bytecode-verifier" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "fail 0.4.0", @@ -6259,7 +6259,7 @@ dependencies = [ [[package]] name = "move-bytecode-viewer" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "clap 4.4.2", @@ -6276,7 +6276,7 @@ dependencies = [ [[package]] name = "move-cli" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6320,7 +6320,7 @@ dependencies = [ [[package]] name = "move-command-line-common" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "difference", @@ -6337,7 +6337,7 @@ dependencies = [ [[package]] name = "move-compiler" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6366,7 +6366,7 @@ dependencies = [ [[package]] name = "move-core-types" version = "0.0.4" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "arbitrary", @@ -6388,7 +6388,7 @@ dependencies = [ [[package]] name = "move-coverage" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6408,7 +6408,7 @@ dependencies = [ [[package]] name = "move-disassembler" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "clap 4.4.2", @@ -6426,7 +6426,7 @@ dependencies = [ [[package]] name = "move-docgen" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "codespan", @@ -6445,7 +6445,7 @@ dependencies = [ [[package]] name = "move-errmapgen" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6459,7 +6459,7 @@ dependencies = [ [[package]] name = "move-ir-compiler" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6478,7 +6478,7 @@ dependencies = [ [[package]] name = "move-ir-to-bytecode" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "codespan-reporting", @@ -6497,7 +6497,7 @@ dependencies = [ [[package]] name = "move-ir-to-bytecode-syntax" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "hex", @@ -6510,7 +6510,7 @@ dependencies = [ [[package]] name = "move-ir-types" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "hex", @@ -6524,7 +6524,7 @@ dependencies = [ [[package]] name = "move-model" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "codespan", @@ -6551,7 +6551,7 @@ dependencies = [ [[package]] name = "move-package" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6587,7 +6587,7 @@ dependencies = [ [[package]] name = "move-prover" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "async-trait", @@ -6624,7 +6624,7 @@ dependencies = [ [[package]] name = "move-prover-boogie-backend" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "async-trait", @@ -6653,7 +6653,7 @@ dependencies = [ [[package]] name = "move-resource-viewer" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6668,7 +6668,7 @@ dependencies = [ [[package]] name = "move-stackless-bytecode" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "codespan", "codespan-reporting", @@ -6694,7 +6694,7 @@ dependencies = [ [[package]] name = "move-stdlib" version = "0.1.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "hex", @@ -6717,7 +6717,7 @@ dependencies = [ [[package]] name = "move-symbol-pool" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "once_cell", "serde 1.0.163", @@ -6726,7 +6726,7 @@ dependencies = [ [[package]] name = "move-table-extension" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6743,7 +6743,7 @@ dependencies = [ [[package]] name = "move-transactional-test-runner" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "clap 4.4.2", @@ -6774,7 +6774,7 @@ dependencies = [ [[package]] name = "move-unit-test" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "better_any", @@ -6804,7 +6804,7 @@ dependencies = [ [[package]] name = "move-vm-runtime" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "better_any", "fail 0.4.0", @@ -6821,7 +6821,7 @@ dependencies = [ [[package]] name = "move-vm-test-utils" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "move-binary-format", @@ -6835,7 +6835,7 @@ dependencies = [ [[package]] name = "move-vm-types" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", "move-binary-format", @@ -9030,7 +9030,7 @@ checksum = "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043" [[package]] name = "smoke-test" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#5b5c097872fb9e7bd50a5be1360e3e5f02d9e996" +source = "git+https://github.com/0LNetworkCommunity/diem.git?rev=839afb1#839afb12b716ea7f683d5464efdaa4259074369a" dependencies = [ "anyhow", "async-trait", diff --git a/Cargo.toml b/Cargo.toml index 5f0418a7f..6476ca6ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,37 +41,37 @@ libra-txs = { path = "tools/txs" } libra-wallet = { path = "tools/wallet" } vdf = { git = "https://github.com/0o-de-lally/verifiable_delay.git" } -diem-api-types = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-debugger = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-db = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-forge = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-transactional-test-harness = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -smoke-test = { package = "smoke-test", git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } +diem-api-types = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-debugger = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-db = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-forge = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-transactional-test-harness = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +smoke-test = { package = "smoke-test", git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } -diem = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-build-info = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-node = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-rest-client = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-sdk = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-config = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-crypto = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-genesis = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-global-constants = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-keygen = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-logger = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-types = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-gas = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-vm = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-vm-genesis = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-executor = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-framework = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-cached-packages = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-github-client = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-release-builder = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-language-e2e-tests = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-state-view = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-storage-interface = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -diem-temppath = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } +diem = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-build-info = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-node = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-rest-client = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-sdk = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-config = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-crypto = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-genesis = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-global-constants = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-keygen = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-logger = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-types = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-gas = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-vm = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-vm-genesis = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-executor = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-framework = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-cached-packages = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-github-client = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-release-builder = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-language-e2e-tests = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-state-view = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-storage-interface = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +diem-temppath = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } ### External crate dependencies. # 0L NOTE: most of these are not used. But we leave the entire block here @@ -314,12 +314,12 @@ serde_with = "^3" # move-abigen = { path = "third_party/move/move-prover/move-abigen" } # move-binary-format = { path = "third_party/move/move-binary-format" } # ... see full list in Aptos repo -move-binary-format = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -move-core-types = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -move-command-line-common = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -move-compiler = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -move-model = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } -move-vm-test-utils = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } +move-binary-format = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +move-core-types = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +move-command-line-common = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +move-compiler = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +move-model = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } +move-vm-test-utils = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } # uses a profile similar to `cli` in Diem/Cargo.toml # optimized for performance and size diff --git a/framework/cached-packages/Cargo.toml b/framework/cached-packages/Cargo.toml index 9674e4e46..f4cab0de2 100644 --- a/framework/cached-packages/Cargo.toml +++ b/framework/cached-packages/Cargo.toml @@ -15,7 +15,7 @@ rust-version = { workspace = true } [dependencies] bcs = { workspace = true } # Note the generated SDK code uses hard coded `diemtypes` -diem-types = { git = "https://github.com/0LNetworkCommunity/diem.git", branch = "release" } +diem-types = { git = "https://github.com/0LNetworkCommunity/diem.git", rev = "839afb1" } move-core-types = { workspace = true } once_cell = { workspace = true } diff --git a/framework/cached-packages/src/libra_framework_sdk_builder.rs b/framework/cached-packages/src/libra_framework_sdk_builder.rs index 6e00fdd5d..b506801c1 100644 --- a/framework/cached-packages/src/libra_framework_sdk_builder.rs +++ b/framework/cached-packages/src/libra_framework_sdk_builder.rs @@ -258,17 +258,17 @@ pub enum EntryFunctionCall { /// Only callable in tests and testnets where the core resources account exists. /// Claim the delegated mint capability and destroy the delegated token. - GasCoinClaimMintCapability {}, + LibraCoinClaimMintCapability {}, /// Only callable in tests and testnets where the core resources account exists. /// Create delegated token for the address so the account could claim MintCapability later. - GasCoinDelegateMintCapability { + LibraCoinDelegateMintCapability { to: AccountAddress, }, /// Root account can mint to an address. Only used for genesis and tests. /// The "root" account in smoke tests has some privileges. - GasCoinMintToImpl { + LibraCoinMintToImpl { dst_addr: AccountAddress, amount: u64, }, @@ -705,9 +705,9 @@ impl EntryFunctionCall { id, } => donor_voice_vote_veto_tx(multisig_address, id), JailUnjailByVoucher { addr } => jail_unjail_by_voucher(addr), - GasCoinClaimMintCapability {} => gas_coin_claim_mint_capability(), - GasCoinDelegateMintCapability { to } => gas_coin_delegate_mint_capability(to), - GasCoinMintToImpl { dst_addr, amount } => gas_coin_mint_to_impl(dst_addr, amount), + LibraCoinClaimMintCapability {} => libra_coin_claim_mint_capability(), + LibraCoinDelegateMintCapability { to } => libra_coin_delegate_mint_capability(to), + LibraCoinMintToImpl { dst_addr, amount } => libra_coin_mint_to_impl(dst_addr, amount), MultisigAccountAddOwner { new_owner } => multisig_account_add_owner(new_owner), MultisigAccountAddOwners { new_owners } => multisig_account_add_owners(new_owners), MultisigAccountApproveTransaction { @@ -1515,14 +1515,14 @@ pub fn jail_unjail_by_voucher(addr: AccountAddress) -> TransactionPayload { /// Only callable in tests and testnets where the core resources account exists. /// Claim the delegated mint capability and destroy the delegated token. -pub fn gas_coin_claim_mint_capability() -> TransactionPayload { +pub fn libra_coin_claim_mint_capability() -> TransactionPayload { TransactionPayload::EntryFunction(EntryFunction::new( ModuleId::new( AccountAddress::new([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, ]), - ident_str!("gas_coin").to_owned(), + ident_str!("libra_coin").to_owned(), ), ident_str!("claim_mint_capability").to_owned(), vec![], @@ -1532,14 +1532,14 @@ pub fn gas_coin_claim_mint_capability() -> TransactionPayload { /// Only callable in tests and testnets where the core resources account exists. /// Create delegated token for the address so the account could claim MintCapability later. -pub fn gas_coin_delegate_mint_capability(to: AccountAddress) -> TransactionPayload { +pub fn libra_coin_delegate_mint_capability(to: AccountAddress) -> TransactionPayload { TransactionPayload::EntryFunction(EntryFunction::new( ModuleId::new( AccountAddress::new([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, ]), - ident_str!("gas_coin").to_owned(), + ident_str!("libra_coin").to_owned(), ), ident_str!("delegate_mint_capability").to_owned(), vec![], @@ -1549,14 +1549,14 @@ pub fn gas_coin_delegate_mint_capability(to: AccountAddress) -> TransactionPaylo /// Root account can mint to an address. Only used for genesis and tests. /// The "root" account in smoke tests has some privileges. -pub fn gas_coin_mint_to_impl(dst_addr: AccountAddress, amount: u64) -> TransactionPayload { +pub fn libra_coin_mint_to_impl(dst_addr: AccountAddress, amount: u64) -> TransactionPayload { TransactionPayload::EntryFunction(EntryFunction::new( ModuleId::new( AccountAddress::new([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, ]), - ident_str!("gas_coin").to_owned(), + ident_str!("libra_coin").to_owned(), ), ident_str!("mint_to_impl").to_owned(), vec![], @@ -2723,21 +2723,21 @@ mod decoder { } } - pub fn gas_coin_claim_mint_capability( + pub fn libra_coin_claim_mint_capability( payload: &TransactionPayload, ) -> Option { if let TransactionPayload::EntryFunction(_script) = payload { - Some(EntryFunctionCall::GasCoinClaimMintCapability {}) + Some(EntryFunctionCall::LibraCoinClaimMintCapability {}) } else { None } } - pub fn gas_coin_delegate_mint_capability( + pub fn libra_coin_delegate_mint_capability( payload: &TransactionPayload, ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { - Some(EntryFunctionCall::GasCoinDelegateMintCapability { + Some(EntryFunctionCall::LibraCoinDelegateMintCapability { to: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { @@ -2745,9 +2745,9 @@ mod decoder { } } - pub fn gas_coin_mint_to_impl(payload: &TransactionPayload) -> Option { + pub fn libra_coin_mint_to_impl(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { - Some(EntryFunctionCall::GasCoinMintToImpl { + Some(EntryFunctionCall::LibraCoinMintToImpl { dst_addr: bcs::from_bytes(script.args().get(0)?).ok()?, amount: bcs::from_bytes(script.args().get(1)?).ok()?, }) @@ -3335,16 +3335,16 @@ static SCRIPT_FUNCTION_DECODER_MAP: once_cell::sync::Lazy(); //////// 0L //////// + let total_voting_token_supply = coin::supply(); //////// 0L //////// let early_resolution_vote_threshold = option::none(); if (option::is_some(&total_voting_token_supply)) { let total_supply = *option::borrow(&total_voting_token_supply); @@ -440,7 +440,7 @@ module diem_framework::diem_governance { // stake::get_lockup_secs(stake_pool) >= proposal_expiration, // error::invalid_argument(EINSUFFICIENT_STAKE_LOCKUP), // ); - let voting_power = coin::balance(voter_address); + let voting_power = coin::balance(voter_address); voting::vote( &governance_proposal::create_empty_proposal(), @diem_framework, @@ -590,7 +590,7 @@ module diem_framework::diem_governance { // core_resources: &signer, signer_address: address): signer acquires GovernanceResponsbility { // system_addresses::assert_core_resource(core_resources); // // Core resources account only has mint capability in tests/testnets. - // assert!(gas_Coin::has_mint_capability(core_resources), error::unauthenticated(EUNAUTHORIZED)); + // assert!(libra_coin::has_mint_capability(core_resources), error::unauthenticated(EUNAUTHORIZED)); // get_signer(signer_address) // } @@ -909,21 +909,21 @@ module diem_framework::diem_governance { // let pks = vector[pk_1, pk_2, pk_3]; // stake::create_validator_set(diem_framework, active_validators, pks); - let (burn_cap, mint_cap) = gas_coin::initialize_for_test(diem_framework); - coin::register(proposer); - coin::register(yes_voter); - coin::register(no_voter); + let (burn_cap, mint_cap) = libra_coin::initialize_for_test(diem_framework); + coin::register(proposer); + coin::register(yes_voter); + coin::register(no_voter); - gas_coin::test_mint_to(diem_framework, signer::address_of(proposer), 50); - gas_coin::test_mint_to(diem_framework, signer::address_of(yes_voter), 10); - gas_coin::test_mint_to(diem_framework, signer::address_of(no_voter), 5); + libra_coin::test_mint_to(diem_framework, signer::address_of(proposer), 50); + libra_coin::test_mint_to(diem_framework, signer::address_of(yes_voter), 10); + libra_coin::test_mint_to(diem_framework, signer::address_of(no_voter), 5); // // Spread stake among active and pending_inactive because both need to be accounted for when computing voting // // power. // stake::create_stake_pool(proposer, coin::mint(50, &mint_cap), coin::mint(50, &mint_cap), 10000); // stake::create_stake_pool(yes_voter, coin::mint(10, &mint_cap), coin::mint(10, &mint_cap), 10000); // stake::create_stake_pool(no_voter, coin::mint(5, &mint_cap), coin::mint(5, &mint_cap), 10000); - coin::destroy_mint_cap(mint_cap); - coin::destroy_burn_cap(burn_cap); + coin::destroy_mint_cap(mint_cap); + coin::destroy_burn_cap(burn_cap); } // #[test(diem_framework = @diem_framework)] diff --git a/framework/libra-framework/sources/modified_source/diem_governance.spec.move b/framework/libra-framework/sources/modified_source/diem_governance.spec.move index feee5fb65..5dc8abdd6 100644 --- a/framework/libra-framework/sources/modified_source/diem_governance.spec.move +++ b/framework/libra-framework/sources/modified_source/diem_governance.spec.move @@ -246,7 +246,7 @@ spec diem_framework::diem_governance { spec reconfigure(diem_framework: &signer) { use diem_framework::chain_status; use diem_framework::coin::CoinInfo; - use diem_framework::gas_coin::LibraCoin as GasCoin; + use diem_framework::libra_coin::LibraCoin; use diem_framework::transaction_fee; // use diem_framework::staking_config; @@ -259,7 +259,7 @@ spec diem_framework::diem_governance { requires chain_status::is_operating(); requires timestamp::spec_now_microseconds() >= reconfiguration::last_reconfiguration_time(); requires exists(@diem_framework); - requires exists>(@diem_framework); + requires exists>(@diem_framework); } // /// Signer address must be @core_resources. @@ -267,7 +267,7 @@ spec diem_framework::diem_governance { // /// Address @diem_framework must exist GovernanceResponsbility. // spec get_signer_testnet_only(core_resources: &signer, signer_address: address): signer { // aborts_if signer::address_of(core_resources) != @core_resources; - // aborts_if !exists(signer::address_of(core_resources)); + // aborts_if !exists(signer::address_of(core_resources)); // include GetSignerAbortsIf; // } diff --git a/framework/libra-framework/sources/modified_source/genesis.move b/framework/libra-framework/sources/modified_source/genesis.move index 9e4987251..29abe19fe 100644 --- a/framework/libra-framework/sources/modified_source/genesis.move +++ b/framework/libra-framework/sources/modified_source/genesis.move @@ -31,7 +31,7 @@ module diem_framework::genesis { use ol_framework::musical_chairs; use ol_framework::proof_of_fee; use ol_framework::slow_wallet; - use ol_framework::gas_coin; + use ol_framework::libra_coin; use ol_framework::infra_escrow; use ol_framework::tower_state; use ol_framework::safe; @@ -45,7 +45,7 @@ module diem_framework::genesis { use ol_framework::epoch_boundary; use ol_framework::sacred_cows; #[test_only] - use ol_framework::gas_coin::LibraCoin as GasCoin; + use ol_framework::libra_coin::LibraCoin; //////// end 0L //////// @@ -174,7 +174,7 @@ module diem_framework::genesis { /// Genesis step 2: Initialize Diem coin. fun initialize_diem_coin(diem_framework: &signer) { // NOTE 0L: genesis ceremony is calling this - gas_coin::initialize(diem_framework); + libra_coin::initialize(diem_framework); transaction_fee::initialize_fee_collection_and_distribution(diem_framework, 0); } @@ -190,16 +190,16 @@ module diem_framework::genesis { account::rotate_authentication_key_internal(&core_resources, core_resources_auth_key); // initialize gas - let (burn_cap_two, mint_cap_two) = gas_coin::initialize_for_core(diem_framework); + let (burn_cap_two, mint_cap_two) = libra_coin::initialize_for_core(diem_framework); // give coins to the 'core_resources' account, which has sudo // core_resources is a temporary account, not the same as framework account. - gas_coin::configure_accounts_for_test(diem_framework, &core_resources, mint_cap_two); + libra_coin::configure_accounts_for_test(diem_framework, &core_resources, mint_cap_two); // NOTE: smoke tests will fail without initializing tx fees as in genesis transaction_fee::initialize_fee_collection_and_distribution(diem_framework, 0); // NOTE: 0L: the commented code below shows that we are destroying - // there capabilities elsewhere, at gas_coin::initialize + // there capabilities elsewhere, at libra_coin::initialize coin::destroy_mint_cap(mint_cap_two); coin::destroy_burn_cap(burn_cap_two); @@ -444,7 +444,7 @@ module diem_framework::genesis { let test_signer_before = create_account(diem_framework, addr, 15); let test_signer_after = create_account(diem_framework, addr, 500); assert!(test_signer_before == test_signer_after, 0); - assert!(coin::balance(addr) == 0, 1); //////// 0L //////// + assert!(coin::balance(addr) == 0, 1); //////// 0L //////// } #[test(diem_framework = @0x1)] @@ -468,10 +468,10 @@ module diem_framework::genesis { ]; create_accounts(diem_framework, accounts); - assert!(coin::balance(addr0) == 0, 0); //////// 0L //////// no coins minted at genesis - assert!(coin::balance(addr1) == 0, 1); //////// 0L //////// + assert!(coin::balance(addr0) == 0, 0); //////// 0L //////// no coins minted at genesis + assert!(coin::balance(addr1) == 0, 1); //////// 0L //////// create_account(diem_framework, addr0, 23456); - assert!(coin::balance(addr0) == 0, 2); //////// 0L //////// + assert!(coin::balance(addr0) == 0, 2); //////// 0L //////// } } diff --git a/framework/libra-framework/sources/modified_source/reconfiguration.spec.move b/framework/libra-framework/sources/modified_source/reconfiguration.spec.move index fc01b4c3f..850b3cf6c 100644 --- a/framework/libra-framework/sources/modified_source/reconfiguration.spec.move +++ b/framework/libra-framework/sources/modified_source/reconfiguration.spec.move @@ -63,14 +63,14 @@ spec diem_framework::reconfiguration { spec reconfigure { use diem_framework::coin::CoinInfo; - use diem_framework::gas_coin::LibraCoin as GasCoin; + use diem_framework::libra_coin::LibraCoin; use diem_framework::transaction_fee; // use diem_framework::staking_config; pragma verify_duration_estimate = 120; // TODO: set because of timeout (property proved) requires exists(@diem_framework); - requires exists>(@diem_framework); + requires exists>(@diem_framework); include transaction_fee::RequiresCollectedFeesPerValueLeqBlockDiemSupply; // include staking_config::StakingRewardsConfigRequirement; diff --git a/framework/libra-framework/sources/modified_source/stake.move b/framework/libra-framework/sources/modified_source/stake.move index 9d4fa304b..851a2f9e4 100644 --- a/framework/libra-framework/sources/modified_source/stake.move +++ b/framework/libra-framework/sources/modified_source/stake.move @@ -7,7 +7,7 @@ module diem_framework::stake { use diem_std::bls12381; use diem_std::table::Table; use diem_std::comparator; - use diem_framework::gas_coin::LibraCoin as GasCoin; + use diem_framework::libra_coin::LibraCoin; use diem_framework::account; use diem_framework::coin::{Coin}; use diem_framework::event::{Self, EventHandle}; @@ -181,7 +181,7 @@ module diem_framework::stake { /// Stores transaction fees assigned to validators. All fees are distributed to validators /// at the end of the epoch. struct ValidatorFees has key { - fees_table: Table>, + fees_table: Table>, } diff --git a/framework/libra-framework/sources/modified_source/transaction_fee.move b/framework/libra-framework/sources/modified_source/transaction_fee.move index 95cbbe821..855e340bf 100644 --- a/framework/libra-framework/sources/modified_source/transaction_fee.move +++ b/framework/libra-framework/sources/modified_source/transaction_fee.move @@ -5,7 +5,7 @@ module diem_framework::transaction_fee { use std::error; use std::vector; use std::option::{Self, Option}; - use ol_framework::gas_coin::LibraCoin as GasCoin; + use ol_framework::libra_coin::LibraCoin; use ol_framework::fee_maker; use ol_framework::slow_wallet; use ol_framework::ol_account; @@ -30,13 +30,13 @@ module diem_framework::transaction_fee { /// Stores burn capability to burn the gas fees. struct GasCoinCapabilities has key { - burn_cap: BurnCapability, + burn_cap: BurnCapability, } /// Stores information about the block proposer and the amount of fees /// collected when executing the block. struct CollectedFeesPerBlock has key { - amount: AggregatableCoin, + amount: AggregatableCoin, proposer: Option
, burn_percentage: u8, } @@ -97,7 +97,7 @@ module diem_framework::transaction_fee { } // /// Burns a specified fraction of the coin. - // fun burn_coin_fraction(coin: &mut Coin, burn_percentage: u8) acquires GasCoinCapabilities { + // fun burn_coin_fraction(coin: &mut Coin, burn_percentage: u8) acquires GasCoinCapabilities { // assert!(burn_percentage <= 100, error::out_of_range(EINVALID_BURN_PERCENTAGE)); // let collected_amount = coin::value(coin); @@ -166,7 +166,7 @@ module diem_framework::transaction_fee { // /// Burn transaction fees in epilogue. // public(friend) fun burn_fee(account: address, fee: u64) acquires GasCoinCapabilities { - // coin::burn_from( + // coin::burn_from( // account, // fee, // &borrow_global(@diem_framework).burn_cap, @@ -181,14 +181,14 @@ module diem_framework::transaction_fee { // or we cannot redistribute fees later for some reason (e.g. account cannot receive AptoCoin) // we burn them all at once. This way we avoid having a check for every transaction epilogue. let collected_amount = &mut collected_fees.amount; - coin::collect_into_aggregatable_coin(account, fee, collected_amount); + coin::collect_into_aggregatable_coin(account, fee, collected_amount); // must adjust slow wallet tracker for all transactions slow_wallet::maybe_track_unlocked_withdraw(account, fee); } //////// 0L //////// /// a user can pay a fee directly - public fun user_pay_fee(sender: &signer, fee: Coin) acquires CollectedFeesPerBlock { + public fun user_pay_fee(sender: &signer, fee: Coin) acquires CollectedFeesPerBlock { // Need to track who is making payments to Fee Maker fee_maker::track_user_fee(sender, coin::value(&fee)); pay_fee_impl(fee); @@ -196,7 +196,7 @@ module diem_framework::transaction_fee { /// root account will pay a fee on behalf of a user account. // if VM is not going to track the tx it will just add a system address here - public fun vm_pay_fee(sender: &signer, account: address, fee: Coin) acquires CollectedFeesPerBlock { + public fun vm_pay_fee(sender: &signer, account: address, fee: Coin) acquires CollectedFeesPerBlock { // Need to track who is making payments to Fee Maker // don't track system transfers into transaction fee if (!system_addresses::is_framework_reserved_address(account)) { @@ -206,7 +206,7 @@ module diem_framework::transaction_fee { } /// implementation - fun pay_fee_impl(fee: Coin) acquires CollectedFeesPerBlock { + fun pay_fee_impl(fee: Coin) acquires CollectedFeesPerBlock { let collected_fees = borrow_global_mut(@diem_framework); @@ -214,7 +214,7 @@ module diem_framework::transaction_fee { // or we cannot redistribute fees later for some reason (e.g. account cannot receive AptoCoin) // we burn them all at once. This way we avoid having a check for every transaction epilogue. let collected_amount = &mut collected_fees.amount; - coin::merge_aggregatable_coin(collected_amount, fee); + coin::merge_aggregatable_coin(collected_amount, fee); } #[view] @@ -251,29 +251,29 @@ module diem_framework::transaction_fee { /////// 0L //////// /// withdraw from system transaction account. // belt and suspenders - public(friend) fun root_withdraw_all(root: &signer): Coin acquires CollectedFeesPerBlock { + public(friend) fun root_withdraw_all(root: &signer): Coin acquires CollectedFeesPerBlock { system_addresses::assert_ol(root); withdraw_all_impl(root) } // belt and suspenders implementation - fun withdraw_all_impl(root: &signer): Coin acquires CollectedFeesPerBlock { + fun withdraw_all_impl(root: &signer): Coin acquires CollectedFeesPerBlock { system_addresses::assert_ol(root); let collected_fees = borrow_global_mut(@diem_framework); - coin::drain_aggregatable_coin(&mut collected_fees.amount) + coin::drain_aggregatable_coin(&mut collected_fees.amount) } /// Only called during genesis. - public(friend) fun store_diem_coin_burn_cap(diem_framework: &signer, burn_cap: BurnCapability) { + public(friend) fun store_diem_coin_burn_cap(diem_framework: &signer, burn_cap: BurnCapability) { system_addresses::assert_diem_framework(diem_framework); move_to(diem_framework, GasCoinCapabilities { burn_cap }) } #[test_only] - public fun test_root_withdraw_all(root: &signer): Coin acquires CollectedFeesPerBlock { + public fun test_root_withdraw_all(root: &signer): Coin acquires CollectedFeesPerBlock { system_addresses::assert_ol(root); withdraw_all_impl(root) } @@ -298,35 +298,35 @@ module diem_framework::transaction_fee { // #[test(diem_framework = @diem_framework)] // fun test_burn_fraction_calculation(diem_framework: signer) acquires GasCoinCapabilities { - // use ol_framework::gas_coin; - // let (burn_cap, mint_cap) = gas_coin::initialize_for_test(&diem_framework); + // use ol_framework::libra_coin; + // let (burn_cap, mint_cap) = libra_coin::initialize_for_test(&diem_framework); // store_diem_coin_burn_cap(&diem_framework, burn_cap); - // let c1 = coin::mint(100, &mint_cap); - // assert!(*option::borrow(&coin::supply()) == 100, 0); + // let c1 = coin::mint(100, &mint_cap); + // assert!(*option::borrow(&coin::supply()) == 100, 0); // // Burning 25%. // burn_coin_fraction(&mut c1, 25); // assert!(coin::value(&c1) == 75, 0); - // assert!(*option::borrow(&coin::supply()) == 75, 0); + // assert!(*option::borrow(&coin::supply()) == 75, 0); // // Burning 0%. // burn_coin_fraction(&mut c1, 0); // assert!(coin::value(&c1) == 75, 0); - // assert!(*option::borrow(&coin::supply()) == 75, 0); + // assert!(*option::borrow(&coin::supply()) == 75, 0); // // Burning remaining 100%. // burn_coin_fraction(&mut c1, 100); // assert!(coin::value(&c1) == 0, 0); - // assert!(*option::borrow(&coin::supply()) == 0, 0); + // assert!(*option::borrow(&coin::supply()) == 0, 0); // coin::destroy_zero(c1); - // let c2 = coin::mint(10, &mint_cap); - // assert!(*option::borrow(&coin::supply()) == 10, 0); + // let c2 = coin::mint(10, &mint_cap); + // assert!(*option::borrow(&coin::supply()) == 10, 0); // burn_coin_fraction(&mut c2, 5); // assert!(coin::value(&c2) == 10, 0); - // assert!(*option::borrow(&coin::supply()) == 10, 0); + // assert!(*option::borrow(&coin::supply()) == 10, 0); // burn_coin_fraction(&mut c2, 100); // coin::destroy_zero(c2); @@ -342,14 +342,14 @@ module diem_framework::transaction_fee { // carol: signer, // ) acquires GasCoinCapabilities, CollectedFeesPerBlock { // //////// 0L //////// - // // changed to use GasCoin for fees + // // changed to use LibraCoin for fees // use std::signer; // use ol_framework::ol_account; - // use ol_framework::gas_coin; + // use ol_framework::libra_coin; // // Initialization. - // let (burn_cap, mint_cap) = gas_coin::initialize_for_test(&root); - // gas_coin::test_set_final_supply(&root, 100); + // let (burn_cap, mint_cap) = libra_coin::initialize_for_test(&root); + // libra_coin::test_set_final_supply(&root, 100); // store_diem_coin_burn_cap(&root, burn_cap); // initialize_fee_collection_and_distribution(&root, 10); @@ -363,7 +363,7 @@ module diem_framework::transaction_fee { // coin::deposit(alice_addr, coin::mint(10000, &mint_cap)); // coin::deposit(bob_addr, coin::mint(10000, &mint_cap)); // coin::deposit(carol_addr, coin::mint(10000, &mint_cap)); - // assert!(*option::borrow(&coin::supply()) == 30000, 0); + // assert!(*option::borrow(&coin::supply()) == 30000, 0); // // Block 1 starts. // process_collected_fees(); @@ -373,7 +373,7 @@ module diem_framework::transaction_fee { // let collected_fees = borrow_global(@ol_framework); // assert!(coin::is_aggregatable_coin_zero(&collected_fees.amount), 0); // assert!(*option::borrow(&collected_fees.proposer) == alice_addr, 0); - // assert!(*option::borrow(&coin::supply()) == 30000, 0); + // assert!(*option::borrow(&coin::supply()) == 30000, 0); // // Simulate transaction fee collection - here we simply collect some fees from Bob. // collect_fee(bob_addr, 100); @@ -381,9 +381,9 @@ module diem_framework::transaction_fee { // collect_fee(bob_addr, 400); // // Now Bob must have 1000 less in his account. Alice and Carol have the same amounts. - // assert!(coin::balance(alice_addr) == 10000, 0); - // assert!(coin::balance(bob_addr) == 9000, 0); - // assert!(coin::balance(carol_addr) == 10000, 0); + // assert!(coin::balance(alice_addr) == 10000, 0); + // assert!(coin::balance(bob_addr) == 9000, 0); + // assert!(coin::balance(carol_addr) == 10000, 0); // // Block 2 starts. // process_collected_fees(); @@ -391,23 +391,23 @@ module diem_framework::transaction_fee { // // Collected fees from Bob must have been assigned to Alice. // // assert!(stake::get_validator_fee(alice_addr) == 900, 0); - // assert!(coin::balance(alice_addr) == 10000, 0); - // assert!(coin::balance(bob_addr) == 9000, 0); - // assert!(coin::balance(carol_addr) == 10000, 0); + // assert!(coin::balance(alice_addr) == 10000, 0); + // assert!(coin::balance(bob_addr) == 9000, 0); + // assert!(coin::balance(carol_addr) == 10000, 0); // // Also, aggregator coin is drained and total supply is slightly changed (10% of 1000 is burnt). // let collected_fees = borrow_global(@ol_framework); // assert!(coin::is_aggregatable_coin_zero(&collected_fees.amount), 0); // assert!(*option::borrow(&collected_fees.proposer) == bob_addr, 0); - // // assert!(*option::borrow(&coin::supply()) == 29900, 0); + // // assert!(*option::borrow(&coin::supply()) == 29900, 0); // // Simulate transaction fee collection one more time. // collect_fee(bob_addr, 5000); // collect_fee(bob_addr, 4000); - // assert!(coin::balance(alice_addr) == 10000, 0); - // assert!(coin::balance(bob_addr) == 0, 0); - // assert!(coin::balance(carol_addr) == 10000, 0); + // assert!(coin::balance(alice_addr) == 10000, 0); + // assert!(coin::balance(bob_addr) == 0, 0); + // assert!(coin::balance(carol_addr) == 10000, 0); // // Block 3 starts. // process_collected_fees(); @@ -415,16 +415,16 @@ module diem_framework::transaction_fee { // // Collected fees should have been assigned to Bob because he was the peoposer. // // assert!(stake::get_validator_fee(alice_addr) == 900, 0); - // assert!(coin::balance(alice_addr) == 10000, 0); + // assert!(coin::balance(alice_addr) == 10000, 0); // // assert!(stake::get_validator_fee(bob_addr) == 8100, 0); - // assert!(coin::balance(bob_addr) == 0, 0); - // assert!(coin::balance(carol_addr) == 10000, 0); + // assert!(coin::balance(bob_addr) == 0, 0); + // assert!(coin::balance(carol_addr) == 10000, 0); // // Again, aggregator coin is drained and total supply is changed by 10% of 9000. // let collected_fees = borrow_global(@diem_framework); // assert!(coin::is_aggregatable_coin_zero(&collected_fees.amount), 0); // assert!(*option::borrow(&collected_fees.proposer) == carol_addr, 0); - // // assert!(*option::borrow(&coin::supply()) == 29000, 0); + // // assert!(*option::borrow(&coin::supply()) == 29000, 0); // // Simulate transaction fee collection one last time. // collect_fee(alice_addr, 1000); @@ -435,15 +435,15 @@ module diem_framework::transaction_fee { // register_proposer_for_fee_collection(alice_addr); // // Check that 2000 was collected from Alice. - // assert!(coin::balance(alice_addr) == 8000, 0); - // assert!(coin::balance(bob_addr) == 0, 0); + // assert!(coin::balance(alice_addr) == 8000, 0); + // assert!(coin::balance(bob_addr) == 0, 0); // // Carol must have some fees assigned now. // let collected_fees = borrow_global(@diem_framework); // // assert!(stake::get_validator_fee(carol_addr) == 1800, 0); // assert!(coin::is_aggregatable_coin_zero(&collected_fees.amount), 0); // assert!(*option::borrow(&collected_fees.proposer) == alice_addr, 0); - // // assert!(*option::borrow(&coin::supply()) == 28800, 0); + // // assert!(*option::borrow(&coin::supply()) == 28800, 0); // coin::destroy_burn_cap(burn_cap); // coin::destroy_mint_cap(mint_cap); diff --git a/framework/libra-framework/sources/modified_source/transaction_fee.spec.move b/framework/libra-framework/sources/modified_source/transaction_fee.spec.move index 716d1ca47..63c577f7d 100644 --- a/framework/libra-framework/sources/modified_source/transaction_fee.spec.move +++ b/framework/libra-framework/sources/modified_source/transaction_fee.spec.move @@ -27,45 +27,45 @@ spec diem_framework::transaction_fee { option::spec_borrow(global(@diem_framework).proposer) == proposer_addr; } - // spec burn_coin_fraction(coin: &mut Coin, burn_percentage: u8) { + // spec burn_coin_fraction(coin: &mut Coin, burn_percentage: u8) { // use diem_framework::optional_aggregator; // use diem_framework::aggregator; // use diem_framework::coin::CoinInfo; - // use ol_framework::gas_coin::LibraCoin as GasCoin; + // use ol_framework::libra_coin::LibraCoin; // requires burn_percentage <= 100; // requires exists(@diem_framework); - // requires exists>(@diem_framework); + // requires exists>(@diem_framework); // let amount_to_burn = (burn_percentage * coin::value(coin)) / 100; - // let maybe_supply = coin::get_coin_supply_opt(); + // let maybe_supply = coin::get_coin_supply_opt(); // aborts_if amount_to_burn > 0 && option::is_some(maybe_supply) && optional_aggregator::is_parallelizable(option::borrow(maybe_supply)) // && aggregator::spec_aggregator_get_val(option::borrow(option::borrow(maybe_supply).aggregator)) < // amount_to_burn; // aborts_if option::is_some(maybe_supply) && !optional_aggregator::is_parallelizable(option::borrow(maybe_supply)) // && option::borrow(option::borrow(maybe_supply).integer).value < // amount_to_burn; - // include (amount_to_burn > 0) ==> coin::AbortsIfNotExistCoinInfo; + // include (amount_to_burn > 0) ==> coin::AbortsIfNotExistCoinInfo; // } - spec fun collectedFeesAggregator(): AggregatableCoin { + spec fun collectedFeesAggregator(): AggregatableCoin { global(@diem_framework).amount } spec schema RequiresCollectedFeesPerValueLeqBlockDiemSupply { use diem_framework::optional_aggregator; use diem_framework::aggregator; - let maybe_supply = coin::get_coin_supply_opt(); + let maybe_supply = coin::get_coin_supply_opt(); requires (is_fees_collection_enabled() && option::is_some(maybe_supply)) ==> (aggregator::spec_aggregator_get_val(global(@diem_framework).amount.value) <= - optional_aggregator::optional_aggregator_value(option::spec_borrow(coin::get_coin_supply_opt()))); + optional_aggregator::optional_aggregator_value(option::spec_borrow(coin::get_coin_supply_opt()))); } // spec process_collected_fees() { // use diem_framework::coin::CoinInfo; - // use ol_framework::gas_coin::LibraCoin as GasCoin; + // use ol_framework::libra_coin::LibraCoin; // requires exists(@diem_framework); // // requires exists(@diem_framework); - // requires exists>(@diem_framework); + // requires exists>(@diem_framework); // include RequiresCollectedFeesPerValueLeqBlockDiemSupply; // } @@ -81,8 +81,8 @@ spec diem_framework::transaction_fee { let collected_fees = global(@diem_framework).amount; let aggr = collected_fees.value; aborts_if !exists(@diem_framework); - aborts_if fee > 0 && !exists>(account); - aborts_if fee > 0 && global>(account).coin.value < fee; + aborts_if fee > 0 && !exists>(account); + aborts_if fee > 0 && global>(account).coin.value < fee; aborts_if fee > 0 && aggregator::spec_aggregator_get_val(aggr) + fee > aggregator::spec_get_limit(aggr); aborts_if fee > 0 && aggregator::spec_aggregator_get_val(aggr) @@ -91,7 +91,7 @@ spec diem_framework::transaction_fee { /// Ensure caller is admin. /// Aborts if `GasCoinCapabilities` already exists. - spec store_diem_coin_burn_cap(diem_framework: &signer, burn_cap: BurnCapability) { + spec store_diem_coin_burn_cap(diem_framework: &signer, burn_cap: BurnCapability) { use std::signer; let addr = signer::address_of(diem_framework); aborts_if !system_addresses::is_diem_framework_address(addr); diff --git a/framework/libra-framework/sources/modified_source/transaction_validation.move b/framework/libra-framework/sources/modified_source/transaction_validation.move index dad6e2edc..2c9739240 100644 --- a/framework/libra-framework/sources/modified_source/transaction_validation.move +++ b/framework/libra-framework/sources/modified_source/transaction_validation.move @@ -6,7 +6,7 @@ module diem_framework::transaction_validation { use diem_framework::account; // use diem_framework::diem_coin::DiemCoin; - use ol_framework::gas_coin::LibraCoin as GasCoin; + use ol_framework::libra_coin::LibraCoin; use diem_framework::chain_id; use diem_framework::coin; use diem_framework::system_addresses; @@ -108,10 +108,10 @@ module diem_framework::transaction_validation { let max_transaction_fee = txn_gas_price * txn_max_gas_units; assert!( - coin::is_account_registered(transaction_sender), + coin::is_account_registered(transaction_sender), error::invalid_argument(PROLOGUE_ECANT_PAY_GAS_DEPOSIT), ); - let balance = coin::balance(transaction_sender); + let balance = coin::balance(transaction_sender); assert!(balance >= max_transaction_fee, error::invalid_argument(PROLOGUE_ECANT_PAY_GAS_DEPOSIT)); } @@ -195,7 +195,7 @@ module diem_framework::transaction_validation { // it's important to maintain the error code consistent with vm // to do failed transaction cleanup. assert!( - coin::balance(addr) >= transaction_fee_amount, + coin::balance(addr) >= transaction_fee_amount, error::out_of_range(PROLOGUE_ECANT_PAY_GAS_DEPOSIT), ); diff --git a/framework/libra-framework/sources/modified_source/transaction_validation.spec.move b/framework/libra-framework/sources/modified_source/transaction_validation.spec.move index ae25157d1..b9e37235b 100644 --- a/framework/libra-framework/sources/modified_source/transaction_validation.spec.move +++ b/framework/libra-framework/sources/modified_source/transaction_validation.spec.move @@ -48,8 +48,8 @@ spec diem_framework::transaction_validation { let max_transaction_fee = txn_gas_price * txn_max_gas_units; aborts_if max_transaction_fee > MAX_U64; aborts_if !(txn_sequence_number == global(transaction_sender).sequence_number); - aborts_if !exists>(transaction_sender); - aborts_if !(global>(transaction_sender).coin.value >= max_transaction_fee); + aborts_if !exists>(transaction_sender); + aborts_if !(global>(transaction_sender).coin.value >= max_transaction_fee); } spec prologue_common( @@ -128,7 +128,7 @@ spec diem_framework::transaction_validation { ) { use diem_framework::coin::{CoinStore}; use diem_framework::account::{Account}; - use diem_framework::gas_coin::LibraCoin as GasCoin; + use diem_framework::libra_coin::LibraCoin; // TODO: Can't verify `burn_fee`, complex aborts conditions. pragma aborts_if_is_partial; @@ -139,14 +139,14 @@ spec diem_framework::transaction_validation { let transaction_fee_amount = txn_gas_price * gas_used; let addr = signer::address_of(account); - aborts_if !exists>(addr); - aborts_if !(global>(addr).coin.value >= transaction_fee_amount); + aborts_if !exists>(addr); + aborts_if !(global>(addr).coin.value >= transaction_fee_amount); aborts_if !exists(addr); aborts_if !(global(addr).sequence_number < MAX_U64); - let pre_balance = global>(addr).coin.value; - let post balance = global>(addr).coin.value; + let pre_balance = global>(addr).coin.value; + let post balance = global>(addr).coin.value; let pre_account = global(addr); let post account = global(addr); ensures balance == pre_balance - transaction_fee_amount; diff --git a/framework/libra-framework/sources/modified_specs_only/block.spec.move b/framework/libra-framework/sources/modified_specs_only/block.spec.move index 1b340b54a..b99793ff3 100644 --- a/framework/libra-framework/sources/modified_specs_only/block.spec.move +++ b/framework/libra-framework/sources/modified_specs_only/block.spec.move @@ -8,7 +8,7 @@ spec diem_framework::block { spec block_prologue { use diem_framework::chain_status; use diem_framework::coin::CoinInfo; - use diem_framework::gas_coin::LibraCoin as GasCoin; + use diem_framework::libra_coin::LibraCoin; use diem_framework::transaction_fee; // use diem_framework::staking_config; @@ -21,7 +21,7 @@ spec diem_framework::block { requires (proposer == @vm_reserved) ==> (timestamp::spec_now_microseconds() == timestamp); requires (proposer != @vm_reserved) ==> (timestamp::spec_now_microseconds() < timestamp); requires exists(@diem_framework); - requires exists>(@diem_framework); + requires exists>(@diem_framework); include transaction_fee::RequiresCollectedFeesPerValueLeqBlockDiemSupply; // include staking_config::StakingRewardsConfigRequirement; diff --git a/framework/libra-framework/sources/modified_specs_only/consensus_config.spec.move b/framework/libra-framework/sources/modified_specs_only/consensus_config.spec.move index 5e77c756a..678d06ff0 100644 --- a/framework/libra-framework/sources/modified_specs_only/consensus_config.spec.move +++ b/framework/libra-framework/sources/modified_specs_only/consensus_config.spec.move @@ -22,7 +22,7 @@ spec diem_framework::consensus_config { use std::signer; use diem_framework::stake; use diem_framework::coin::CoinInfo; - use diem_framework::gas_coin::LibraCoin as GasCoin; + use diem_framework::libra_coin::LibraCoin; use diem_framework::transaction_fee; // use diem_framework::staking_config; @@ -38,6 +38,6 @@ spec diem_framework::consensus_config { requires chain_status::is_operating(); requires timestamp::spec_now_microseconds() >= reconfiguration::last_reconfiguration_time(); requires exists(@diem_framework); - requires exists>(@diem_framework); + requires exists>(@diem_framework); } } diff --git a/framework/libra-framework/sources/modified_specs_only/gas_schedule.spec.move b/framework/libra-framework/sources/modified_specs_only/gas_schedule.spec.move index 7ef6fad0f..9045ef1be 100644 --- a/framework/libra-framework/sources/modified_specs_only/gas_schedule.spec.move +++ b/framework/libra-framework/sources/modified_specs_only/gas_schedule.spec.move @@ -18,12 +18,12 @@ spec diem_framework::gas_schedule { use diem_framework::util; use diem_framework::stake; use diem_framework::coin::CoinInfo; - use diem_framework::gas_coin::LibraCoin as GasCoin; + use diem_framework::libra_coin::LibraCoin; use diem_framework::transaction_fee; // use diem_framework::staking_config; requires exists(@diem_framework); - requires exists>(@diem_framework); + requires exists>(@diem_framework); include transaction_fee::RequiresCollectedFeesPerValueLeqBlockDiemSupply; // include staking_config::StakingRewardsConfigRequirement; @@ -38,14 +38,14 @@ spec diem_framework::gas_schedule { spec set_storage_gas_config(diem_framework: &signer, config: StorageGasConfig) { use diem_framework::stake; use diem_framework::coin::CoinInfo; - use diem_framework::gas_coin::LibraCoin as GasCoin; + use diem_framework::libra_coin::LibraCoin; use diem_framework::transaction_fee; // use diem_framework::staking_config; pragma timeout = 100; requires exists(@diem_framework); - requires exists>(@diem_framework); + requires exists>(@diem_framework); include system_addresses::AbortsIfNotDiemFramework{ account: diem_framework }; include transaction_fee::RequiresCollectedFeesPerValueLeqBlockDiemSupply; // include staking_config::StakingRewardsConfigRequirement; diff --git a/framework/libra-framework/sources/modified_specs_only/version.spec.move b/framework/libra-framework/sources/modified_specs_only/version.spec.move index f1d87c263..865b66c2c 100644 --- a/framework/libra-framework/sources/modified_specs_only/version.spec.move +++ b/framework/libra-framework/sources/modified_specs_only/version.spec.move @@ -10,7 +10,7 @@ spec diem_framework::version { use diem_framework::timestamp; use diem_framework::stake; use diem_framework::coin::CoinInfo; - use diem_framework::gas_coin::LibraCoin as GasCoin; + use diem_framework::libra_coin::LibraCoin; use diem_framework::transaction_fee; // use diem_framework::staking_config; // Not verified when verify_duration_estimate > vc_timeout @@ -20,7 +20,7 @@ spec diem_framework::version { requires chain_status::is_operating(); requires timestamp::spec_now_microseconds() >= reconfiguration::last_reconfiguration_time(); requires exists(@diem_framework); - requires exists>(@diem_framework); + requires exists>(@diem_framework); aborts_if !exists(signer::address_of(account)); aborts_if !exists(@diem_framework); diff --git a/framework/libra-framework/sources/multisig_account.move b/framework/libra-framework/sources/multisig_account.move index acefbf95d..f6582c7ac 100644 --- a/framework/libra-framework/sources/multisig_account.move +++ b/framework/libra-framework/sources/multisig_account.move @@ -37,7 +37,7 @@ /// and implement the governance voting logic on top. module diem_framework::multisig_account { use diem_framework::account::{Self, SignerCapability, new_event_handle, create_resource_address}; - use diem_framework::gas_coin::LibraCoin as GasCoin; + use diem_framework::libra_coin::LibraCoin; use diem_framework::chain_id; use diem_framework::create_signer::create_signer; use diem_framework::coin; @@ -889,8 +889,8 @@ module diem_framework::multisig_account { account::create_resource_account(owner, create_multisig_account_seed(to_bytes(&owner_nonce))); // Register the account to receive APT as this is not done by default as part of the resource account creation // flow. - if (!coin::is_account_registered(address_of(&multisig_signer))) { - coin::register(&multisig_signer); + if (!coin::is_account_registered(address_of(&multisig_signer))) { + coin::register(&multisig_signer); }; (multisig_signer, multisig_signer_cap) diff --git a/framework/libra-framework/sources/ol_sources/burn.move b/framework/libra-framework/sources/ol_sources/burn.move index c0977e022..24754ddb3 100644 --- a/framework/libra-framework/sources/ol_sources/burn.move +++ b/framework/libra-framework/sources/ol_sources/burn.move @@ -17,7 +17,7 @@ module ol_framework::burn { use std::vector; // use ol_framework::ol_account; use ol_framework::system_addresses; - use ol_framework::gas_coin::LibraCoin as GasCoin; + use ol_framework::libra_coin::LibraCoin; // use ol_framework::transaction_fee; use ol_framework::coin::{Self, Coin}; use ol_framework::match_index; @@ -57,7 +57,7 @@ module ol_framework::burn { /// 1: U64, how many coins burned public fun epoch_burn_fees( vm: &signer, - coins: &mut Coin, + coins: &mut Coin, ): (bool, u64) acquires UserBurnPreference, BurnCounter { system_addresses::assert_ol(vm); @@ -128,7 +128,7 @@ module ol_framework::burn { /// NOTE: this is unchecked, any user can perform this. /// the user should call this function and not burn methods on coin.move /// since those methods do not track the lifetime_burned - public fun burn_and_track(coin: Coin) acquires BurnCounter { + public fun burn_and_track(coin: Coin) acquires BurnCounter { let value_sent = coin::value(&coin); let state = borrow_global_mut(@ol_framework); coin::user_burn(coin); @@ -137,7 +137,7 @@ module ol_framework::burn { /// performs a burn or recycle according to the attributed user's preference public fun burn_with_user_preference( - vm: &signer, payer: address, user_share: Coin + vm: &signer, payer: address, user_share: Coin ) acquires BurnCounter, UserBurnPreference { system_addresses::assert_ol(vm); let value_sent = coin::value(&user_share); diff --git a/framework/libra-framework/sources/ol_sources/epoch_boundary.move b/framework/libra-framework/sources/ol_sources/epoch_boundary.move index a8f51bbb0..fb31fd4a2 100644 --- a/framework/libra-framework/sources/ol_sources/epoch_boundary.move +++ b/framework/libra-framework/sources/ol_sources/epoch_boundary.move @@ -4,7 +4,7 @@ module diem_framework::epoch_boundary { use ol_framework::musical_chairs; use ol_framework::proof_of_fee; use ol_framework::stake; - use ol_framework::gas_coin::LibraCoin as GasCoin; + use ol_framework::libra_coin::LibraCoin; use ol_framework::rewards; use ol_framework::jail; // use ol_framework::grade; @@ -22,7 +22,7 @@ module diem_framework::epoch_boundary { use std::vector; use std::error; - use diem_std::debug::print; + // use diem_std::debug::print; friend diem_framework::block; @@ -191,9 +191,6 @@ module diem_framework::epoch_boundary { // drip coins let (s_success, s_amount) = slow_wallet::on_new_epoch(root); - print(&33333); - print(&s_success); - print(&s_amount); status.slow_wallet_drip_amount = s_amount; status.slow_wallet_drip_success = s_success; @@ -279,7 +276,7 @@ module diem_framework::epoch_boundary { /// NOTE: receives from reconfiguration.move a mutable borrow of a coin to pay reward /// NOTE: burn remaining fees from transaction fee account happens in reconfiguration.move (it's not a validator_universe concern) // Returns (compliant_vals, reward_deposited) - fun process_outgoing_validators(root: &signer, reward_budget: &mut Coin, reward_per: u64, compliant_vals: vector
): (vector
, u64){ + fun process_outgoing_validators(root: &signer, reward_budget: &mut Coin, reward_per: u64, compliant_vals: vector
): (vector
, u64){ system_addresses::assert_ol(root); let vals = stake::get_current_validators(); let reward_deposited = 0; diff --git a/framework/libra-framework/sources/ol_sources/genesis_migration.move b/framework/libra-framework/sources/ol_sources/genesis_migration.move index 42d9bd35f..09ba28c49 100644 --- a/framework/libra-framework/sources/ol_sources/genesis_migration.move +++ b/framework/libra-framework/sources/ol_sources/genesis_migration.move @@ -13,8 +13,8 @@ module ol_framework::genesis_migration { use diem_framework::coin; use ol_framework::ol_account; use ol_framework::validator_universe; - use ol_framework::gas_coin; - use ol_framework::gas_coin::LibraCoin as GasCoin; + use ol_framework::libra_coin; + use ol_framework::libra_coin::LibraCoin; use ol_framework::transaction_fee; use ol_framework::pledge_accounts; use diem_framework::system_addresses; @@ -55,15 +55,15 @@ module ol_framework::genesis_migration { // Genesis validators should not receive ANY coins from MINT during testing, testnet, nor mainnet up to this point. // they will receive some from the infra escrow. - let genesis_balance = coin::balance(user_addr); + let genesis_balance = coin::balance(user_addr); assert!(expected_initial_balance >= genesis_balance, error::invalid_state(EGENESIS_BALANCE_TOO_HIGH)); let coins_to_mint = expected_initial_balance - genesis_balance; - let c = coin::vm_mint(vm, coins_to_mint); + let c = coin::vm_mint(vm, coins_to_mint); ol_account::deposit_coins(user_addr, c); - let new_balance = coin::balance(user_addr); + let new_balance = coin::balance(user_addr); assert!(new_balance == expected_initial_balance, error::invalid_state(EBALANCE_MISMATCH)); @@ -75,7 +75,7 @@ module ol_framework::genesis_migration { } fun rounding_mint(root: &signer, target_supply: u64) { - let existing_supply = gas_coin::supply(); + let existing_supply = libra_coin::supply(); // we should not ever have migrated more coins than expected // this should abort the genesis process @@ -83,7 +83,7 @@ module ol_framework::genesis_migration { error::invalid_state(EMINTED_OVER_TARGET)); if (target_supply > existing_supply) { - let coin = coin::vm_mint(root, target_supply - existing_supply); + let coin = coin::vm_mint(root, target_supply - existing_supply); transaction_fee::vm_pay_fee(root, @ol_framework, coin); }; } diff --git a/framework/libra-framework/sources/ol_sources/infra_escrow.move b/framework/libra-framework/sources/ol_sources/infra_escrow.move index 24f2f69c3..82817aca7 100644 --- a/framework/libra-framework/sources/ol_sources/infra_escrow.move +++ b/framework/libra-framework/sources/ol_sources/infra_escrow.move @@ -12,7 +12,7 @@ module ol_framework::infra_escrow{ use std::option::{Self, Option}; use diem_framework::system_addresses; - use ol_framework::gas_coin::LibraCoin as GasCoin; + use ol_framework::libra_coin::LibraCoin; use ol_framework::pledge_accounts; // use ol_framework::slow_wallet; use ol_framework::ol_account; @@ -42,7 +42,7 @@ module ol_framework::infra_escrow{ /// VM can call down pledged funds. // NOTE: the signer MUST_BE 0x0 address - fun infra_pledge_withdraw(vm: &signer, amount: u64): Option> { + fun infra_pledge_withdraw(vm: &signer, amount: u64): Option> { system_addresses::assert_ol(vm); pledge_accounts::withdraw_from_all_pledge_accounts(vm, amount) } diff --git a/framework/libra-framework/sources/ol_sources/libra_coin.move b/framework/libra-framework/sources/ol_sources/libra_coin.move index 72440f3fb..101641d2b 100644 --- a/framework/libra-framework/sources/ol_sources/libra_coin.move +++ b/framework/libra-framework/sources/ol_sources/libra_coin.move @@ -6,115 +6,8 @@ // Original Commit: // https://github.com/diem/diem/commit/782b31cb08eeb717ea2b6f3edbf616b13fd4cae8 -module 0x1::LibraCoin { - use std::signer; - - // A representing the Libra coin - // The value of the coin. May be zero - struct LibraCoin has store { value: u64 } - - // A singleton that grants access to `LibraCoin.mint`. Only the Association has one. - struct MintCapability has store, key {} - - // The sum of the values of all LibraCoin resources in the system - struct MarketCap has store, key { total_value: u64 } - - // Return a reference to the MintCapability published under the sender's account. Fails if the - // sender does not have a MintCapability. - // Since only the Association account has a mint capability, this will only succeed if it is - // invoked by a transaction sent by that account. - public fun mint_with_default_capability(sender: &signer, amount: u64): LibraCoin acquires MintCapability, MarketCap { - mint(amount, borrow_global(signer::address_of(sender))) - } - - // Mint a new LibraCoin worth `value`. The caller must have a reference to a MintCapability. - // Only the Association account can acquire such a reference, and it can do so only via - // `borrow_sender_mint_capability` - public fun mint(value: u64, _capability: &MintCapability): LibraCoin acquires MarketCap { - // TODO: temporary measure for testnet only: limit minting to 1B Libra at a time. - // this is to prevent the market cap's total value from hitting u64_max due to excessive - // minting. This will not be a problem in the production Libra system because coins will - // be backed with real-world assets, and thus minting will be correspondingly rarer. - // * 1000000 because the unit is microlibra - assert!(value <= 1000000000 * 1000000, 11); - - // update market cap to reflect minting - let market_cap = borrow_global_mut(@0xA550C18); - market_cap.total_value = market_cap.total_value + value; - - LibraCoin { value } - } - - // This can only be invoked by the Association address, and only a single time. - // Currently, it is invoked in the genesis transaction - public fun initialize(sender: &signer) { - // Only callable by the Association address - assert!(signer::address_of(sender) == @0xA550C18, 1); - - move_to(sender, MintCapability{}); - move_to(sender, MarketCap { total_value: 0 }); - } - - // Return the total value of all Libra in the system - public fun market_cap(): u64 acquires MarketCap { - borrow_global(@0xA550C18).total_value - } - - // Create a new LibraCoin with a value of 0 - public fun zero(): LibraCoin { - LibraCoin { value: 0 } - } - - // Public accessor for the value of a coin - public fun value(coin: &LibraCoin): u64 { - coin.value - } - - // Splits the given coin into two and returns them both - // It leverages `Self.withdraw` for any verifications of the values - public fun split(coin: &mut LibraCoin, amount: u64): LibraCoin { - let other = withdraw(coin, amount); - other - } - - // "Divides" the given coin into two, where original coin is modified in place - // The original coin will have value = original value - `amount` - // The new coin will have a value = `amount` - // Fails if the coins value is less than `amount` - public fun withdraw(coin: &mut LibraCoin, amount: u64): LibraCoin { - // Check that `amount` is less than the coin's value - assert!(coin.value >= amount, 10); - // Split the coin - coin.value = value(coin) - amount; - LibraCoin { value: amount } - } - - // Merges two coins and returns a new coin whose value is equal to the sum of the two inputs - public fun join(coin1: &mut LibraCoin, coin2: LibraCoin) { - deposit(coin1, coin2); - } - - // "Merges" the two coins - // The coin passed in by reference will have a value equal to the sum of the two coins - // The `check` coin is consumed in the process - public fun deposit(coin: &mut LibraCoin, check: LibraCoin) { - let LibraCoin { value } = check; - coin.value = value(coin) + value - } - - // Destroy a coin - // Fails if the value is non-zero - // The amount of LibraCoin in the system is a tightly controlled property, - // so you cannot "burn" any non-zero amount of LibraCoin - public fun destroy_zero(coin: LibraCoin) { - let LibraCoin { value } = coin; - assert!(value == 0, 11) - } - -} - -module ol_framework::gas_coin { +module ol_framework::libra_coin { use std::string; use std::error; use std::signer; @@ -141,7 +34,7 @@ module ol_framework::gas_coin { /// Supply somehow above MAX_U64 const ESUPPLY_OVERFLOW: u64 = 4; - struct LibraCoin has key {} + struct LibraCoin has key { /* new games for society */} struct FinalMint has key { value: u64, diff --git a/framework/libra-framework/sources/ol_sources/libra_coin.orig b/framework/libra-framework/sources/ol_sources/libra_coin.orig new file mode 100644 index 000000000..7a4b6d402 --- /dev/null +++ b/framework/libra-framework/sources/ol_sources/libra_coin.orig @@ -0,0 +1,117 @@ +// Copyright (c) The Libra Core Contributors +// SPDX-License-Identifier: Apache-2.0 +// Licensed under the Apache License, Version 2.0 +// Original source: +// https://github.com/diem/diem/blob/782b31cb08eeb717ea2b6f3edbf616b13fd4cae8/language/move-lang/stdlib/modules/libra_coin.move +// Original Commit: +// https://github.com/diem/diem/commit/782b31cb08eeb717ea2b6f3edbf616b13fd4cae8 + +address 0x0: + +module LibraCoin { + use 0x0.Transaction; + + // A resource representing the Libra coin + // The value of the coin. May be zero + resource struct T { value: u64 } + + // A singleton resource that grants access to `LibraCoin.mint`. Only the Association has one. + resource struct MintCapability {} + + // The sum of the values of all LibraCoin.T resources in the system + resource struct MarketCap { total_value: u64 } + + // Return a reference to the MintCapability published under the sender's account. Fails if the + // sender does not have a MintCapability. + // Since only the Association account has a mint capability, this will only succeed if it is + // invoked by a transaction sent by that account. + public mint_with_default_capability(amount: u64): T acquires MintCapability, MarketCap { + mint(amount, borrow_global(Transaction.sender())) + } + + // Mint a new LibraCoin.T worth `value`. The caller must have a reference to a MintCapability. + // Only the Association account can acquire such a reference, and it can do so only via + // `borrow_sender_mint_capability` + public mint(value: u64, capability: &MintCapability): T acquires MarketCap { + // TODO: temporary measure for testnet only: limit minting to 1B Libra at a time. + // this is to prevent the market cap's total value from hitting u64_max due to excessive + // minting. This will not be a problem in the production Libra system because coins will + // be backed with real-world assets, and thus minting will be correspondingly rarer. + // * 1000000 because the unit is microlibra + Transaction.assert(value <= 1000000000 * 1000000, 11); + + // update market cap resource to reflect minting + let market_cap = borrow_global_mut(0xA550C18); + market_cap.total_value = market_cap.total_value + value; + + T { value } + } + + // This can only be invoked by the Association address, and only a single time. + // Currently, it is invoked in the genesis transaction + public initialize() { + // Only callable by the Association address + Transaction.assert(Transaction.sender() == 0xA550C18, 1); + + move_to_sender(MintCapability{}); + move_to_sender(MarketCap { total_value: 0 }); + } + + // Return the total value of all Libra in the system + public market_cap(): u64 acquires MarketCap { + borrow_global(0xA550C18).total_value + } + + // Create a new LibraCoin.T with a value of 0 + public zero(): T { + T { value: 0 } + } + + // Public accessor for the value of a coin + public value(coin: &T): u64 { + coin.value + } + + // Splits the given coin into two and returns them both + // It leverages `Self.withdraw` for any verifications of the values + public split(coin: T, amount: u64): (T, T) { + let other = coin.withdraw(amount); + (coin, other) + } + + // "Divides" the given coin into two, where original coin is modified in place + // The original coin will have value = original value - `amount` + // The new coin will have a value = `amount` + // Fails if the coins value is less than `amount` + public withdraw(coin: &mut T, amount: u64): T { + // Check that `amount` is less than the coin's value + Transaction.assert(coin.value >= amount, 10); + // Split the coin + coin.value = coin.value - amount; + T { value: amount } + } + + // Merges two coins and returns a new coin whose value is equal to the sum of the two inputs + public join(coin1: T, coin2: T): T { + coin1.deposit(coin2); + coin1 + } + + // "Merges" the two coins + // The coin passed in by reference will have a value equal to the sum of the two coins + // The `check` coin is consumed in the process + public deposit(coin: &mut T, check: T) { + let T { value } = check; + coin.value = coin.value + value + } + + // Destroy a coin + // Fails if the value is non-zero + // The amount of LibraCoin.T in the system is a tightly controlled property, + // so you cannot "burn" any non-zero amount of LibraCoin.T + public destroy_zero(coin: Self.T) { + let T { value } = coin; + Transaction.assert(value == 0, 11) + } + +} \ No newline at end of file diff --git a/framework/libra-framework/sources/ol_sources/libra_coin.ported b/framework/libra-framework/sources/ol_sources/libra_coin.ported new file mode 100644 index 000000000..c91534669 --- /dev/null +++ b/framework/libra-framework/sources/ol_sources/libra_coin.ported @@ -0,0 +1,107 @@ +// libraCoin module original ported to update Move Lang v1.5 spec +module 0x1::LibraCoin { + use std::signer; + + // A representing the Libra coin + // The value of the coin. May be zero + struct LibraCoin has store { value: u64 } + + // A singleton that grants access to `LibraCoin.mint`. Only the Association has one. + struct MintCapability has store, key {} + + // The sum of the values of all LibraCoin resources in the system + struct MarketCap has store, key { total_value: u64 } + + // Return a reference to the MintCapability published under the sender's account. Fails if the + // sender does not have a MintCapability. + // Since only the Association account has a mint capability, this will only succeed if it is + // invoked by a transaction sent by that account. + public fun mint_with_default_capability(sender: &signer, amount: u64): LibraCoin acquires MintCapability, MarketCap { + mint(amount, borrow_global(signer::address_of(sender))) + } + + // Mint a new LibraCoin worth `value`. The caller must have a reference to a MintCapability. + // Only the Association account can acquire such a reference, and it can do so only via + // `borrow_sender_mint_capability` + public fun mint(value: u64, _capability: &MintCapability): LibraCoin acquires MarketCap { + // TODO: temporary measure for testnet only: limit minting to 1B Libra at a time. + // this is to prevent the market cap's total value from hitting u64_max due to excessive + // minting. This will not be a problem in the production Libra system because coins will + // be backed with real-world assets, and thus minting will be correspondingly rarer. + // * 1000000 because the unit is microlibra + assert!(value <= 1000000000 * 1000000, 11); + + // update market cap to reflect minting + let market_cap = borrow_global_mut(@0xA550C18); + market_cap.total_value = market_cap.total_value + value; + + LibraCoin { value } + } + + // This can only be invoked by the Association address, and only a single time. + // Currently, it is invoked in the genesis transaction + public fun initialize(sender: &signer) { + // Only callable by the Association address + assert!(signer::address_of(sender) == @0xA550C18, 1); + + move_to(sender, MintCapability{}); + move_to(sender, MarketCap { total_value: 0 }); + } + + // Return the total value of all Libra in the system + public fun market_cap(): u64 acquires MarketCap { + borrow_global(@0xA550C18).total_value + } + + // Create a new LibraCoin with a value of 0 + public fun zero(): LibraCoin { + LibraCoin { value: 0 } + } + + // Public accessor for the value of a coin + public fun value(coin: &LibraCoin): u64 { + coin.value + } + + // Splits the given coin into two and returns them both + // It leverages `Self.withdraw` for any verifications of the values + public fun split(coin: &mut LibraCoin, amount: u64): LibraCoin { + let other = withdraw(coin, amount); + other + } + + // "Divides" the given coin into two, where original coin is modified in place + // The original coin will have value = original value - `amount` + // The new coin will have a value = `amount` + // Fails if the coins value is less than `amount` + public fun withdraw(coin: &mut LibraCoin, amount: u64): LibraCoin { + // Check that `amount` is less than the coin's value + assert!(coin.value >= amount, 10); + // Split the coin + coin.value = value(coin) - amount; + LibraCoin { value: amount } + } + + // Merges two coins and returns a new coin whose value is equal to the sum of the two inputs + public fun join(coin1: &mut LibraCoin, coin2: LibraCoin) { + deposit(coin1, coin2); + } + + // "Merges" the two coins + // The coin passed in by reference will have a value equal to the sum of the two coins + // The `check` coin is consumed in the process + public fun deposit(coin: &mut LibraCoin, check: LibraCoin) { + let LibraCoin { value } = check; + coin.value = value(coin) + value + } + + // Destroy a coin + // Fails if the value is non-zero + // The amount of LibraCoin in the system is a tightly controlled property, + // so you cannot "burn" any non-zero amount of LibraCoin + public fun destroy_zero(coin: LibraCoin) { + let LibraCoin { value } = coin; + assert!(value == 0, 11) + } + +} \ No newline at end of file diff --git a/framework/libra-framework/sources/ol_sources/match_index.move b/framework/libra-framework/sources/ol_sources/match_index.move index 466470479..81492ca8d 100644 --- a/framework/libra-framework/sources/ol_sources/match_index.move +++ b/framework/libra-framework/sources/ol_sources/match_index.move @@ -2,7 +2,7 @@ module ol_framework::match_index { use diem_framework::system_addresses; use ol_framework::cumulative_deposits; - use ol_framework::gas_coin::LibraCoin as GasCoin; + use ol_framework::libra_coin::LibraCoin; use ol_framework::ol_account; use diem_framework::coin::{Self, Coin}; use diem_framework::transaction_fee; @@ -93,7 +93,7 @@ module ol_framework::match_index { /// the root account can take a user coin, and match with accounts in index. // Note, this leave NO REMAINDER, and burns any rounding. // TODO: When the coin is sent, an attribution is also made to the payer. - public fun match_and_recycle(vm: &signer, coin: &mut Coin) acquires MatchIndex { + public fun match_and_recycle(vm: &signer, coin: &mut Coin) acquires MatchIndex { match_impl(vm, coin); // if there is anything remaining it's a superman 3 issue @@ -110,7 +110,7 @@ module ol_framework::match_index { /// the root account can take a user coin, and match with accounts in index. // TODO: When the coin is sent, an attribution is also made to the payer. - fun match_impl(vm: &signer, coin: &mut Coin) acquires MatchIndex { + fun match_impl(vm: &signer, coin: &mut Coin) acquires MatchIndex { system_addresses::assert_ol(vm); let list = { get_address_list() }; // NOTE devs, the added scope drops the borrow which is used below. let len = vector::length
(&list); @@ -177,4 +177,4 @@ module ol_framework::match_index { calc_ratios(root, addr_list); } -} \ No newline at end of file +} diff --git a/framework/libra-framework/sources/ol_sources/mock.move b/framework/libra-framework/sources/ol_sources/mock.move index c48b39e57..115d71e01 100644 --- a/framework/libra-framework/sources/ol_sources/mock.move +++ b/framework/libra-framework/sources/ol_sources/mock.move @@ -15,7 +15,7 @@ module ol_framework::mock { use diem_framework::system_addresses; use ol_framework::epoch_boundary; use diem_framework::coin; - use ol_framework::gas_coin::{Self, LibraCoin as GasCoin}; + use ol_framework::libra_coin::{Self, LibraCoin}; use diem_framework::transaction_fee; use ol_framework::ol_account; use ol_framework::tower_state; @@ -153,7 +153,7 @@ module ol_framework::mock { genesis::test_end_genesis(root); let mint_cap = init_coin_impl(root); - gas_coin::restore_mint_cap(root, mint_cap); + libra_coin::restore_mint_cap(root, mint_cap); assert!(!chain_status::is_genesis(), 0); } @@ -164,7 +164,7 @@ module ol_framework::mock { let mint_cap = init_coin_impl(root); - gas_coin::restore_mint_cap(root, mint_cap); + libra_coin::restore_mint_cap(root, mint_cap); } #[test_only] @@ -173,8 +173,8 @@ module ol_framework::mock { system_addresses::assert_ol(root); - let mint_cap = if (coin::is_coin_initialized()) { - gas_coin::extract_mint_cap(root) + let mint_cap = if (coin::is_coin_initialized()) { + libra_coin::extract_mint_cap(root) } else { init_coin_impl(root) }; @@ -187,7 +187,7 @@ module ol_framework::mock { let c = coin::test_mint(amount, &mint_cap); ol_account::deposit_coins(*addr, c); - let b = coin::balance(*addr); + let b = coin::balance(*addr); assert!(b == amount, 0001); @@ -197,14 +197,14 @@ module ol_framework::mock { if (drip) { slow_wallet::slow_wallet_epoch_drip(root, amount); }; - gas_coin::restore_mint_cap(root, mint_cap); + libra_coin::restore_mint_cap(root, mint_cap); } #[test_only] - fun init_coin_impl(root: &signer): coin::MintCapability { + fun init_coin_impl(root: &signer): coin::MintCapability { system_addresses::assert_ol(root); - let (burn_cap, mint_cap) = gas_coin::initialize_for_test_without_aggregator_factory(root); + let (burn_cap, mint_cap) = libra_coin::initialize_for_test_without_aggregator_factory(root); coin::destroy_burn_cap(burn_cap); transaction_fee::initialize_fee_collection_and_distribution(root, 0); @@ -212,9 +212,9 @@ module ol_framework::mock { let initial_fees = 1000000 * 100; // coin scaling * 100 coins let tx_fees = coin::test_mint(initial_fees, &mint_cap); transaction_fee::vm_pay_fee(root, @ol_framework, tx_fees); - let supply_pre = gas_coin::supply(); + let supply_pre = libra_coin::supply(); assert!(supply_pre == initial_fees, ESUPPLY_MISMATCH); - gas_coin::test_set_final_supply(root, initial_fees); + libra_coin::test_set_final_supply(root, initial_fees); mint_cap } @@ -342,7 +342,7 @@ module ol_framework::mock { let _vals = genesis_n_vals(root, n_vals); // need to include eve to init funds let genesis_mint = 1000000; ol_initialize_coin_and_fund_vals(root, genesis_mint, true); - let supply_pre = gas_coin::supply(); + let supply_pre = libra_coin::supply(); let mocked_tx_fees = 1000000 * 100; assert!(supply_pre == mocked_tx_fees + (n_vals * genesis_mint), 73570001); } diff --git a/framework/libra-framework/sources/ol_sources/ol_account.move b/framework/libra-framework/sources/ol_sources/ol_account.move index 0c3ff1ae2..dc40a986c 100644 --- a/framework/libra-framework/sources/ol_sources/ol_account.move +++ b/framework/libra-framework/sources/ol_sources/ol_account.move @@ -12,7 +12,7 @@ module ol_framework::ol_account { use diem_std::math64; - use ol_framework::gas_coin::{Self, LibraCoin as GasCoin}; + use ol_framework::libra_coin::{Self, LibraCoin}; use ol_framework::slow_wallet; use ol_framework::receipts; use ol_framework::cumulative_deposits; @@ -81,13 +81,13 @@ module ol_framework::ol_account { /// A wrapper to create a resource account and register it to receive GAS. public fun ol_create_resource_account(user: &signer, seed: vector): (signer, account::SignerCapability) { let (resource_account_sig, cap) = account::create_resource_account(user, seed); - coin::register(&resource_account_sig); + coin::register(&resource_account_sig); (resource_account_sig, cap) } fun create_impl(auth_key: address) { let new_signer = account::create_account(auth_key); - coin::register(&new_signer); + coin::register(&new_signer); receipts::user_init(&new_signer); init_burn_tracker(&new_signer); } @@ -123,7 +123,7 @@ module ol_framework::ol_account { error::invalid_state(ECANT_MATCH_ADDRESS_IN_LOOKUP) ); - coin::register(&new_signer); + coin::register(&new_signer); init_burn_tracker(&new_signer); new_signer } @@ -175,7 +175,7 @@ module ol_framework::ol_account { /// Withdraw a coin while tracking the unlocked withdraw public fun withdraw_with_capability(cap: &WithdrawCapability, amount: u64): - Coin acquires BurnTracker { + Coin acquires BurnTracker { let payer = account::get_withdraw_cap_address(cap); let limit = slow_wallet::unlocked_amount(payer); assert!(amount < limit, error::invalid_state(EINSUFFICIENT_BALANCE)); @@ -190,7 +190,7 @@ module ol_framework::ol_account { } /// Withdraw funds while respecting the transfer limits - public fun withdraw(sender: &signer, amount: u64): Coin acquires + public fun withdraw(sender: &signer, amount: u64): Coin acquires BurnTracker { spec { assume !system_addresses::signer_is_ol_root(sender); @@ -198,7 +198,7 @@ module ol_framework::ol_account { }; // never abort when its a system address // if (system_addresses::signer_is_ol_root(sender)) return - // coin::zero(); // and VM needs to figure this out. + // coin::zero(); // and VM needs to figure this out. let addr = signer::address_of(sender); assert!(amount > 0, error::invalid_argument(EZERO_TRANSFER)); @@ -206,7 +206,7 @@ module ol_framework::ol_account { let limit = slow_wallet::unlocked_amount(addr); assert!(amount <= limit, error::invalid_state(EINSUFFICIENT_BALANCE)); slow_wallet::maybe_track_unlocked_withdraw(addr, amount); - let coin = coin::withdraw(sender, amount); + let coin = coin::withdraw(sender, amount); // the outgoing coins should trigger an update on this account // order matters here maybe_update_burn_tracker_impl(addr); @@ -226,7 +226,7 @@ module ol_framework::ol_account { // TODO: Check if Resource Accounts can register here, since they // may be created without any coin registration. - assert!(coin::is_account_registered(recipient), error::invalid_argument(EACCOUNT_NOT_REGISTERED_FOR_GAS)); + assert!(coin::is_account_registered(recipient), error::invalid_argument(EACCOUNT_NOT_REGISTERED_FOR_GAS)); // must track the slow wallet on both sides of the transfer slow_wallet::maybe_track_slow_transfer(payer, recipient, amount); @@ -249,12 +249,12 @@ module ol_framework::ol_account { system_addresses::assert_ol(vm); let amount_transferred = 0; // should not halt - if (!coin::is_account_registered(from)) return (0, false); - if (!coin::is_account_registered(to)) return (0, false); + if (!coin::is_account_registered(from)) return (0, false); + if (!coin::is_account_registered(to)) return (0, false); - if(amount > coin::balance(from)) return (0, false); + if(amount > coin::balance(from)) return (0, false); - let coin_option = coin::vm_withdraw(vm, from, amount); + let coin_option = coin::vm_withdraw(vm, from, amount); if (option::is_some(&coin_option)) { let c = option::extract(&mut coin_option); @@ -279,35 +279,35 @@ module ol_framework::ol_account { #[test_only] public fun test_vm_withdraw(vm: &signer, from: address, amount: u64): - Option> acquires BurnTracker { + Option> acquires BurnTracker { system_addresses::assert_ol(vm); // should not halt - if (!coin::is_account_registered(from)) return option::none(); - if(amount > coin::balance(from)) return option::none(); + if (!coin::is_account_registered(from)) return option::none(); + if(amount > coin::balance(from)) return option::none(); maybe_update_burn_tracker_impl(from); - coin::vm_withdraw(vm, from, amount) + coin::vm_withdraw(vm, from, amount) } /// vm can transfer between account to settle. /// THIS FUNCTION CAN BYPASS SLOW WALLET WITHDRAW RESTRICTIONS /// used to withdraw and track the withdrawal public(friend) fun vm_withdraw_unlimited(vm: &signer, from: address, amount: - u64): Option> acquires + u64): Option> acquires BurnTracker { system_addresses::assert_ol(vm); // should not halt - if(amount > coin::balance(from)) return option::none(); + if(amount > coin::balance(from)) return option::none(); // since the VM can withdraw more than what is unlocked // it needs to adjust the unlocked amount, which may end up zero // if it goes over the limit - let c_opt = coin::vm_withdraw(vm, from, amount); + let c_opt = coin::vm_withdraw(vm, from, amount); // we're not always sure what's in the option if (option::is_some(&c_opt)) { let coin = option::borrow(&c_opt); - let value = coin::value(coin); + let value = coin::value(coin); if (value > 0) { maybe_update_burn_tracker_impl(from); slow_wallet::maybe_track_unlocked_withdraw(from, value); @@ -318,14 +318,14 @@ module ol_framework::ol_account { } - // public fun withdraw_with_capability(cap: &WithdrawCapability, amount: u64): Coin { + // public fun withdraw_with_capability(cap: &WithdrawCapability, amount: u64): Coin { // coin::withdraw_with_capability(cap, amount) // } //////// 0L //////// #[view] - /// return the GasCoin balance as tuple (unlocked, total) + /// return the LibraCoin balance as tuple (unlocked, total) // TODO v7: consolidate balance checks here, not in account, slow_wallet, or coin public fun balance(addr: address): (u64, u64) { slow_wallet::balance(addr) @@ -338,7 +338,7 @@ module ol_framework::ol_account { let (_, unscaled_value) = balance(owner); if (unscaled_value == 0) return (0,0); - let decimal_places = coin::decimals(); + let decimal_places = coin::decimals(); let scaling = math64::pow(10, (decimal_places as u64)); let value = fixed_point32::create_from_rational(unscaled_value, scaling); // multply will TRUNCATE. @@ -356,9 +356,9 @@ module ol_framework::ol_account { if (exists(addr)) return; let prev_supply = if (chain_status::is_genesis()) { - gas_coin::get_final_supply() + libra_coin::get_final_supply() } else { - gas_coin::supply() + libra_coin::supply() }; let (_, current_user_balance) = balance(addr); @@ -384,8 +384,8 @@ module ol_framework::ol_account { // 1. how much burn happened in between // this must be true but we // don't abort since the VM may be calling this - let current_supply = gas_coin::supply(); - let original_supply = gas_coin::get_final_supply(); + let current_supply = libra_coin::supply(); + let original_supply = libra_coin::get_final_supply(); if (original_supply > current_supply) { // update if there was a change in supply let burn_in_period = original_supply - current_supply; @@ -435,31 +435,31 @@ module ol_framework::ol_account { /// A coin which is split or extracted can be sent to an account without a sender signing. /// TODO: cumulative tracker will not work here. - public fun deposit_coins(to: address, coins: Coin) acquires + public fun deposit_coins(to: address, coins: Coin) acquires BurnTracker { - assert!(coin::is_account_registered(to), error::invalid_state(EACCOUNT_NOT_REGISTERED_FOR_GAS)); + assert!(coin::is_account_registered(to), error::invalid_state(EACCOUNT_NOT_REGISTERED_FOR_GAS)); slow_wallet::maybe_track_unlocked_deposit(to, coin::value(&coins)); - coin::deposit(to, coins); + coin::deposit(to, coins); // the incoming coins should trigger an update in tracker maybe_update_burn_tracker_impl(to); } /// for validator rewards and community wallet transfers, /// the SlowWallet.unlocked DOES NOT get updated. - public fun vm_deposit_coins_locked(vm: &signer, to: address, coins: Coin) acquires + public fun vm_deposit_coins_locked(vm: &signer, to: address, coins: Coin) acquires BurnTracker { system_addresses::assert_ol(vm); - assert!(coin::is_account_registered(to), error::invalid_state(EACCOUNT_NOT_REGISTERED_FOR_GAS)); - coin::deposit(to, coins); + assert!(coin::is_account_registered(to), error::invalid_state(EACCOUNT_NOT_REGISTERED_FOR_GAS)); + coin::deposit(to, coins); // the incoming coins should trigger an update in tracker maybe_update_burn_tracker_impl(to); } // pass through function to guard the use of Coin - public fun merge_coins(dst_coin: &mut Coin, source_coin: Coin) { + public fun merge_coins(dst_coin: &mut Coin, source_coin: Coin) { // TODO: check it this is true: no tracking on merged coins since they are always withdrawn, and are a hot potato that might deposit later. // slow_wallet::maybe_track_unlocked_deposit(to, coin::value(&coins)); - coin::merge(dst_coin, source_coin); + coin::merge(dst_coin, source_coin); } @@ -469,7 +469,7 @@ module ol_framework::ol_account { public fun assert_account_is_registered_for_gas(addr: address) { assert_account_exists(addr); - assert!(coin::is_account_registered(addr), error::not_found(EACCOUNT_NOT_REGISTERED_FOR_GAS)); + assert!(coin::is_account_registered(addr), error::not_found(EACCOUNT_NOT_REGISTERED_FOR_GAS)); } /// Set whether `account` can receive direct transfers of coins that they have not explicitly registered to receive. @@ -535,18 +535,18 @@ module ol_framework::ol_account { let carol = from_bcs::to_address(x"00000000000000000000000000000000000000000000000000000000000ca501"); let (burn_cap, mint_cap) = - ol_framework::gas_coin::initialize_for_test(core); - gas_coin::test_set_final_supply(root, 1000); // dummy to prevent fail + ol_framework::libra_coin::initialize_for_test(core); + libra_coin::test_set_final_supply(root, 1000); // dummy to prevent fail create_account(root, signer::address_of(alice)); create_account(root, bob); create_account(root, carol); coin::deposit(signer::address_of(alice), coin::mint(10000, &mint_cap)); transfer(alice, bob, 500); - assert!(coin::balance(bob) == 500, 0); + assert!(coin::balance(bob) == 500, 0); transfer(alice, carol, 500); - assert!(coin::balance(carol) == 500, 1); + assert!(coin::balance(carol) == 500, 1); transfer(alice, carol, 1500); - assert!(coin::balance(carol) == 2000, 2); + assert!(coin::balance(carol) == 2000, 2); coin::destroy_burn_cap(burn_cap); coin::destroy_mint_cap(mint_cap); @@ -559,13 +559,13 @@ module ol_framework::ol_account { let resource_acc_addr = signer::address_of(&resource_account); let (burn_cap, mint_cap) = - ol_framework::gas_coin::initialize_for_test(core); - gas_coin::test_set_final_supply(root, 1000); // dummy to prevent fail + ol_framework::libra_coin::initialize_for_test(core); + libra_coin::test_set_final_supply(root, 1000); // dummy to prevent fail create_account(root, signer::address_of(alice)); coin::deposit(signer::address_of(alice), coin::mint(10000, &mint_cap)); transfer(alice, resource_acc_addr, 500); - assert!(coin::balance(resource_acc_addr) == 500, 1); + assert!(coin::balance(resource_acc_addr) == 500, 1); coin::destroy_burn_cap(burn_cap); coin::destroy_mint_cap(mint_cap); @@ -575,8 +575,8 @@ module ol_framework::ol_account { public fun test_batch_transfer(root: &signer, from: &signer, core: &signer, recipient_1: &signer, recipient_2: &signer) acquires BurnTracker{ let (burn_cap, mint_cap) = - diem_framework::gas_coin::initialize_for_test(core); - gas_coin::test_set_final_supply(root, 1000); // dummy to prevent fail + diem_framework::libra_coin::initialize_for_test(core); + libra_coin::test_set_final_supply(root, 1000); // dummy to prevent fail create_account(root, signer::address_of(from)); let recipient_1_addr = signer::address_of(recipient_1); @@ -589,8 +589,8 @@ module ol_framework::ol_account { vector[recipient_1_addr, recipient_2_addr], vector[100, 500], ); - assert!(coin::balance(recipient_1_addr) == 100, 0); - assert!(coin::balance(recipient_2_addr) == 500, 1); + assert!(coin::balance(recipient_1_addr) == 100, 0); + assert!(coin::balance(recipient_2_addr) == 500, 1); coin::destroy_burn_cap(burn_cap); coin::destroy_mint_cap(mint_cap); } @@ -650,10 +650,10 @@ module ol_framework::ol_account { public fun test_set_allow_direct_coin_transfers(root: &signer, user: &signer) acquires DirectTransferConfig { let addr = signer::address_of(user); - let (b, m) = gas_coin::initialize_for_test(root); + let (b, m) = libra_coin::initialize_for_test(root); coin::destroy_burn_cap(b); coin::destroy_mint_cap(m); - gas_coin::test_set_final_supply(root, 1000); // dummy to prevent fail + libra_coin::test_set_final_supply(root, 1000); // dummy to prevent fail create_account(root, addr); set_allow_direct_coin_transfers(user, true); diff --git a/framework/libra-framework/sources/ol_sources/ol_account.spec.move b/framework/libra-framework/sources/ol_sources/ol_account.spec.move index e78a0c0bb..dd658efa6 100644 --- a/framework/libra-framework/sources/ol_sources/ol_account.spec.move +++ b/framework/libra-framework/sources/ol_sources/ol_account.spec.move @@ -2,8 +2,8 @@ spec ol_framework::ol_account { spec module { pragma verify = true; // pragma aborts_if_is_strict; - invariant [suspendable] chain_status::is_operating() ==> exists(@diem_framework); - invariant [suspendable] chain_status::is_operating() ==> exists>(@diem_framework); + invariant [suspendable] chain_status::is_operating() ==> exists(@diem_framework); + invariant [suspendable] chain_status::is_operating() ==> exists>(@diem_framework); } @@ -13,7 +13,7 @@ spec ol_framework::ol_account { // spec create_account(auth_key: address) { // include CreateAccountAbortsIf; // ensures exists(auth_key); - // ensures exists>(auth_key); + // ensures exists>(auth_key); // } spec schema CreateAccountAbortsIf { auth_key: address; @@ -30,13 +30,13 @@ spec ol_framework::ol_account { } // ol_account::withdraw can never use more than the slow wallet limit - spec withdraw(sender: &signer, amount: u64): Coin{ + spec withdraw(sender: &signer, amount: u64): Coin{ include AssumeCoinRegistered; let account_addr = signer::address_of(sender); aborts_if amount == 0; - let coin_store = global>(account_addr); + let coin_store = global>(account_addr); let balance = coin_store.coin.value; aborts_if balance < amount; @@ -46,13 +46,13 @@ spec ol_framework::ol_account { aborts_if exists(account_addr) && slow_store.unlocked < amount; - ensures result == Coin{value: amount}; + ensures result == Coin{value: amount}; } spec schema AssumeCoinRegistered { sender: &signer; let account_addr = signer::address_of(sender); - aborts_if !coin::is_account_registered(account_addr); + aborts_if !coin::is_account_registered(account_addr); } spec assert_account_exists(addr: address) { @@ -60,10 +60,10 @@ spec ol_framework::ol_account { } /// Check if the address existed. - /// Check if the GasCoin under the address existed. + /// Check if the LibraCoin under the address existed. spec assert_account_is_registered_for_gas(addr: address) { aborts_if !account::exists_at(addr); - aborts_if !coin::is_account_registered(addr); + aborts_if !coin::is_account_registered(addr); } spec set_allow_direct_coin_transfers(account: &signer, allow: bool) { diff --git a/framework/libra-framework/sources/ol_sources/oracle.move b/framework/libra-framework/sources/ol_sources/oracle.move index 831a3a613..36429916c 100644 --- a/framework/libra-framework/sources/ol_sources/oracle.move +++ b/framework/libra-framework/sources/ol_sources/oracle.move @@ -12,7 +12,7 @@ module ol_framework::oracle { use diem_framework::event::{Self, EventHandle}; use diem_framework::coin::{Self, Coin}; use ol_framework::ol_account; - use ol_framework::gas_coin::LibraCoin as GasCoin; + use ol_framework::libra_coin::LibraCoin; use ol_framework::globals; use ol_framework::vouch; use ol_framework::epoch_helper; @@ -263,7 +263,7 @@ module ol_framework::oracle { } } - public(friend) fun epoch_boundary(root: &signer, budget: &mut Coin): (u64, u64) acquires GlobalCounter, ProviderList, Tower { + public(friend) fun epoch_boundary(root: &signer, budget: &mut Coin): (u64, u64) acquires GlobalCounter, ProviderList, Tower { let (provider_count, paid_amount ) = epoch_reward(root, budget); reset_counters(root); (provider_count, paid_amount) @@ -285,15 +285,13 @@ module ol_framework::oracle { /// successful miners. /// returns: provider_list_len total_deposited /// - fun epoch_reward(root: &signer, budget: &mut Coin): (u64, u64) acquires ProviderList, Tower { + fun epoch_reward(root: &signer, budget: &mut Coin): (u64, u64) acquires ProviderList, Tower { system_addresses::assert_ol(root); - // print(&666666); let coin_value = coin::value(budget); - // print(&coin_value); let provider_list = borrow_global_mut(@ol_framework).current_above_threshold; - // print(&provider_list); + let len = vector::length(&provider_list); if (len == 0) return (0, 0); diff --git a/framework/libra-framework/sources/ol_sources/pledge_accounts.move b/framework/libra-framework/sources/ol_sources/pledge_accounts.move index cfd77a1d1..ec030d6f7 100644 --- a/framework/libra-framework/sources/ol_sources/pledge_accounts.move +++ b/framework/libra-framework/sources/ol_sources/pledge_accounts.move @@ -44,7 +44,7 @@ use std::error; use std::option::{Self, Option}; use std::fixed_point64; - use ol_framework::gas_coin::LibraCoin as GasCoin; + use ol_framework::libra_coin::LibraCoin; use ol_framework::ol_account; use ol_framework::epoch_helper; use ol_framework::burn; @@ -69,7 +69,7 @@ // project_id: vector, // a string that identifies the project address_of_beneficiary: address, // the address of the project, also where the BeneficiaryPolicy is stored for reference. amount: u64, - pledge: coin::Coin, + pledge: coin::Coin, epoch_of_last_deposit: u64, lifetime_pledged: u64, lifetime_withdrawn: u64 @@ -142,7 +142,7 @@ public fun save_pledge( sig: &signer, address_of_beneficiary: address, - pledge: coin::Coin + pledge: coin::Coin ) acquires MyPledges, BeneficiaryPolicy { maybe_initialize_my_pledges(sig); assert!(exists(address_of_beneficiary), error::invalid_state(ENO_BENEFICIARY_POLICY)); @@ -159,7 +159,7 @@ vm: &signer, pledger: address, address_of_beneficiary: address, - pledge: &mut coin::Coin + pledge: &mut coin::Coin ) acquires MyPledges, BeneficiaryPolicy { system_addresses::assert_ol(vm); assert!(exists(address_of_beneficiary), error::invalid_state(ENO_BENEFICIARY_POLICY)); @@ -178,7 +178,7 @@ sig: &signer, // project_id: vector, address_of_beneficiary: address, - init_pledge: coin::Coin, + init_pledge: coin::Coin, ) acquires MyPledges, BeneficiaryPolicy { let account = signer::address_of(sig); maybe_initialize_my_pledges(sig); @@ -204,7 +204,7 @@ // add funds to an existing pledge account // Note: only funds that are Unlocked and otherwise unrestricted can be used in pledge account. - fun add_coin_to_pledge_account(sender_addr: address, idx: u64, coin: coin::Coin) acquires MyPledges, BeneficiaryPolicy { + fun add_coin_to_pledge_account(sender_addr: address, idx: u64, coin: coin::Coin) acquires MyPledges, BeneficiaryPolicy { // let sender_addr = signer::address_of(sender); // let (found, _idx) = pledge_at_idx(&sender_addr, &address_of_beneficiary); let amount = coin::value(&coin); @@ -231,24 +231,24 @@ } // withdraw an amount from all pledge accounts. Check first that there are remaining funds before attempting to withdraw. - public fun withdraw_from_all_pledge_accounts(sig_beneficiary: &signer, amount: u64): option::Option> acquires MyPledges, BeneficiaryPolicy { + public fun withdraw_from_all_pledge_accounts(sig_beneficiary: &signer, amount: u64): option::Option> acquires MyPledges, BeneficiaryPolicy { let address_of_beneficiary = signer::address_of(sig_beneficiary); if (!exists(address_of_beneficiary)) { - return option::none>() + return option::none>() }; let pledgers = *&borrow_global(address_of_beneficiary).pledgers; let amount_available = *&borrow_global(address_of_beneficiary).amount_available; if (amount_available == 0 || amount == 0) { - return option::none>() + return option::none>() }; let pct_withdraw = fixed_point64::create_from_rational((amount as u128), (amount_available as u128)); let i = 0; - let all_coins = option::none>(); + let all_coins = option::none>(); while (i < vector::length(&pledgers)) { let pledge_account = *vector::borrow(&pledgers, i); // DANGER: this is a private function that changes balances. @@ -288,7 +288,7 @@ // this is to be used for funding, // but also for revoking a pledge // WARN: we must know there is a coin at this account before calling it. - fun withdraw_from_one_pledge_account(address_of_beneficiary: &address, payer: &address, amount: u64): option::Option> acquires MyPledges, BeneficiaryPolicy { + fun withdraw_from_one_pledge_account(address_of_beneficiary: &address, payer: &address, amount: u64): option::Option> acquires MyPledges, BeneficiaryPolicy { let (found, idx) = pledge_at_idx(payer, address_of_beneficiary); @@ -331,10 +331,10 @@ // this is to be used for funding, // but also for revoking a pledge // WARN: we must know there is a coin at this account before calling it. - fun withdraw_pct_from_one_pledge_account(address_of_beneficiary: &address, payer: &address, pct: &fixed_point64::FixedPoint64):Option> acquires MyPledges, BeneficiaryPolicy { + fun withdraw_pct_from_one_pledge_account(address_of_beneficiary: &address, payer: &address, pct: &fixed_point64::FixedPoint64):Option> acquires MyPledges, BeneficiaryPolicy { let (found, idx) = pledge_at_idx(payer, address_of_beneficiary); - if (!found) return option::none>(); // don't error on functions called by VM. + if (!found) return option::none>(); // don't error on functions called by VM. let pledge_state = borrow_global_mut(*payer); @@ -343,14 +343,14 @@ let user_pledged_balance = (pledge_account.amount as u128); if (user_pledged_balance == 0) { - return option::none>() + return option::none>() }; let amount_withdraw = fixed_point64::multiply_u128(user_pledged_balance, *pct); if (amount_withdraw == 0) { - return option::none>() + return option::none>() }; if (user_pledged_balance >= amount_withdraw) { @@ -494,7 +494,7 @@ //// Genesis helper // private function only to be used at genesis for infra escrow // This used only at genesis, and CAN BYPASS THE WITHDRAW LIMITS - public fun genesis_infra_escrow_pledge(root: &signer, account: &signer, coin: Coin) acquires MyPledges, BeneficiaryPolicy { + public fun genesis_infra_escrow_pledge(root: &signer, account: &signer, coin: Coin) acquires MyPledges, BeneficiaryPolicy { // TODO: add genesis time here, once the timestamp genesis issue is fixed. // chain_status::assert_genesis(); system_addresses::assert_ol(root); @@ -514,7 +514,7 @@ // Danger: If the VM calls this and there is an error there will be a halt. // always call pledge_at_idx() first. // NOTE: cannot wrap in option witout changing the struct abilities to copy, drop. - // can't do that because Diem cannot be copy, or drop. + // can't do that because Diem cannot be copy, or drop. // public fun maybe_find_a_pledge(account: &address, address_of_beneficiary: &address): &mut PledgeAccount acquires MyPledges { // let (found, idx) = pledge_at_idx(account, address_of_beneficiary); // assert!(found, error::invalid_state(ENO_PLEDGE_INIT)); @@ -623,10 +623,9 @@ //////// TEST HELPERS /////// #[test_only] // Danger! withdraws from an account. - public fun test_single_withdrawal(vm: &signer, bene: &address, donor: &address, amount: u64): option::Option> acquires MyPledges, BeneficiaryPolicy{ + public fun test_single_withdrawal(vm: &signer, bene: &address, donor: &address, amount: u64): option::Option> acquires MyPledges, BeneficiaryPolicy{ system_addresses::assert_ol(vm); // testnet::assert_testnet(vm); withdraw_from_one_pledge_account(bene, donor, amount) } } - diff --git a/framework/libra-framework/sources/ol_sources/rewards.move b/framework/libra-framework/sources/ol_sources/rewards.move index 2359072cb..c9df9ff27 100644 --- a/framework/libra-framework/sources/ol_sources/rewards.move +++ b/framework/libra-framework/sources/ol_sources/rewards.move @@ -4,7 +4,7 @@ module ol_framework::rewards { use diem_framework::coin::{Self, Coin}; use diem_framework::stake; use diem_framework::system_addresses; - use ol_framework::gas_coin::LibraCoin as GasCoin; + use ol_framework::libra_coin::LibraCoin; use ol_framework::ol_account; // use diem_std::debug::print; @@ -17,7 +17,7 @@ module ol_framework::rewards { /// process a single reward /// root needs to have an owned coin already extracted. Not a mutable borrow. - public(friend) fun process_single(root: &signer, addr: address, coin: Coin, reward_type: u8) { + public(friend) fun process_single(root: &signer, addr: address, coin: Coin, reward_type: u8) { system_addresses::assert_ol(root); pay_reward(root, addr, coin, reward_type); } @@ -26,7 +26,7 @@ module ol_framework::rewards { /// convenience function to process payment for multiple recipients /// when the reward is the same for all recipients. // belt and suspenders pattern: guarded by friend, authorized by root, and public function separated from authorized private function. yes, it's redundant, see ol_move_coding_conventions.md - public(friend) fun process_multiple(root: &signer, list: vector
, reward_per: u64, reward_budget: &mut Coin, reward_type: u8) { + public(friend) fun process_multiple(root: &signer, list: vector
, reward_per: u64, reward_budget: &mut Coin, reward_type: u8) { // note the mutable coin will be retuned to caller for them to do what // is necessary, including destroying if it is zero. @@ -38,7 +38,7 @@ module ol_framework::rewards { /// process all the validators // belt and suspenders - fun process_recipients_impl(root: &signer, list: vector
, reward_per: u64, reward_budget: &mut Coin, reward_type: u8) { + fun process_recipients_impl(root: &signer, list: vector
, reward_per: u64, reward_budget: &mut Coin, reward_type: u8) { // note the mutable coin will be retuned to caller for them to do what // is necessary, including destroying if it is zero. system_addresses::assert_ol(root); @@ -55,7 +55,7 @@ module ol_framework::rewards { /// Pay one validator their reward /// belt and suspenders - fun pay_reward(root: &signer, addr: address, coin: Coin, reward_type: u8) { + fun pay_reward(root: &signer, addr: address, coin: Coin, reward_type: u8) { // draw from transaction fees account // transaction fees account should have a subsidy from infra escrow // from start of epoch. @@ -81,14 +81,14 @@ module ol_framework::rewards { #[test_only] /// helps create a payment to a validator // belt and suspenders too - public fun test_helper_pay_reward(root: &signer, addr: address, coin: Coin, reward_type: u8) { + public fun test_helper_pay_reward(root: &signer, addr: address, coin: Coin, reward_type: u8) { use ol_framework::testnet; testnet::assert_testnet(root); pay_reward(root, addr, coin, reward_type); } #[test_only] - public fun test_process_recipients(root: &signer, list: vector
, reward_per: u64, coin: &mut Coin, reward_type: u8) { + public fun test_process_recipients(root: &signer, list: vector
, reward_per: u64, coin: &mut Coin, reward_type: u8) { system_addresses::assert_ol(root); process_multiple(root, list, reward_per, coin, reward_type); diff --git a/framework/libra-framework/sources/ol_sources/safe.move b/framework/libra-framework/sources/ol_sources/safe.move index c0e8d71b2..db166ac74 100644 --- a/framework/libra-framework/sources/ol_sources/safe.move +++ b/framework/libra-framework/sources/ol_sources/safe.move @@ -50,7 +50,7 @@ module ol_framework::safe { use diem_framework::account::WithdrawCapability; use diem_framework::coin; use ol_framework::ol_account; - use ol_framework::gas_coin::LibraCoin as GasCoin; + use ol_framework::libra_coin::LibraCoin; use ol_framework::multi_action; use ol_framework::system_addresses; use ol_framework::transaction_fee; @@ -194,7 +194,7 @@ module ol_framework::safe { let pct = fixed_point32::create_from_rational(reg.fee, PERCENT_SCALE); - let fee = fixed_point32::multiply_u64(coin::balance(*multi_sig_addr), pct); + let fee = fixed_point32::multiply_u64(coin::balance(*multi_sig_addr), pct); expected_fees = expected_fees + fee; let coin_opt = ol_account::vm_withdraw_unlimited(vm, *multi_sig_addr, fee); @@ -212,5 +212,3 @@ module ol_framework::safe { (security_bill_count, security_bill_amount, success) } } - - diff --git a/framework/libra-framework/sources/ol_sources/slow_wallet.move b/framework/libra-framework/sources/ol_sources/slow_wallet.move index b5e2ba919..ce0c9dc48 100644 --- a/framework/libra-framework/sources/ol_sources/slow_wallet.move +++ b/framework/libra-framework/sources/ol_sources/slow_wallet.move @@ -13,7 +13,7 @@ module ol_framework::slow_wallet { use diem_framework::system_addresses; use diem_framework::coin; use diem_framework::account; - use ol_framework::gas_coin::LibraCoin as GasCoin; + use ol_framework::libra_coin::LibraCoin; use ol_framework::testnet; use ol_framework::sacred_cows; @@ -110,7 +110,7 @@ module ol_framework::slow_wallet { if (!exists(signer::address_of(sig))) { move_to(sig, SlowWallet { - unlocked: coin::balance(addr), + unlocked: coin::balance(addr), transferred: 0, }); } @@ -131,7 +131,7 @@ module ol_framework::slow_wallet { let i = 0; while (i < len) { let addr = vector::borrow
(&list, i); - let user_balance = coin::balance(*addr); + let user_balance = coin::balance(*addr); if (!exists(*addr)) continue; // NOTE: formal verifiction caught // this, not sure how it's possible @@ -239,7 +239,7 @@ module ol_framework::slow_wallet { /// helper to get the unlocked and total balance. (unlocked, total) public(friend) fun balance(addr: address): (u64, u64) acquires SlowWallet{ // this is a normal account, so return the normal balance - let total = coin::balance(addr); + let total = coin::balance(addr); if (exists(addr)) { let s = borrow_global(addr); return (s.unlocked, total) @@ -259,7 +259,7 @@ module ol_framework::slow_wallet { return s.unlocked }; - coin::balance(addr) + coin::balance(addr) } #[view] diff --git a/framework/libra-framework/sources/ol_sources/tests/burn.test.move b/framework/libra-framework/sources/ol_sources/tests/burn.test.move index b7b6b96e9..f5bb4c8bc 100644 --- a/framework/libra-framework/sources/ol_sources/tests/burn.test.move +++ b/framework/libra-framework/sources/ol_sources/tests/burn.test.move @@ -2,7 +2,7 @@ #[test_only] module ol_framework::test_burn { use ol_framework::mock; - use ol_framework::gas_coin; + use ol_framework::libra_coin; use ol_framework::ol_account; use ol_framework::match_index; use ol_framework::burn; @@ -23,12 +23,12 @@ module ol_framework::test_burn { fun burn_reduces_supply(root: &signer, alice: &signer) { mock::genesis_n_vals(root, 1); mock::ol_initialize_coin_and_fund_vals(root, 10000, true); - let supply_pre = gas_coin::supply(); + let supply_pre = libra_coin::supply(); let alice_burn = 5; let c = ol_account::withdraw(alice, alice_burn); burn::burn_and_track(c); - let supply = gas_coin::supply(); + let supply = libra_coin::supply(); assert!(supply == (supply_pre - alice_burn), 7357001); } @@ -174,7 +174,7 @@ module ol_framework::test_burn { let genesis_mint = 1000000; // 1 coin per let epoch_reward = genesis_mint; // just to be explicit mock::ol_initialize_coin_and_fund_vals(root, genesis_mint, true); - let supply_pre = gas_coin::supply(); + let supply_pre = libra_coin::supply(); let mocked_tx_fees = 1000000 * 100; // 100 coins in tx fee account // 105 coins total assert!(supply_pre == mocked_tx_fees + (n_vals * genesis_mint), 73570001); @@ -197,7 +197,7 @@ module ol_framework::test_burn { // So the current supply should be lower, // The the old supply was reduced by what was burned (the excess in tx bucket) - let supply_post = gas_coin::supply(); + let supply_post = libra_coin::supply(); assert!(supply_post == supply_pre - amount_burned_excess_tx_account, 73570003); @@ -278,14 +278,13 @@ module ol_framework::test_burn { // TransactionFee::pay_fee_and_track(@Alice, coin); // let fee_makers = TransactionFee::get_fee_makers(); - // // print(&fee_makers); // assert!(Vector::length(&fee_makers)==1, 735702); // assert!(TransactionFee::get_fees_collected()==1, 735703); // } #[test(root=@ol_framework, alice=@0x1000a)] fun track_fees(root: &signer, alice: address) { - // use ol_framework::gas_coin; + // use ol_framework::libra_coin; let _vals = mock::genesis_n_vals(root, 1); // need to include eve to init funds mock::ol_initialize_coin_and_fund_vals(root, 10000, true); @@ -388,4 +387,4 @@ module ol_framework::test_burn { assert!(cumu_burn_2 > cumu_burn, 7357010); } -} \ No newline at end of file +} diff --git a/framework/libra-framework/sources/ol_sources/tests/migration.test.move b/framework/libra-framework/sources/ol_sources/tests/migration.test.move index a09954a9b..ebbc026bb 100644 --- a/framework/libra-framework/sources/ol_sources/tests/migration.test.move +++ b/framework/libra-framework/sources/ol_sources/tests/migration.test.move @@ -7,7 +7,7 @@ module ol_framework::test_migration { use std::fixed_point32; use ol_framework::mock; use diem_framework::coin; - use ol_framework::gas_coin::LibraCoin as GasCoin; + use ol_framework::libra_coin::LibraCoin; use std::signer; use std::bcs; @@ -44,7 +44,7 @@ module ol_framework::test_migration { init_balance, ); - let user_balance = coin::balance(addr); + let user_balance = coin::balance(addr); assert!(user_balance == init_balance, 73570000); @@ -74,7 +74,7 @@ module ol_framework::test_migration { assert!(all_pledge_balance == user_pledge, 73570005); - let updated_balance = coin::balance(addr); + let updated_balance = coin::balance(addr); assert!((updated_balance + user_pledge) == init_balance, 73570006); } diff --git a/framework/libra-framework/sources/ol_sources/tests/rewards.test.move b/framework/libra-framework/sources/ol_sources/tests/rewards.test.move index 51cac5be0..12639bfe6 100644 --- a/framework/libra-framework/sources/ol_sources/tests/rewards.test.move +++ b/framework/libra-framework/sources/ol_sources/tests/rewards.test.move @@ -3,7 +3,7 @@ module ol_framework::test_rewards { use diem_framework::coin; use diem_framework::stake; use ol_framework::burn; - use ol_framework::gas_coin::{Self, LibraCoin as GasCoin}; + use ol_framework::libra_coin::{Self, LibraCoin}; use ol_framework::mock; use ol_framework::rewards; @@ -15,7 +15,7 @@ module ol_framework::test_rewards { let alice = @0x1000a; mock::genesis_n_vals(&root, 1); - let mint_cap = gas_coin::extract_mint_cap(&root); + let mint_cap = libra_coin::extract_mint_cap(&root); let uid_before = stake::get_reward_event_guid(alice); @@ -27,7 +27,7 @@ module ol_framework::test_rewards { let uid_after = stake::get_reward_event_guid(alice); assert!(uid_after > uid_before, 7357001); - let b = coin::balance(alice); + let b = coin::balance(alice); assert!(b == 10000, 7357002); } @@ -38,7 +38,7 @@ module ol_framework::test_rewards { let dave = @0x1000d; let vals = mock::genesis_n_vals(root, 4); - let mint_cap = gas_coin::extract_mint_cap(root); + let mint_cap = libra_coin::extract_mint_cap(root); let uid_before = stake::get_reward_event_guid(dave); assert!(uid_before == 0, 7357000); let new_coin = coin::test_mint(10000, &mint_cap); @@ -50,10 +50,10 @@ module ol_framework::test_rewards { let uid_after = stake::get_reward_event_guid(dave); assert!(uid_after > uid_before, 7357001); - let b = coin::balance(alice); + let b = coin::balance(alice); assert!(b == 1000, 7357002); - let b = coin::balance(dave); + let b = coin::balance(dave); assert!(b == 1000, 7357002); burn::burn_and_track(new_coin); diff --git a/framework/libra-framework/sources/ol_sources/tests/slow_wallet.test.move b/framework/libra-framework/sources/ol_sources/tests/slow_wallet.test.move index 064eef7b3..4ff4fc9c3 100644 --- a/framework/libra-framework/sources/ol_sources/tests/slow_wallet.test.move +++ b/framework/libra-framework/sources/ol_sources/tests/slow_wallet.test.move @@ -7,7 +7,7 @@ module ol_framework::test_slow_wallet { use ol_framework::slow_wallet; use ol_framework::mock; use ol_framework::ol_account; - use ol_framework::gas_coin::{Self, LibraCoin as GasCoin}; + use ol_framework::libra_coin::{Self, LibraCoin}; use ol_framework::epoch_boundary; use diem_framework::reconfiguration; use diem_framework::coin; @@ -62,7 +62,7 @@ module ol_framework::test_slow_wallet { #[test(root = @ol_framework, alice = @0x123, bob = @0x456)] fun test_transfer_unlocked_happy(root: signer, alice: signer) { mock::ol_test_genesis(&root); - let mint_cap = gas_coin::extract_mint_cap(&root); + let mint_cap = libra_coin::extract_mint_cap(&root); slow_wallet::initialize(&root); @@ -84,7 +84,7 @@ module ol_framework::test_slow_wallet { // transferring funds will create Bob's account // the coins are also unlocked ol_account::transfer(&alice, @0x456, 10); - let b_balance = coin::balance(@0x456); + let b_balance = coin::balance(@0x456); assert!(b_balance == 10, 735704); assert!(slow_wallet::unlocked_amount(@0x456) == 10, 735705); } @@ -94,7 +94,7 @@ module ol_framework::test_slow_wallet { #[expected_failure(abort_code = 196614, location = 0x1::ol_account)] fun test_transfer_sad(root: signer, alice: signer) { mock::ol_test_genesis(&root); - let mint_cap = gas_coin::extract_mint_cap(&root); + let mint_cap = libra_coin::extract_mint_cap(&root); slow_wallet::initialize(&root); ol_account::create_account(&root, @0x123); slow_wallet::set_slow(&alice); @@ -102,7 +102,7 @@ module ol_framework::test_slow_wallet { assert!(slow_wallet::unlocked_amount(@0x123) == 0, 735701); // fund alice - // let (burn_cap, mint_cap) = gas_coin::initialize_for_test(&root); + // let (burn_cap, mint_cap) = libra_coin::initialize_for_test(&root); ol_account::deposit_coins(@0x123, coin::test_mint(100, &mint_cap)); // coin::destroy_burn_cap(burn_cap); coin::destroy_mint_cap(mint_cap); @@ -110,7 +110,7 @@ module ol_framework::test_slow_wallet { // alice will transfer and create bob's account ol_account::transfer(&alice, @0x456, 99); - let b_balance = coin::balance(@0x456); + let b_balance = coin::balance(@0x456); assert!(b_balance == 99, 735702); assert!(slow_wallet::unlocked_amount(@0x123) == 01, 735703); diff --git a/framework/libra-framework/sources/ol_sources/tests/tower.test.move b/framework/libra-framework/sources/ol_sources/tests/tower.test.move index b1dd83a24..991b2f33c 100644 --- a/framework/libra-framework/sources/ol_sources/tests/tower.test.move +++ b/framework/libra-framework/sources/ol_sources/tests/tower.test.move @@ -105,9 +105,6 @@ module ol_framework::test_tower { vdf_fixtures::security(), ); - // let count_pre = tower_state::get_count_in_epoch(a_addr); - // print(&count_pre); - // all vals compliant mock::mock_all_vals_good_performance(&root); diff --git a/framework/libra-framework/sources/ol_sources/tests/validator_reward.test.move b/framework/libra-framework/sources/ol_sources/tests/validator_reward.test.move index 2662f1773..4dadfdbdf 100644 --- a/framework/libra-framework/sources/ol_sources/tests/validator_reward.test.move +++ b/framework/libra-framework/sources/ol_sources/tests/validator_reward.test.move @@ -7,13 +7,13 @@ module ol_framework::test_reconfiguration { use diem_framework::coin; use ol_framework::mock; use ol_framework::testnet; - use ol_framework::gas_coin::LibraCoin as GasCoin; + use ol_framework::libra_coin::LibraCoin; use ol_framework::proof_of_fee; use diem_framework::reconfiguration; use ol_framework::epoch_helper; use ol_framework::ol_account; - use diem_std::debug::print; + // use diem_std::debug::print; // Scenario: all genesis validators make it to next epoch #[test(root = @ol_framework)] @@ -42,10 +42,8 @@ module ol_framework::test_reconfiguration { let vals = stake::get_current_validators(); assert!(vector::length(&vals) == 5, 7357005); - // let alice_bal = coin::balance(@0x1000a); - let (unlocked, alice_bal) = ol_account::balance(@0x1000a); - print(&unlocked); - print(&alice_bal); + // let alice_bal = coin::balance(@0x1000a); + let (_unlocked, alice_bal) = ol_account::balance(@0x1000a); let (_, entry_fee, _, _ ) = proof_of_fee::get_consensus_reward(); // need to check that the user paid an PoF entry fee for next epoch. @@ -60,7 +58,7 @@ module ol_framework::test_reconfiguration { let _vals = mock::genesis_n_vals(&root, 5); // mock::ol_initialize_coin(&root); mock::pof_default(); - assert!(coin::balance(@0x1000a) == 0, 7357000); + assert!(coin::balance(@0x1000a) == 0, 7357000); // NOTE: epoch 0 and 1 are a special case, we don't run performance grades on that one. Need to move two epochs ahead reconfiguration::test_helper_increment_epoch_dont_reconfigure(); @@ -93,9 +91,9 @@ module ol_framework::test_reconfiguration { // alice doesn't get paid - assert!(coin::balance(@0x1000a) == 0, 7357005); + assert!(coin::balance(@0x1000a) == 0, 7357005); // bob does - assert!(coin::balance(@0x1000b) == (reward - entry_fee), 7357006); + assert!(coin::balance(@0x1000b) == (reward - entry_fee), 7357006); } diff --git a/framework/libra-framework/sources/ol_sources/tests/vote_lib/safe.test.move b/framework/libra-framework/sources/ol_sources/tests/vote_lib/safe.test.move index 94a38a35f..40ffb9bcc 100644 --- a/framework/libra-framework/sources/ol_sources/tests/vote_lib/safe.test.move +++ b/framework/libra-framework/sources/ol_sources/tests/vote_lib/safe.test.move @@ -27,7 +27,7 @@ module ol_framework::test_safe { // SO ALICE and DAVE ARE AUTHORIZED safe::init_payment_multisig(&resource_sig, vals, 2); // both need to sign - // first make sure dave is initialized to receive GasCoin + // first make sure dave is initialized to receive LibraCoin ol_account::create_account(root, @0x1000d); // when alice proposes, she also votes in a single step let prop_id = safe::propose_payment(alice, new_resource_address, @0x1000d, 42, b"cheers", option::none()); @@ -57,7 +57,7 @@ module ol_framework::test_safe { // not enough voters safe::init_payment_multisig(&resource_sig, vals, 3); // requires 3 - // first make sure EVE is initialized to receive GasCoin + // first make sure EVE is initialized to receive LibraCoin ol_account::create_account(root, @0x1000e); // when alice proposes, she also votes in a single step let prop_id = safe::propose_payment(alice, new_resource_address, @0x1000e, 42, b"cheers", option::none()); diff --git a/framework/libra-framework/sources/ol_sources/validator_universe.move b/framework/libra-framework/sources/ol_sources/validator_universe.move index 1f30059e2..c4b456421 100644 --- a/framework/libra-framework/sources/ol_sources/validator_universe.move +++ b/framework/libra-framework/sources/ol_sources/validator_universe.move @@ -16,7 +16,7 @@ module diem_framework::validator_universe { use diem_framework::stake; // use diem_framework::coin::Coin; - // use ol_framework::gas_coin::LibraCoin as GasCoin; + // use ol_framework::libra_coin::LibraCoin; // use ol_framework::rewards; #[test_only] @@ -180,4 +180,4 @@ module diem_framework::validator_universe { } -} \ No newline at end of file +} diff --git a/framework/releases/head.mrb b/framework/releases/head.mrb index 0479363fb821406551173971638828da23aeeb9b..1f9639dca08965e6b64e8f73077fd3a728371fc3 100644 GIT binary patch delta 90689 zcmV(-K-|BAr6j2FBY=bfv;xPXKtwo0I72Z+Ff~LnI5b8?K|?Y%F+npqI7Bi+I6*c> zK{qu+HZ?>=Getu&Fhe&rLPbSIF+)Z}G(j;oF*8C$Lzf4m0>lAKw=J~-c8dY)x1>M= zLjixA#@A^WAW!U-zjVD!s~*EAK~du+dtc*d9%XS>=bc~{k5l68%D3}0oM*rT@Ln*A zBG{)y#@YGRQ4fU#kOI^jf_MOrF9&(X!Zc#jXq2-_ltx@|qAbtk$lFOgm=H4aNkSY= z!|3sU{Xf1MB=hOruT|@!&jn7`8fIX!?nr-Nlw_F>qGGhfgxuB<3Nt7L@vZp#Dck2< z#*z^eV+964=KvChEKgWGkMlU3#=k`@WTZa&sA8^w1^aB6MA`f=Ih%z!j6$_Ej26@6 zE=mz5*FiMfAem=5J32T&J`0Y|UY`g1hldwOmzTlm@#X3M)xqC-Y`MG5Ub609u{?im zB3Mv3O`~vlr!8p6!b~ixWRjDMqy58Qf}h{MIyt`l+tHz%Wz#>)B&6M3N6~zpX@K9{ zDYmpJ4x>dH4Z=Jcw%NWwwA>EN$(L{miUHODDk26IkixXcp2g~%xi7EIFOJIhxUDTf zPAWF2&7n_SYd-I0ceJ_AlAJ~JWI2DH5Xv%SqCqlSOrspcst{To{_)x6+t;s;4~~z{ zu7X$lC;MjyM-uj~2KykK&jCExz&uUv*gTm(`7KHlK9LUa@aXdD;_boJ@%dSB{u&m2 z_OGLh^Wf_I??-16@G~7SGIls4Bn|i^*AYY5I#hx|xY$2Ee|vT%A-%955k7yBXGdxB zTQqNTqpSf2DM_*z_<;e+Z-oIgF!K81{9naVyB!w^%LQo3VMJ1wCwVw!*>bU%-l60v z#1G@q266Hb@3 zOlg?I>!|=w8jegr!ITUvNe1#UjL|E)Ueb4{Q}xc9+bU)GI%c#>+@TxFf2R6c<0izQ6{k^o50jF>UoS(UdmVqVGNy>%Wi- zmKvL+ixplO>hc(#5{!Q~cdx_gG`S^lSuOxGk%Crm;+%n3nBEzz65b^75D|ll{0SJl zcy#yVHU+Ups*I*Fcn)oL4(3|{R4g}!We}?wjCOs;4#Bvy*V4GNM(2IEX&`l9oK(bPRof8_`Z@$sk5M%gBj`jiBGIJRedC;MSoR z_%2$IFatE8;S_nDyHUso(L6);pC*G40}`ASMaJQ7QuHMhco*Gi_{Wv@xJ0PeS{ikP zspzrmB$*ZugrR>3XggU?k4Anx@djTkzl3v+do^v+b?!v)$*L-R}0zj-iLr)=z zUPqJgCQgXr+`Q>)VaMD~jN)iIR4{>svnX%zHwPe=KpubY^OJ~khgR9mge}4p9z@{e z5vQ6aGBc=sN%QhWd&o=h0|7eIsiZC(GQ+%56qm1+KxID})x^=Bi)_$eV@JB3cKRmfS=^o>(umOk?xGF)n{2P!tjSC;%yxV%n=QRH=q$4-mlSk!ke? z%ap=FzFC_ZhIh$X43I?bZsw5X01Xp*UNFh6$LAx@Tf|>rB}T9bBn;S!{xk-`?zb^l z5OLd2%1zFNk+PZw^Ixc22WYB?Wj?Y>V4-(CPi|qvU>RmyZ<7g)wA^gJ4nOESqJ)25 z;klJ^N6+=o3u!1g2XY~LO!AVsd2Ptm+pBi?L^#nJN7b5L^Xfy(tLF@5YCZbHIw$Ji zMtr0KZ2Ta>0i9I3j3b$lYhaWHYAAKk4OlJTPE)v^n%>qj?--FaHXMj;nzQK!jS%c& zz9fa6#3OTCE?)zqVq&PAg)*0Q0vvy#ZMM$-(1)~nhFiavp3Q3e+p}yLd-;-e>`fo0 zA?1iBo^Y*&ZZyUGknjNIK{+-Iuu{SlPX=JxVi=~J(xu24;xv__Bv3J1=ByGOrRlL>M;=P)u7yDY~**wwz&Do|5STB{Km2eGPxX`Oi`M z3PQklZ38xc-=F}lAOP1hAidVmNP(yqQd&^uv%hlFXN6*N`fZO71zH#==iog=97iL}!V^GaUEp()O$#nFFU2kOFXP?)qm z_jX@`3I~C_4aU<1!pH!2@?()TQdoQKdR@HaG$X)5lp1WVPs z0Tb%qq70slbO;3swD*5>^aAk4hI(eX0#I_jiKE+JUC#g$Qd%M)xdmsB7tBOc#!#!A zwQavg4AmA&0MvGyJX61lhk4F{hc&=ix%5^3aS9RWc#@NgOrEsC%ip6zB2Z9N{_Mpx zn}U9SV?=)WGBmo zqI?PGILec0+bCm6gF{wtrmyoF?L(`zf}VxgEQ)WUDrQ+lEw4JQ+-tSIsk1?u+0&DO z&cg8p6a8iq&*X0;fVNzh(`r+wjT6`1MfR|yrnX%U>37*MpSm{T9*{15!RFpx!hE(&PSAqF}EVJx9A%FRJkd%j-L!Aj}io!DH9$qM5DQ!*Ia@Ni4E&1qh*8EoPH)XwBW z_y)~&>^Z}@gZ+|uTk|Nq@(z`g&{nm40a2bsn0fo)9WZ}S=24?r7TEA4=D=~Po>CH3 zhC7rp8>oz`QMc5-XZ-*^^rb@p61BjfP&6u~5w(0!C9~*qvU0VG>R^E65<4e75jMxv zCPWk~5{my*77}1~*ys3H*F13x;NF+5%j?*CxL*&tdQ$M*;L8e{e_|aKEn{k68V`do z9WSx^*KmLOe2f6uCvxbO`+fb-D0&sLg3GCr7q5(9^e^RCkKZv~)yCIP7m}Wb)GjY4 zfa54z51=rKMOrNJgV`*&ezwf0T`GiZFSR~O>1knlH{^Yqs86QR4W@QT=fv}|0x$^| z3#jFz`awQxW5T_Ri*a?q`mF5bP?RRo?M0rtK~#TYRi4{vdLm5G+(sG0h8CvPiau9J z!#5_b$;5_MCR0VuqspmBKYtCCjjUByZC9%6VgkKn!hxdN9)e>77O$GX$3>X( zGP2q2M#88|o!-b9_4q8;ceGM1GVS$v!wP%yM7Vi~2q$0ov=%fYQ^cqxG~h(Wvn7Rrmx8LDSse*tD1s8y=GhQZ;liowg0#Fc3s>6aLk zS|;_VevpBJ{fMQUYzhDS zva!h5JeeR`+Q<1J}lp5UPkYTNDe>KE^tSMz^l z3D)`GNjy`He;_zNpv3(E;-NL#7lAEhu(CEzt|W>kPCvaAgDc46J3pekcN(~t`iCb1v{}q_ z9q3X5BiXP$K2pZU4WnipHhn+ z{zJNdDhi0LR&)W6_YMI~G9>E&VkD78l&7|mjB1wnU99yGizZ^}_9(~=%vZNm?k&m( z?Pgmvm64h^kG7$5w>zQdc{G2H(i&Y-6;8P7ifYwtI$qWL>u-{sC9s$z4P@tQ(RvLu zZI7=s}#RLUtLoK!NmbKUxZ{>6B$0e3pFd<&d(Fgxm zMaCkK(&^}Sv)d`v>Si}&@4$o*IGO1`8HMZicbXRR(Rc%kiUw;~B$I!TzhnXt;~8A_ z`N&88Hd<5ymV_gN8f%cGK{9GsMz1s`E6aJI=cv!(4aZ!MrTipxNnGY#)b|w??bSh| zZ~_7jq)~Nndc~q7yG*0`IG;2&kja{|GtEB2*jj-Vtd=EskZP6n zE30OuN30*+?sTQN6dH8=lnOBW@UcpU>2aAD!$Zd?{=ho}f8Y%xw~26`_^AZO)2-;J ziJU4rxnMz6pCFHwAxy<`0(TjydR;U#^Hfo`oXN63PC^cPrZ;~alF!!{S1#x+h{{(_ z-XSn?)H{@JdQrRJt~$S;g6B>rq4epCvn=@}r9<=-FQ`j4V0-!GHoUVvbjmK2w>H}0 zn6~_?SlZKCE81Vpjzsp~Iz;i^kE>f>oj6^Cvgb4ds(`?mT#Fv`R#H5cgATlwt9W2_ z)lAZtv9Fe-ztDez1KA{2e)<64@|tsB-dg0W%NC(btQCq?6;x|wkeQX0X_lsx{}dG_ zY|^b$VbXA82gg3|^bOwH8YK0tqKJdrPga|I#6VYe}_AoI&Q z<_SzYPB79IZ$sW=fXBqcT&|!@aBpTone3)X;`75D0<9;hrLjpeZQzV%3VtvNDdQaG z%i>M3rABkFI4>~^-$mjs0D7sw{5Ku(j@kV%|ZaRu8Tf|1y|(ZlqA8GNC!wQP2Foy6k_ zHsGdsfr$d7xu0rgRWDL^IBB_Nsx0*J|9$d4^Th8+0am zE4uAXfmtCjRsQ$Q%w!>XZVRsvgH+EnU+;L9PRK;%QHewaFdYNsTF_8 zy7lvmG#%artq>p(F_HGDSM~AsseDpP_6IR3ydgvMWAsgS7Kz=kxU-|*as5C$AyLty zQs+X0PI>G2>OK>tLBu__p}f{fOHPZ@iJq6n{%E|?0qO$$zC%h~jgUQxT(xMOL!Wp= zp*`xP(gr&|FN(6^pvy0N6$KnScCUXd^#K1CP|F$}u}O(;(y~(Yo^|7U)~e-Kz1qd$ zis}=rSHi1UEx#6P^=f77vbNfy>Ab9dX0NuQ&W74Sz}u_L9m`9?Aj@|Orv6S{$hGp# z1FeV2bDLo4b`${Z?dT77luZ5ck zE=Zk*h+GuG))Kc=%1Vyld%}eRI9uW%uQCVJ%dt5GCweUI>uOhD{ zZbtL%j~9@=^u#7gN>x`UP}YAt>a#vo%6O8myv4fDMeCR5Gx?CLZOD@%&H_6|T4%3-Zh%>&`kZ3ZaSg)1?BH zEuHfGyUk_^UqM8M=Z)Ymm!T^8Nq@K&>&Rd3D9yQT2(<6H#RGXipm2Zqm5$e7T8yEs zxoS#3XRVyqhHghQbb-jrD#Kx}R$SHb(rZDyH!iH!C)*v*S;>=9P7ev!tF#6m0GH-nC`a1gfT`Kkf*(1B@ z8KUk0u?M04-10@z6)JzR+v%*(hlNa)DnM0jajDUAM6bnmyoi$t2MvZU&$z)ISnIY2 zBc7p-NXqd$4A zweg2AUBNsN?%Fpa_V`BZaeTc(AmkB{70%uYeXTXOPzvA6`<8#Iegw5xqNTnF4cUF5 zhTObAnztUT8f&V&n(NvA3Y6U@%9Fg&8@{pbO#fAki{3BjdfosJJulO!LD#DUgJeht z1>Xb5c0i`^hg*cw#NS|SI-Qd^T)Q@~VJS$aUG435Dm}#E^j!o0iG9vT%+z#UzqI7A z``2euS2NcxFxP+13g#*-GO?J{c;8I%*Iab@!e&sFRS5wl&`CUdN<(-!0(ZFLOW$+x+^3M~RK+N_;E0 zZF;U-`rdbwzHXm9j_ti`(KS5o)ywIAnKUZ85QrM2mhB=wU8KgZBr`TuDm3_}j4!%n z%Aa1^bAEr%Lht%8IR_p)npgTszeV%ntd?Y(8md+_zSlcWuwk|dh_NeGuBTOBoA!~^ zt~y3!SL3y*?qjpXaH+eDi$j>tev1KeFRESA8oE(z)|^RszSaP~I?dtL2Pt_{Xs8k> zG02rE?SU;;+9Ol4#DkB;E^2f0YIk%8+|m6qchr9;5323;n@p^hiF@#={u)sw$hM|!tj|DAK`!0#4!uArT`&-HN$_l-KWGdC5j4K02Z zkuZOfn_IPW>*xV)86KeZqvSpNjB?Y;PKY18H?lPGG;27`4`Pjuk^>*2VA2 zO*cHf9+jnq&$wg#{fFF|R7k3IZIV%ga_&u9^BN@MN*+E;ze7(~@a>XbChOiL$OD?= zeWhO)9Ht@l|-?+ z5=j9qnvSMWxBMn2k1Z!FIZNKuXkbpm+w_JvkVc;Y3u)7AsHFJ4b3r0RY8*7uT%gJJ>Pw9WV zKP}KU&@0PN_g4M_&>H%`YJ}GW)ScpmJ>s5*z=&Z5`@7+gkG<|E#3ds4=M*;lZI^il zij3Vx^0H{b#F6&f3hMWe_|Dp2i@ZLT?5!_)7Lwm`CNs6c6ubXn0@PPzeS4|lJs*-;YvOF!}QDTRXBjr}VR>yv+$M&_as(0^+rV++vhQ_Ok$gW zKS=|VCcT~(Cc4y-527D9LIkPn(h~ktrfpw$i076lP12~`VD=&T4pn(^w&s5v-aZs< z(_duHsghj>2`G(0&O51*tdRbW=laE=c6Mm}R=heKz44{8^hPyLKSoQnxr_UBRaoxm2NElksOFW-&#G~#uIgMqp5aASz3pC0CdZ*{wlBf;PpoItFiHT zl8dWB+7^9jg%J0O{gRBhYi)m&F2<*C96L#kT^sK3$`(s=ZR$jI$Dg267Y!Fd+j2gb z;5B2z7X9WJVnY6)ZZbE1m`;otMktM$C#hGDF<(4BUy4GUjtPH%|7s_tQAIvg&HLR{ z{>ShB1Bx$^+b6650000AY-wV0VP9i!X>QdRABzY8000000{`t=;ckE1I1>J!r(k

Vi}PjR5vhhdgN!837#gT=rM#T@Px)h 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⪚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 z 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 diff --git a/smoke-tests/src/helpers.rs b/smoke-tests/src/helpers.rs index f0f564bd0..06e59a79e 100644 --- a/smoke-tests/src/helpers.rs +++ b/smoke-tests/src/helpers.rs @@ -33,7 +33,7 @@ pub async fn mint_libra( ) -> anyhow::Result<()> { let payload = public_info .transaction_factory() - .payload(libra_stdlib::gas_coin_mint_to_impl(addr, amount)); + .payload(libra_stdlib::libra_coin_mint_to_impl(addr, amount)); let mint_txn = public_info .root_account() diff --git a/tools/genesis/src/genesis_functions.rs b/tools/genesis/src/genesis_functions.rs index 084ce031d..9eb1e8b72 100644 --- a/tools/genesis/src/genesis_functions.rs +++ b/tools/genesis/src/genesis_functions.rs @@ -476,7 +476,7 @@ pub fn set_final_supply(session: &mut SessionExt, supply_settings: &SupplySettin exec_function( session, - "gas_coin", + "libra_coin", "genesis_set_final_supply", vec![], serialized_values, diff --git a/tools/query/tests/view.rs b/tools/query/tests/view.rs index ee1600461..627469ede 100644 --- a/tools/query/tests/view.rs +++ b/tools/query/tests/view.rs @@ -9,7 +9,7 @@ async fn libra_view_test() { let c = s.client(); let q = QueryType::View { - function_id: "0x1::gas_coin::supply".to_string(), + function_id: "0x1::libra_coin::supply".to_string(), type_args: None, args: None, }; diff --git a/types/src/move_resource/gas_coin.rs b/types/src/move_resource/gas_coin.rs index cc8981c8c..ff5126dad 100644 --- a/types/src/move_resource/gas_coin.rs +++ b/types/src/move_resource/gas_coin.rs @@ -17,7 +17,7 @@ use crate::ONCHAIN_DECIMAL_PRECISION; pub static GAS_COIN_TYPE: Lazy = Lazy::new(|| { TypeTag::Struct(Box::new(StructTag { address: AccountAddress::ONE, - module: ident_str!("gas_coin").to_owned(), + module: ident_str!("libra_coin").to_owned(), name: ident_str!("LibraCoin").to_owned(), type_params: vec![], })) diff --git a/types/src/move_resource/tower_state.rs b/types/src/move_resource/libra_coin.rs similarity index 91% rename from types/src/move_resource/tower_state.rs rename to types/src/move_resource/libra_coin.rs index b53cadee6..e02ca1d43 100644 --- a/types/src/move_resource/tower_state.rs +++ b/types/src/move_resource/libra_coin.rs @@ -15,14 +15,13 @@ use crate::ONCHAIN_DECIMAL_PRECISION; /// The balance resource held under an account. #[derive(Debug, Serialize, Deserialize)] // #[cfg_attr(any(test, feature = "fuzzing"), derive(Arbitrary))] -pub struct GasCoinStoreResource { +pub struct LibraCoinStoreResource { coin: u64, - frozen: bool, deposit_events: EventHandle, withdraw_events: EventHandle, } -impl GasCoinStoreResource { +impl LibraCoinStoreResource { pub fn new( coin: u64, frozen: bool, @@ -54,7 +53,7 @@ impl GasCoinStoreResource { } } -impl MoveStructType for GasCoinStoreResource { +impl MoveStructType for LibraCoinStoreResource { const MODULE_NAME: &'static IdentStr = ident_str!("coin"); const STRUCT_NAME: &'static IdentStr = ident_str!("CoinStore"); @@ -63,12 +62,12 @@ impl MoveStructType for GasCoinStoreResource { } } -impl MoveResource for GasCoinStoreResource {} +impl MoveResource for LibraCoinStoreResource {} // TODO: This might break reading from API maybe it must be diem_api_types::U64; #[derive(Debug, Serialize, Deserialize)] -pub struct GasCoin { +pub struct LibraCoin { pub value: u64, } @@ -106,7 +105,7 @@ impl SlowWalletBalance { } /// This is the same shape as Slow Wallet balance, except that it is scaled. -/// The slow wallet struct contains the coin value as it exists in the database which is without decimals. The decimal precision for GasCoin is 6. So we need to scale it for human consumption. +/// The slow wallet struct contains the coin value as it exists in the database which is without decimals. The decimal precision for LibraCoin is 6. So we need to scale it for human consumption. #[derive(Debug, Serialize, Deserialize)] pub struct LibraBalanceDisplay {