From 44c82ca6ae842970a98bda1e8f8e2ad6a11545fd Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Fri, 10 Nov 2023 19:09:44 -0500 Subject: [PATCH] [move] essential formal verification tests on transfers (#94) Co-authored-by: Yotam Katznelson --- .github/workflows/ci.yaml | 3 - .github/workflows/cleanliness.yaml | 2 +- .github/workflows/formal.yaml | 62 +- .github/workflows/move.yaml | 5 +- .github/workflows/publish.yaml | 81 ++ .pre-commit-config.yaml | 8 +- Cargo.lock | 553 +++------ Cargo.toml | 2 +- docs/core_devs/formal_verification.md | 38 +- framework/Makefile | 13 +- .../sources/modified_source/coin.move | 20 +- .../sources/modified_source/coin.spec.move | 8 +- .../sources/modified_source/genesis.move | 35 +- .../modified_source/transaction_fee.move | 1 + .../sources/ol_sources/burn.move | 12 +- .../sources/ol_sources/demo.spec.move | 51 +- .../sources/ol_sources/epoch_boundary.move | 55 +- .../sources/ol_sources/infra_escrow.move | 19 +- .../sources/ol_sources/libra_coin.move | 10 +- .../sources/ol_sources/mock.move | 4 +- .../sources/ol_sources/musical_chairs.move | 7 +- .../sources/ol_sources/ol_account.move | 46 +- .../sources/ol_sources/ol_account.spec.move | 33 +- .../sources/ol_sources/oracle.move | 6 +- .../sources/ol_sources/sacred_cows.move | 11 +- .../sources/ol_sources/sacred_cows.spec.move | 39 +- .../sources/ol_sources/slow_wallet.move | 60 +- .../sources/ol_sources/slow_wallet.spec.move | 15 +- ...r_voicetest.move => donor_voice.test.move} | 1 - .../sources/system_addresses.move | 5 + framework/releases/head.mrb | Bin 592704 -> 593516 bytes tools/config/src/config_cli.rs | 12 +- tools/config/src/fullnode_config.rs | 42 +- tools/genesis/Makefile | 69 +- tools/txs/tests/transfer.rs | 6 +- types/src/move_resource/gas_coin.rs | 12 +- util/dev-setup.sh | 12 - util/dev_setup.sh | 1085 +++++++++++++++++ 38 files changed, 1770 insertions(+), 673 deletions(-) create mode 100644 .github/workflows/publish.yaml rename framework/libra-framework/sources/ol_sources/tests/{donor_voicetest.move => donor_voice.test.move} (99%) delete mode 100644 util/dev-setup.sh create mode 100644 util/dev_setup.sh diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a53705f50..ec1d99143 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -6,9 +6,6 @@ on: - "[0-9]+.[0-9]+.[0-9]+" - "[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+" branches: ["*"] - # - "release**" - # - "main" - # - "*ci*" pull_request: types: - opened diff --git a/.github/workflows/cleanliness.yaml b/.github/workflows/cleanliness.yaml index e7f57248a..efc70eb01 100644 --- a/.github/workflows/cleanliness.yaml +++ b/.github/workflows/cleanliness.yaml @@ -1,10 +1,10 @@ name: cleanliness on: push: - branches: ["*"] tags: - '[0-9]+.[0-9]+.[0-9]+' - '[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+' + branches: ["*"] pull_request: types: - opened diff --git a/.github/workflows/formal.yaml b/.github/workflows/formal.yaml index acd5e7829..7df41d43c 100644 --- a/.github/workflows/formal.yaml +++ b/.github/workflows/formal.yaml @@ -1,48 +1,50 @@ name: formal verification on: push: - branches: ["ci*"] - # tags: - # - '[0-9]+.[0-9]+.[0-9]+' - # - '[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+' - # pull_request: - # types: - # - opened - # - synchronize - # branches: - # - 'release**' - # - 'main' - + tags: + - '[0-9]+.[0-9]+.[0-9]+' + - '[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+' + branches: ["*"] + pull_request: + types: + - opened + - synchronize + branches: + - 'release**' + - 'main' env: + DOTNET_ROOT: "/home/runner/.dotnet" + Z3_EXE: "/home/runner/bin/z3" + CVC5_EXE: "/home/runner/bin/cvc5" + BOOGIE_EXE: "/home/runner/.dotnet/tools/boogie" + SOLC_EXE: "/home/runner/bin/solc" jobs: formal: runs-on: ubuntu-latest steps: - # NOTE: for debugging CI this allow shell access to github runner. Will print out tmate.io terminal url - - name: Setup tmate session - uses: mxschmitt/action-tmate@v3 - with: - detached: true - timeout-minutes: 15 + # # NOTE: for debugging CI this allow shell access to github runner. Will print out tmate.io terminal url + # - name: Setup tmate session + # uses: mxschmitt/action-tmate@v3 + # with: + # detached: true + # timeout-minutes: 15 - uses: actions/checkout@v3 - # - name: setup env - # uses: ./.github/actions/build_env - name: install prover dependencies - run: > - cd .. && - git clone https://github.com/0LNetworkCommunity/diem.git && - cd diem && - ./scripts/dev_setup.sh -ypb + run: | + bash util/dev_setup.sh -byp - name: install diem (for move tests) - run: > + run: | wget -O ${{github.workspace}}/diem https://github.com/0LNetworkCommunity/diem/releases/latest/download/diem && - sudo chmod 755 ${{github.workspace}}/diem + chmod +x ${{github.workspace}}/diem && + cp ${{github.workspace}}/diem ~/.cargo/bin - - name: prove - run: diem move prove -f version - working-directory: ./framework/libra-framework + # Move framework tests + # TODO: + - name: prover tests + working-directory: ./framework + run: make prove \ No newline at end of file diff --git a/.github/workflows/move.yaml b/.github/workflows/move.yaml index e15bd0e6d..16d94bd4c 100644 --- a/.github/workflows/move.yaml +++ b/.github/workflows/move.yaml @@ -5,8 +5,7 @@ on: tags: - '[0-9]+.[0-9]+.[0-9]+' - '[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+' - branches: - - '*' + branches: ['*'] pull_request: types: - opened @@ -31,7 +30,7 @@ jobs: - name: install diem (for move tests) run: > wget -O ${{github.workspace}}/diem https://github.com/0LNetworkCommunity/diem/releases/latest/download/diem && - sudo chmod 755 ${{github.workspace}}/diem + chmod +x ${{github.workspace}}/diem # Move framework tests - name: move framework diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml new file mode 100644 index 000000000..e18b3ccdc --- /dev/null +++ b/.github/workflows/publish.yaml @@ -0,0 +1,81 @@ +name: publish bin +on: + push: + tags: + - '[0-9]+.[0-9]+.[0-9]+' + - '[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+' + branches: + - 'ci' +jobs: + publish: + permissions: write-all + # contents: write + name: publish + runs-on: ubuntu-latest + steps: + # NOTE: for debugging CI this allow shell access to github runner. Will print out tmate.io terminal url + # - name: Setup tmate session + # uses: mxschmitt/action-tmate@v3 + # with: + # detached: true + # timeout-minutes: 15 + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + # this might remove tools that are actually needed, + # if set to "true" but frees about 6 GB + tool-cache: false + + # all of these default to true, but feel free to set to + # "false" if necessary for your workflow + android: true + dotnet: true + haskell: true + large-packages: false + docker-images: true + swap-storage: true + + - uses: dtolnay/rust-toolchain@1.70.0 + with: + components: rustfmt + +######## CACHE ######## + - name: system packages + uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: build-essential ca-certificates clang curl git libpq-dev libssl-dev pkg-config lsof lld libgmp-dev + version: 1.0 + + - name: checkout + uses: actions/checkout@v3 + + - name: sccache + uses: 0o-de-lally/sccache-action@local + + # note: building in the same cargo command will lead to "feature unification", which leads to a `diem-node` binary which fails. + - name: libra release build + # size and performance optimized binary with profile.cli + run: cargo b --release -p libra + + - name: libra publish + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: target/release/libra + tag: ${{ github.ref }} + overwrite: true + file_glob: true + + # TODO + # - name: libra-framework release build + # # size and performance optimized binary with profile.cli + # run: cargo b --release -p libra-framework + + # - name: CLI publish + # uses: svenstaro/upload-release-action@v2 + # with: + # repo_token: ${{ secrets.GITHUB_TOKEN }} + # file: target/release/libra-framework + # tag: ${{ github.ref }} + # overwrite: true + # file_glob: true \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5847bc407..2666664dc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,7 +6,7 @@ repos: files: \.(rs|move)$ - id: end-of-file-fixer files: \.(rs|move)$ - - repo: https://github.com/doublify/pre-commit-rust - rev: v1.0 - hooks: - - id: fmt + # - repo: https://github.com/doublify/pre-commit-rust + # rev: v1.0 + # hooks: + # - id: fmt diff --git a/Cargo.lock b/Cargo.lock index b514cf59a..baf6cb10d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1537,15 +1537,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "debug-ignore" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b48b0b49e2f473c499ddcd133e78f0f2629aaa997ee61adadb2d1753e6af4cf" -dependencies = [ - "serde 1.0.163", -] - [[package]] name = "derivation-path" version = "0.2.0" @@ -1608,7 +1599,7 @@ dependencies = [ [[package]] name = "diem" version = "2.0.2" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "async-trait", @@ -1642,7 +1633,6 @@ dependencies = [ "diem-rest-client", "diem-sdk", "diem-storage-interface", - "diem-telemetry", "diem-temppath", "diem-transactional-test-harness", "diem-types", @@ -1690,7 +1680,7 @@ dependencies = [ [[package]] name = "diem-accumulator" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "diem-crypto", @@ -1700,7 +1690,7 @@ dependencies = [ [[package]] name = "diem-aggregator" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -1718,7 +1708,7 @@ dependencies = [ [[package]] name = "diem-api" version = "0.2.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "async-trait", @@ -1759,7 +1749,7 @@ dependencies = [ [[package]] name = "diem-api-types" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "async-trait", @@ -1786,7 +1776,7 @@ dependencies = [ [[package]] name = "diem-backup-cli" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "async-trait", @@ -1833,7 +1823,7 @@ dependencies = [ [[package]] name = "diem-backup-service" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -1855,7 +1845,7 @@ dependencies = [ [[package]] name = "diem-bitvec" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "serde 1.0.163", "serde_bytes", @@ -1864,7 +1854,7 @@ dependencies = [ [[package]] name = "diem-block-executor" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "arc-swap", @@ -1889,7 +1879,7 @@ dependencies = [ [[package]] name = "diem-block-partitioner" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -1909,7 +1899,7 @@ dependencies = [ [[package]] name = "diem-bounded-executor" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "futures", "tokio", @@ -1918,7 +1908,7 @@ dependencies = [ [[package]] name = "diem-build-info" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "shadow-rs", ] @@ -1926,7 +1916,7 @@ dependencies = [ [[package]] name = "diem-cached-packages" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", "diem-framework", @@ -1939,7 +1929,7 @@ dependencies = [ [[package]] name = "diem-channels" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "diem-infallible", @@ -1951,7 +1941,7 @@ dependencies = [ [[package]] name = "diem-cli-common" version = "1.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anstyle", "clap 4.4.2", @@ -1961,7 +1951,7 @@ dependencies = [ [[package]] name = "diem-compression" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "diem-logger", "diem-metrics-core", @@ -1973,7 +1963,7 @@ dependencies = [ [[package]] name = "diem-config" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -2003,7 +1993,7 @@ dependencies = [ [[package]] name = "diem-consensus" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "arc-swap", @@ -2065,7 +2055,7 @@ dependencies = [ [[package]] name = "diem-consensus-notifications" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "async-trait", "diem-crypto", @@ -2080,7 +2070,7 @@ dependencies = [ [[package]] name = "diem-consensus-types" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -2103,7 +2093,7 @@ dependencies = [ [[package]] name = "diem-crash-handler" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "backtrace", "diem-logger", @@ -2115,7 +2105,7 @@ dependencies = [ [[package]] name = "diem-crypto" version = "0.0.3" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "ark-ec", @@ -2152,7 +2142,7 @@ dependencies = [ [[package]] name = "diem-crypto-derive" version = "0.0.3" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "proc-macro2 1.0.59", "quote 1.0.28", @@ -2162,7 +2152,7 @@ dependencies = [ [[package]] name = "diem-data-client" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "async-trait", "diem-config", @@ -2189,7 +2179,7 @@ dependencies = [ [[package]] name = "diem-data-streaming-service" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "async-trait", "diem-channels", @@ -2215,7 +2205,7 @@ dependencies = [ [[package]] name = "diem-db" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "arc-swap", @@ -2263,7 +2253,7 @@ dependencies = [ [[package]] name = "diem-db-indexer" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -2289,7 +2279,7 @@ dependencies = [ [[package]] name = "diem-db-tool" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "async-trait", @@ -2313,7 +2303,7 @@ dependencies = [ [[package]] name = "diem-debugger" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "clap 4.4.2", @@ -2344,7 +2334,7 @@ dependencies = [ [[package]] name = "diem-enum-conversion-derive" version = "0.0.3" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "proc-macro2 1.0.59", "quote 1.0.28", @@ -2354,7 +2344,7 @@ dependencies = [ [[package]] name = "diem-event-notifications" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "async-trait", "diem-channels", @@ -2371,7 +2361,7 @@ dependencies = [ [[package]] name = "diem-executor" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "arr_macro", @@ -2402,7 +2392,7 @@ dependencies = [ [[package]] name = "diem-executor-test-helpers" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "diem-cached-packages", @@ -2426,7 +2416,7 @@ dependencies = [ [[package]] name = "diem-executor-types" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -2447,7 +2437,7 @@ dependencies = [ [[package]] name = "diem-fallible" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "thiserror", ] @@ -2455,7 +2445,7 @@ dependencies = [ [[package]] name = "diem-faucet-core" version = "2.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "async-trait", @@ -2489,7 +2479,7 @@ dependencies = [ [[package]] name = "diem-faucet-metrics-server" version = "2.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "diem-logger", @@ -2504,7 +2494,7 @@ dependencies = [ [[package]] name = "diem-forge" version = "0.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "again", "anyhow", @@ -2559,7 +2549,7 @@ dependencies = [ [[package]] name = "diem-framework" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "ark-bls12-381", @@ -2625,7 +2615,7 @@ dependencies = [ [[package]] name = "diem-gas" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -2648,7 +2638,7 @@ dependencies = [ [[package]] name = "diem-gas-algebra-ext" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "move-core-types", ] @@ -2656,7 +2646,7 @@ dependencies = [ [[package]] name = "diem-gas-profiling" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "diem-framework", @@ -2674,7 +2664,7 @@ dependencies = [ [[package]] name = "diem-genesis" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -2700,7 +2690,7 @@ dependencies = [ [[package]] name = "diem-github-client" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "diem-proxy", "serde 1.0.163", @@ -2712,17 +2702,17 @@ dependencies = [ [[package]] name = "diem-global-constants" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" [[package]] name = "diem-id-generator" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" [[package]] name = "diem-indexer" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "async-trait", @@ -2761,7 +2751,7 @@ dependencies = [ [[package]] name = "diem-indexer-grpc-fullnode" version = "1.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "base64 0.13.0", @@ -2798,12 +2788,12 @@ dependencies = [ [[package]] name = "diem-infallible" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" [[package]] name = "diem-inspection-service" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "diem-build-info", @@ -2813,7 +2803,6 @@ dependencies = [ "diem-metrics-core", "diem-network", "diem-runtimes", - "diem-telemetry", "futures", "hyper", "once_cell", @@ -2827,7 +2816,7 @@ dependencies = [ [[package]] name = "diem-jellyfish-merkle" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -2853,7 +2842,7 @@ dependencies = [ [[package]] name = "diem-keygen" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "diem-crypto", "diem-types", @@ -2863,7 +2852,7 @@ dependencies = [ [[package]] name = "diem-language-e2e-tests" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -2901,7 +2890,7 @@ dependencies = [ [[package]] name = "diem-log-derive" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "proc-macro2 1.0.59", "quote 1.0.28", @@ -2911,7 +2900,7 @@ dependencies = [ [[package]] name = "diem-logger" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "backtrace", "chrono", @@ -2935,7 +2924,7 @@ dependencies = [ [[package]] name = "diem-mempool" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "async-trait", @@ -2975,7 +2964,7 @@ dependencies = [ [[package]] name = "diem-mempool-notifications" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "async-trait", "diem-runtimes", @@ -2989,7 +2978,7 @@ dependencies = [ [[package]] name = "diem-memsocket" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "bytes", "diem-infallible", @@ -3000,7 +2989,7 @@ dependencies = [ [[package]] name = "diem-metrics-core" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "prometheus", @@ -3009,7 +2998,7 @@ dependencies = [ [[package]] name = "diem-move-stdlib" version = "0.1.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "hex", @@ -3032,7 +3021,7 @@ dependencies = [ [[package]] name = "diem-moving-average" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "chrono", ] @@ -3040,7 +3029,7 @@ dependencies = [ [[package]] name = "diem-mvhashmap" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3055,7 +3044,7 @@ dependencies = [ [[package]] name = "diem-netcore" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "bytes", "diem-memsocket", @@ -3072,7 +3061,7 @@ dependencies = [ [[package]] name = "diem-network" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "async-trait", @@ -3115,7 +3104,7 @@ dependencies = [ [[package]] name = "diem-network-builder" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "async-trait", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3141,7 +3130,7 @@ dependencies = [ [[package]] name = "diem-network-checker" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "clap 4.4.2", @@ -3158,7 +3147,7 @@ dependencies = [ [[package]] name = "diem-network-discovery" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3184,7 +3173,7 @@ dependencies = [ [[package]] name = "diem-node" version = "1.6.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3227,7 +3216,6 @@ dependencies = [ "diem-storage-service-client", "diem-storage-service-server", "diem-storage-service-types", - "diem-telemetry", "diem-temppath", "diem-time-service", "diem-types", @@ -3250,7 +3238,7 @@ dependencies = [ [[package]] name = "diem-node-identity" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "claims", @@ -3259,26 +3247,10 @@ dependencies = [ "once_cell", ] -[[package]] -name = "diem-node-resource-metrics" -version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" -dependencies = [ - "cfg-if", - "diem-build-info", - "diem-infallible", - "diem-logger", - "diem-metrics-core", - "once_cell", - "procfs", - "prometheus", - "sysinfo", -] - [[package]] name = "diem-num-variants" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "proc-macro2 1.0.59", "quote 1.0.28", @@ -3288,7 +3260,7 @@ dependencies = [ [[package]] name = "diem-openapi" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "async-trait", "percent-encoding", @@ -3301,7 +3273,7 @@ dependencies = [ [[package]] name = "diem-package-builder" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "diem-framework", @@ -3314,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#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "async-trait", "diem-channels", @@ -3340,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#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", "bytes", @@ -3367,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#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", "cfg_block", @@ -3380,7 +3352,7 @@ dependencies = [ [[package]] name = "diem-proptest-helpers" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "crossbeam", "proptest", @@ -3390,7 +3362,7 @@ dependencies = [ [[package]] name = "diem-protos" version = "1.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "pbjson", "prost", @@ -3401,7 +3373,7 @@ dependencies = [ [[package]] name = "diem-proxy" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "ipnet", ] @@ -3409,7 +3381,7 @@ dependencies = [ [[package]] name = "diem-push-metrics" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "diem-logger", "diem-metrics-core", @@ -3420,7 +3392,7 @@ dependencies = [ [[package]] name = "diem-rate-limiter" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "diem-infallible", "diem-logger", @@ -3434,7 +3406,7 @@ dependencies = [ [[package]] name = "diem-release-builder" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3470,7 +3442,7 @@ dependencies = [ [[package]] name = "diem-resource-viewer" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "diem-types", @@ -3482,7 +3454,7 @@ dependencies = [ [[package]] name = "diem-rest-client" version = "0.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3508,7 +3480,7 @@ dependencies = [ [[package]] name = "diem-retrier" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "diem-logger", "tokio", @@ -3517,7 +3489,7 @@ dependencies = [ [[package]] name = "diem-rocksdb-options" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "diem-config", "rocksdb", @@ -3526,7 +3498,7 @@ dependencies = [ [[package]] name = "diem-rosetta" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3560,7 +3532,7 @@ dependencies = [ [[package]] name = "diem-runtimes" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "tokio", ] @@ -3568,7 +3540,7 @@ dependencies = [ [[package]] name = "diem-safety-rules" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "diem-config", "diem-consensus-types", @@ -3592,7 +3564,7 @@ dependencies = [ [[package]] name = "diem-schemadb" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "diem-infallible", @@ -3606,7 +3578,7 @@ dependencies = [ [[package]] name = "diem-scratchpad" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "bitvec 0.19.6", "diem-crypto", @@ -3623,7 +3595,7 @@ dependencies = [ [[package]] name = "diem-sdk" version = "0.0.3" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3643,7 +3615,7 @@ dependencies = [ [[package]] name = "diem-sdk-builder" version = "0.2.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3662,7 +3634,7 @@ dependencies = [ [[package]] name = "diem-secure-net" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "diem-logger", "diem-metrics-core", @@ -3674,7 +3646,7 @@ dependencies = [ [[package]] name = "diem-secure-storage" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "base64 0.13.0", @@ -3696,7 +3668,7 @@ dependencies = [ [[package]] name = "diem-short-hex-str" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "mirai-annotations", "serde 1.0.163", @@ -3707,7 +3679,7 @@ dependencies = [ [[package]] name = "diem-speculative-state-helper" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "crossbeam", @@ -3719,7 +3691,7 @@ dependencies = [ [[package]] name = "diem-state-sync-driver" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "async-trait", @@ -3752,7 +3724,7 @@ dependencies = [ [[package]] name = "diem-state-view" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -3766,7 +3738,7 @@ dependencies = [ [[package]] name = "diem-storage-interface" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "arr_macro", @@ -3793,7 +3765,7 @@ dependencies = [ [[package]] name = "diem-storage-service-client" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "async-trait", "diem-channels", @@ -3807,7 +3779,7 @@ dependencies = [ [[package]] name = "diem-storage-service-server" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", "bytes", @@ -3833,7 +3805,7 @@ dependencies = [ [[package]] name = "diem-storage-service-types" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", "diem-compression", @@ -3845,94 +3817,10 @@ dependencies = [ "thiserror", ] -[[package]] -name = "diem-telemetry" -version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" -dependencies = [ - "anyhow", - "diem-api", - "diem-config", - "diem-consensus", - "diem-crypto", - "diem-db", - "diem-infallible", - "diem-logger", - "diem-mempool", - "diem-metrics-core", - "diem-network", - "diem-node-resource-metrics", - "diem-runtimes", - "diem-state-sync-driver", - "diem-telemetry-service", - "diem-types", - "flate2", - "futures", - "once_cell", - "prometheus", - "rand 0.7.3", - "rand_core 0.5.1", - "reqwest", - "reqwest-middleware", - "reqwest-retry", - "serde 1.0.163", - "serde_json", - "sysinfo", - "thiserror", - "tokio", - "tokio-retry", - "tokio-stream", - "url", - "uuid", -] - -[[package]] -name = "diem-telemetry-service" -version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" -dependencies = [ - "anyhow", - "base64 0.13.0", - "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", - "chrono", - "clap 4.4.2", - "debug-ignore", - "diem-config", - "diem-crypto", - "diem-crypto-derive", - "diem-infallible", - "diem-logger", - "diem-metrics-core", - "diem-rest-client", - "diem-types", - "flate2", - "futures", - "gcp-bigquery-client", - "hex", - "jsonwebtoken", - "once_cell", - "prometheus", - "rand 0.7.3", - "rand_core 0.5.1", - "reqwest", - "reqwest-middleware", - "reqwest-retry", - "serde 1.0.163", - "serde_json", - "serde_repr", - "serde_yaml 0.8.26", - "thiserror", - "tokio", - "tracing", - "url", - "uuid", - "warp", -] - [[package]] name = "diem-temppath" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "hex", "rand 0.7.3", @@ -3941,7 +3829,7 @@ dependencies = [ [[package]] name = "diem-time-service" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "diem-infallible", "enum_dispatch", @@ -3954,7 +3842,7 @@ dependencies = [ [[package]] name = "diem-transaction-emitter-lib" version = "0.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "again", "anyhow", @@ -3985,7 +3873,7 @@ dependencies = [ [[package]] name = "diem-transaction-generator-lib" version = "0.0.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "again", "anyhow", @@ -4015,7 +3903,7 @@ dependencies = [ [[package]] name = "diem-transactional-test-harness" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -4047,7 +3935,7 @@ dependencies = [ [[package]] name = "diem-types" version = "0.0.3" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "arr_macro", @@ -4080,12 +3968,12 @@ dependencies = [ [[package]] name = "diem-utils" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" [[package]] name = "diem-validator-interface" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "async-trait", @@ -4106,7 +3994,7 @@ dependencies = [ [[package]] name = "diem-vault-client" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "base64 0.13.0", "chrono", @@ -4122,7 +4010,7 @@ dependencies = [ [[package]] name = "diem-vm" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -4169,7 +4057,7 @@ dependencies = [ [[package]] name = "diem-vm-genesis" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -4190,7 +4078,7 @@ dependencies = [ [[package]] name = "diem-vm-logging" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "arc-swap", "diem-crypto", @@ -4206,7 +4094,7 @@ dependencies = [ [[package]] name = "diem-vm-types" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "diem-aggregator", @@ -4219,7 +4107,7 @@ dependencies = [ [[package]] name = "diem-vm-validator" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "diem-gas", @@ -4234,7 +4122,7 @@ dependencies = [ [[package]] name = "diem-warp-webserver" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -4741,27 +4629,6 @@ version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" -[[package]] -name = "gcp-bigquery-client" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ab5966c98f6d4e71e247cda6a6d8497bc8a1df3a4ba9ee548087842cffc21d" -dependencies = [ - "async-stream", - "hyper", - "hyper-rustls", - "log", - "reqwest", - "serde 1.0.163", - "serde_json", - "thiserror", - "time 0.3.13", - "tokio", - "tokio-stream", - "url", - "yup-oauth2", -] - [[package]] name = "generic-array" version = "0.12.4" @@ -5588,20 +5455,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "jsonwebtoken" -version = "8.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aa4b4af834c6cfd35d8763d359661b90f2e45d8f750a0849156c7f4671af09c" -dependencies = [ - "base64 0.13.0", - "pem", - "ring", - "serde 1.0.163", - "serde_json", - "simple_asn1", -] - [[package]] name = "k8s-openapi" version = "0.13.1" @@ -6326,7 +6179,7 @@ checksum = "5474f8732dc7e0635ae9df6595bcd39cd30e3cfe8479850d4fa3e69306c19712" [[package]] name = "move-abigen" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6343,7 +6196,7 @@ dependencies = [ [[package]] name = "move-binary-format" version = "0.0.3" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "arbitrary", @@ -6360,12 +6213,12 @@ dependencies = [ [[package]] name = "move-borrow-graph" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" [[package]] name = "move-bytecode-source-map" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6380,7 +6233,7 @@ dependencies = [ [[package]] name = "move-bytecode-utils" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "move-binary-format", @@ -6392,7 +6245,7 @@ dependencies = [ [[package]] name = "move-bytecode-verifier" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "fail 0.4.0", @@ -6406,7 +6259,7 @@ dependencies = [ [[package]] name = "move-bytecode-viewer" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "clap 4.4.2", @@ -6423,7 +6276,7 @@ dependencies = [ [[package]] name = "move-cli" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6467,7 +6320,7 @@ dependencies = [ [[package]] name = "move-command-line-common" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "difference", @@ -6484,7 +6337,7 @@ dependencies = [ [[package]] name = "move-compiler" version = "0.0.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6513,7 +6366,7 @@ dependencies = [ [[package]] name = "move-core-types" version = "0.0.4" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "arbitrary", @@ -6535,7 +6388,7 @@ dependencies = [ [[package]] name = "move-coverage" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6555,7 +6408,7 @@ dependencies = [ [[package]] name = "move-disassembler" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "clap 4.4.2", @@ -6573,7 +6426,7 @@ dependencies = [ [[package]] name = "move-docgen" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "codespan", @@ -6592,7 +6445,7 @@ dependencies = [ [[package]] name = "move-errmapgen" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6606,7 +6459,7 @@ dependencies = [ [[package]] name = "move-ir-compiler" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6625,7 +6478,7 @@ dependencies = [ [[package]] name = "move-ir-to-bytecode" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "codespan-reporting", @@ -6644,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#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "hex", @@ -6657,7 +6510,7 @@ dependencies = [ [[package]] name = "move-ir-types" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "hex", @@ -6671,7 +6524,7 @@ dependencies = [ [[package]] name = "move-model" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "codespan", @@ -6698,7 +6551,7 @@ dependencies = [ [[package]] name = "move-package" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6734,7 +6587,7 @@ dependencies = [ [[package]] name = "move-prover" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "async-trait", @@ -6771,7 +6624,7 @@ dependencies = [ [[package]] name = "move-prover-boogie-backend" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "async-trait", @@ -6800,7 +6653,7 @@ dependencies = [ [[package]] name = "move-resource-viewer" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6815,7 +6668,7 @@ dependencies = [ [[package]] name = "move-stackless-bytecode" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "codespan", "codespan-reporting", @@ -6841,7 +6694,7 @@ dependencies = [ [[package]] name = "move-stdlib" version = "0.1.1" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "hex", @@ -6864,7 +6717,7 @@ dependencies = [ [[package]] name = "move-symbol-pool" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "once_cell", "serde 1.0.163", @@ -6873,7 +6726,7 @@ dependencies = [ [[package]] name = "move-table-extension" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", @@ -6890,7 +6743,7 @@ dependencies = [ [[package]] name = "move-transactional-test-runner" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "clap 4.4.2", @@ -6921,7 +6774,7 @@ dependencies = [ [[package]] name = "move-unit-test" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "better_any", @@ -6951,7 +6804,7 @@ dependencies = [ [[package]] name = "move-vm-runtime" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "better_any", "fail 0.4.0", @@ -6968,7 +6821,7 @@ dependencies = [ [[package]] name = "move-vm-test-utils" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "move-binary-format", @@ -6982,7 +6835,7 @@ dependencies = [ [[package]] name = "move-vm-types" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "bcs 0.1.4 (git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d)", "move-binary-format", @@ -7905,21 +7758,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "procfs" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfb6451c91904606a1abe93e83a8ec851f45827fa84273f256ade45dc095818" -dependencies = [ - "bitflags 1.3.2", - "byteorder", - "chrono", - "flate2", - "hex", - "lazy_static 1.4.0", - "rustix 0.35.9", -] - [[package]] name = "prometheus" version = "0.13.0" @@ -8361,7 +8199,6 @@ dependencies = [ "http", "http-body", "hyper", - "hyper-rustls", "hyper-tls", "ipnet", "js-sys", @@ -8373,21 +8210,17 @@ dependencies = [ "percent-encoding", "pin-project-lite", "proc-macro-hack", - "rustls", - "rustls-pemfile 1.0.1", "serde 1.0.163", "serde_json", "serde_urlencoded", "tokio", "tokio-native-tls", - "tokio-rustls", "tokio-util 0.7.3", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", "winreg", ] @@ -8629,15 +8462,6 @@ dependencies = [ "base64 0.13.0", ] -[[package]] -name = "rustls-pemfile" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee86d63972a7c661d1536fefe8c3c8407321c3df668891286de28abcd087360" -dependencies = [ - "base64 0.13.0", -] - [[package]] name = "rustls-pemfile" version = "1.0.1" @@ -8727,12 +8551,6 @@ dependencies = [ "untrusted", ] -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - [[package]] name = "security-framework" version = "2.7.0" @@ -8909,17 +8727,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "serde_repr" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fe39d9fbb0ebf5eb2c7cb7e2a47e4f462fad1379f1166b8ae49ad9eae89a7ca" -dependencies = [ - "proc-macro2 1.0.59", - "quote 1.0.28", - "syn 1.0.105", -] - [[package]] name = "serde_spanned" version = "0.6.3" @@ -9163,18 +8970,6 @@ dependencies = [ "similar", ] -[[package]] -name = "simple_asn1" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" -dependencies = [ - "num-bigint", - "num-traits 0.2.15", - "thiserror", - "time 0.3.13", -] - [[package]] name = "simplelog" version = "0.9.0" @@ -9235,7 +9030,7 @@ checksum = "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043" [[package]] name = "smoke-test" version = "0.1.0" -source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#bafac94d6edd39d972729db21156d47758eb8969" +source = "git+https://github.com/0LNetworkCommunity/diem.git?branch=release#9fcc42922f9f6b6e5036d75d59a6389e440004a1" dependencies = [ "anyhow", "async-trait", @@ -10384,16 +10179,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" -[[package]] -name = "uuid" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" -dependencies = [ - "getrandom 0.2.7", - "serde 1.0.163", -] - [[package]] name = "valuable" version = "0.1.0" @@ -10632,15 +10417,6 @@ dependencies = [ "untrusted", ] -[[package]] -name = "webpki-roots" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1c760f0d366a6c24a02ed7816e23e691f5d92291f94d15e836006fd11b04daf" -dependencies = [ - "webpki", -] - [[package]] name = "which" version = "4.2.5" @@ -10924,33 +10700,6 @@ dependencies = [ "linked-hash-map", ] -[[package]] -name = "yup-oauth2" -version = "7.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98748970d2ddf05253e6525810d989740334aa7509457864048a829902db76f3" -dependencies = [ - "anyhow", - "async-trait", - "base64 0.13.0", - "futures", - "http", - "hyper", - "hyper-rustls", - "itertools", - "log", - "percent-encoding", - "rustls", - "rustls-pemfile 0.3.0", - "seahash", - "serde 1.0.163", - "serde_json", - "time 0.3.13", - "tokio", - "tower-service", - "url", -] - [[package]] name = "zeroize" version = "1.3.0" diff --git a/Cargo.toml b/Cargo.toml index e00378ae2..5f0418a7f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,7 +25,7 @@ homepage = "https://0l.network/" license = "Apache-2.0" publish = false repository = "https://github.com/0LNetworkCommunity/libra-v7" -rust-version = "1.66.1" +rust-version = "1.70.0" [workspace.dependencies] ######## Internal crate dependencies ######## diff --git a/docs/core_devs/formal_verification.md b/docs/core_devs/formal_verification.md index 5bf35cba0..bb572f065 100644 --- a/docs/core_devs/formal_verification.md +++ b/docs/core_devs/formal_verification.md @@ -25,34 +25,30 @@ libra move prove -h 2) Install the Boogie dependencies -The most straightforward way is to use the `diem-platform` environment setup. The `dev_setup.sh` can be run with these options: > -y install or update Move Prover tools: z3, cvc5, dotnet, boogie -> -b batch mode, no user interactions and minimal output - -> -p update ${HOME}/.profile +> -p update ${HOME}/.profile or ./bashrc ``` -# clone diem -git clone https://github.com/0LNetworkCommunity/diem.git -cd diem - # run the installer -./scripts/dev_setup.sh -ypb +bash util/dev_setup.sh -yp # you may need to restart your shell, after env variables are set -source ~/.profile +# or .bashrc, or .zshrc + +bash ~/.profile + ``` -You should expect to see some changes in your bash profile +Whatever terminal shell (or .zshrc) you are using you should check that these variable are exported: ``` -export DOTNET_ROOT="/Users/you/.dotnet" -export Z3_EXE="/Users/you/bin/z3" -export CVC5_EXE="/Users/you/bin/cvc5" -export BOOGIE_EXE="/Users/you/.dotnet/tools/boogie" -export SOLC_EXE="/Users/you/bin/solc" +export DOTNET_ROOT="$HOME/.dotnet" +export Z3_EXE="$HOME/bin/z3" +export CVC5_EXE="$HOME/bin/cvc5" +export BOOGIE_EXE="$HOME/.dotnet/tools/boogie" +export SOLC_EXE="$HOME/bin/solc" ``` 3) check it all works @@ -63,11 +59,15 @@ So test it on something we know to work ``` cd framework/libra-framework -# test the version.move module -libra move prove -f version +# test the guid.move module +libra move prove -f guid ``` -If you get a response with `Success` you are ready to start. +If you get a response without errors similar to the message below you are ready to +start. +``` +[INFO] 0.903s build, 2.585s trafo, 0.019s gen, 1.313s verify, total 4.820s +``` ## Troubleshooting diff --git a/framework/Makefile b/framework/Makefile index 19064eb4d..e647dffea 100644 --- a/framework/Makefile +++ b/framework/Makefile @@ -1,3 +1,12 @@ +# Prover Tests are WIP +# These are the prover tests that have been written +# and are known to pass +PROVER_TESTS = demo ol_account slow sacred -test: - cargo r upgrade --output-dir ./releases/upgrade --framework-local-dir ./libra-framework \ No newline at end of file +VENDOR_TESTS = chain_id guid + +prove: + @cd libra-framework && \ + for i in ${PROVER_TESTS} ${VENDOR_TESTS}; do \ + diem move prove -f $$i; \ + done \ No newline at end of file diff --git a/framework/libra-framework/sources/modified_source/coin.move b/framework/libra-framework/sources/modified_source/coin.move index 7e584976c..c6632bbad 100644 --- a/framework/libra-framework/sources/modified_source/coin.move +++ b/framework/libra-framework/sources/modified_source/coin.move @@ -109,7 +109,7 @@ module diem_framework::coin { /// These are kept in a single resource to ensure locality of data. struct CoinStore has key { coin: Coin, - frozen: bool, + // frozen: bool, deposit_events: EventHandle, withdraw_events: EventHandle, } @@ -412,10 +412,10 @@ module diem_framework::coin { ); let coin_store = borrow_global_mut>(account_addr); - assert!( - !coin_store.frozen, - error::permission_denied(EFROZEN), - ); + // assert!( + // !coin_store.frozen, + // error::permission_denied(EFROZEN), + // ); event::emit_event( &mut coin_store.deposit_events, @@ -585,7 +585,7 @@ module diem_framework::coin { account::register_coin(account_addr); let coin_store = CoinStore { coin: Coin { value: 0 }, - frozen: false, + // frozen: false, deposit_events: account::new_event_handle(account), withdraw_events: account::new_event_handle(account), }; @@ -621,10 +621,10 @@ module diem_framework::coin { ); let coin_store = borrow_global_mut>(account_addr); - assert!( - !coin_store.frozen, - error::permission_denied(EFROZEN), - ); + // assert!( + // !coin_store.frozen, + // error::permission_denied(EFROZEN), + // ); event::emit_event( &mut coin_store.withdraw_events, diff --git a/framework/libra-framework/sources/modified_source/coin.spec.move b/framework/libra-framework/sources/modified_source/coin.spec.move index b53ca45d2..113f626a4 100644 --- a/framework/libra-framework/sources/modified_source/coin.spec.move +++ b/framework/libra-framework/sources/modified_source/coin.spec.move @@ -131,7 +131,7 @@ spec diem_framework::coin { coin: Coin; let coin_store = global>(account_addr); aborts_if !exists>(account_addr); - aborts_if coin_store.frozen; + // aborts_if coin_store.frozen; } /// The value of `zero_coin` must be 0. @@ -276,8 +276,8 @@ spec diem_framework::coin { aborts_if !exists>(account_addr_from); aborts_if !exists>(to); - aborts_if coin_store_from.frozen; - aborts_if coin_store_to.frozen; + // aborts_if coin_store_from.frozen; + // aborts_if coin_store_to.frozen; aborts_if coin_store_from.coin.value < amount; ensures account_addr_from != to ==> coin_store_post_from.coin.value == @@ -307,7 +307,7 @@ spec diem_framework::coin { let coin_store = global>(account_addr); let balance = coin_store.coin.value; aborts_if !exists>(account_addr); - aborts_if coin_store.frozen; + // aborts_if coin_store.frozen; aborts_if balance < amount; } diff --git a/framework/libra-framework/sources/modified_source/genesis.move b/framework/libra-framework/sources/modified_source/genesis.move index 923b0dcf2..9e4987251 100644 --- a/framework/libra-framework/sources/modified_source/genesis.move +++ b/framework/libra-framework/sources/modified_source/genesis.move @@ -27,11 +27,11 @@ module diem_framework::genesis { //////// 0L //////// use diem_framework::validator_universe; - // use ol_framework::ol_account; + use ol_framework::ol_account; use ol_framework::musical_chairs; use ol_framework::proof_of_fee; use ol_framework::slow_wallet; - use ol_framework::gas_coin::{Self, LibraCoin as GasCoin}; + use ol_framework::gas_coin; use ol_framework::infra_escrow; use ol_framework::tower_state; use ol_framework::safe; @@ -44,6 +44,8 @@ module diem_framework::genesis { use ol_framework::testnet; use ol_framework::epoch_boundary; use ol_framework::sacred_cows; + #[test_only] + use ol_framework::gas_coin::LibraCoin as GasCoin; //////// end 0L //////// @@ -228,15 +230,12 @@ module diem_framework::genesis { /// This creates an funds an account if it doesn't exist. /// If it exists, it just returns the signer. - fun create_account(_diem_framework: &signer, account_address: address, _balance: u64): signer { - if (account::exists_at(account_address)) { - create_signer(account_address) - } else { - let account = account::create_account(account_address); - // coin::register(&account); - coin::register(&account); - account - } + fun create_account(diem_framework: &signer, account_address: address, _balance: u64): signer { + if (!account::exists_at(account_address)) { + ol_account::create_account(diem_framework, account_address); + }; + + create_signer(account_address) } fun create_initialize_validators_with_commission( @@ -255,13 +254,15 @@ module diem_framework::genesis { register_one_genesis_validator(diem_framework, validator, false); vector::push_back(&mut val_addr_list, *&validator.validator_config.owner_address); // 0x1 code account is calling this contract but the 0x0 VM address is authorized for infra escrow. - infra_escrow::genesis_coin_validator(&create_signer(@0x0), *&validator.validator_config.owner_address); - if (testnet::is_not_mainnet()) { - let sig = create_signer(validator.validator_config.owner_address); - proof_of_fee::set_bid(&sig, 0900, 1000); // make the genesis - // default 90% to align with thermostatic rule in the PoF paper. - // otherwise the thermostatic rule starts kicking-in immediately + infra_escrow::genesis_coin_validator(&create_signer(@0x0), + *&validator.validator_config.owner_address); + + // default 90% to align with thermostatic rule in the PoF paper. + // otherwise the thermostatic rule starts kicking-in immediately + let sig = create_signer(validator.validator_config.owner_address); + proof_of_fee::set_bid(&sig, 0900, 1000); // make the genesis + if (testnet::is_not_mainnet()) { // TODO: this is for testnet purposes only // unlock some of the genesis validators coins so they can issue // transactions from epoch 0 in test runners. diff --git a/framework/libra-framework/sources/modified_source/transaction_fee.move b/framework/libra-framework/sources/modified_source/transaction_fee.move index 68b1dc865..3c537d3a5 100644 --- a/framework/libra-framework/sources/modified_source/transaction_fee.move +++ b/framework/libra-framework/sources/modified_source/transaction_fee.move @@ -348,6 +348,7 @@ module diem_framework::transaction_fee { // Initialization. let (burn_cap, mint_cap) = gas_coin::initialize_for_test(&root); + gas_coin::test_set_final_supply(&root, 100); store_diem_coin_burn_cap(&root, burn_cap); initialize_fee_collection_and_distribution(&root, 10); diff --git a/framework/libra-framework/sources/ol_sources/burn.move b/framework/libra-framework/sources/ol_sources/burn.move index 781f45a29..c0977e022 100644 --- a/framework/libra-framework/sources/ol_sources/burn.move +++ b/framework/libra-framework/sources/ol_sources/burn.move @@ -52,10 +52,13 @@ module ol_framework::burn { /// is much larger than the amount of fees available burn. /// So we need to find the proportion of the fees that each Fee Maker has /// produced, and then do a weighted burn/recycle. + /// @return a tuple of 2 + /// 0: BOOL, if epoch burn ran correctly + /// 1: U64, how many coins burned public fun epoch_burn_fees( vm: &signer, coins: &mut Coin, - ) acquires UserBurnPreference, BurnCounter { + ): (bool, u64) acquires UserBurnPreference, BurnCounter { system_addresses::assert_ol(vm); // get the total fees made. This will likely be different than @@ -63,12 +66,10 @@ module ol_framework::burn { let total_fees_made = fee_maker::get_all_fees_made(); // extract fees - // let coins = transaction_fee::root_withdraw_all(vm); - let available_to_burn = coin::value(coins); if (available_to_burn == 0) { // don't destroy, let the caller handle empty coins - return + return (false, 0) }; // get the list of fee makers @@ -102,6 +103,7 @@ module ol_framework::burn { let leftover = coin::extract(coins, remainder); burn_and_track(leftover); // Note: we are still retruning an empty coin to be destroyed by the caller + (true, total_fees_made) } @@ -179,4 +181,4 @@ module ol_framework::burn { //////// TEST HELPERS //////// -} \ No newline at end of file +} diff --git a/framework/libra-framework/sources/ol_sources/demo.spec.move b/framework/libra-framework/sources/ol_sources/demo.spec.move index 322cb6771..737e2317b 100644 --- a/framework/libra-framework/sources/ol_sources/demo.spec.move +++ b/framework/libra-framework/sources/ol_sources/demo.spec.move @@ -1,46 +1,23 @@ spec ol_framework::demo { spec module { pragma verify = true; - pragma aborts_if_is_strict; } -// spec set_version(account: &signer, major: u64) { -// use std::signer; -// use diem_framework::chain_status; -// use diem_framework::timestamp; -// use diem_framework::stake; -// use diem_framework::coin::CoinInfo; -// use diem_framework::gas_coin::GasCoin; -// use diem_framework::transaction_fee; -// // use diem_framework::staking_config; -// // Not verified when verify_duration_estimate > vc_timeout -// pragma verify_duration_estimate = 120; // TODO: set because of timeout (property proved). -// include transaction_fee::RequiresCollectedFeesPerValueLeqBlockDiemSupply; -// // include staking_config::StakingRewardsConfigRequirement; -// requires chain_status::is_operating(); -// requires timestamp::spec_now_microseconds() >= reconfiguration::last_reconfiguration_time(); -// requires exists(@diem_framework); -// requires exists>(@diem_framework); - -// aborts_if !exists(signer::address_of(account)); -// aborts_if !exists(@diem_framework); - -// let old_major = global(@diem_framework).major; -// aborts_if !(old_major < major); -// } + spec print_this(account: &signer) { + // should not abort + pragma aborts_if_is_strict; + } -// /// Abort if resource already exists in `@diem_framwork` when initializing. -// spec initialize(diem_framework: &signer, initial_version: u64) { -// use std::signer; + // TODO in strict mode + spec set_message(account: &signer, message: string::String) { + // pragma aborts_if_is_strict; + // let events = borrow_global(signer::address_of(account)).message_change_events; + // aborts_if event::counter(events) > MAX_U64; + } -// aborts_if signer::address_of(diem_framework) != @diem_framework; -// aborts_if exists(@diem_framework); -// aborts_if exists(@diem_framework); -// } + spec get_message(addr: address): string::String { + pragma aborts_if_is_strict; + aborts_if !exists(addr); -// /// This module turns on `aborts_if_is_strict`, so need to add spec for test function `initialize_for_test`. -// spec initialize_for_test { -// // Don't verify test functions. -// pragma verify = false; -// } + } } diff --git a/framework/libra-framework/sources/ol_sources/epoch_boundary.move b/framework/libra-framework/sources/ol_sources/epoch_boundary.move index 352e107a3..4b3455ac5 100644 --- a/framework/libra-framework/sources/ol_sources/epoch_boundary.move +++ b/framework/libra-framework/sources/ol_sources/epoch_boundary.move @@ -35,7 +35,7 @@ module diem_framework::epoch_boundary { // I just checked in, to see what condition my condition was in. - struct BoundaryStatus has key { + struct BoundaryStatus has key, drop { security_bill_count: u64, security_bill_amount: u64, security_bill_success: bool, @@ -61,9 +61,11 @@ module diem_framework::epoch_boundary { oracle_pay_amount: u64, oracle_pay_success: bool, - epoch_burn_fees: u64, // TODO - epoch_burn_success: bool, // TODO - slow_wallet_drip: bool, // TODO + epoch_burn_fees: u64, + epoch_burn_success: bool, + + slow_wallet_drip_amount: u64, + slow_wallet_drip_success: bool, // Process Incoming // musical chairs incoming_compliant: vector
, @@ -85,8 +87,8 @@ module diem_framework::epoch_boundary { incoming_final_set_size: u64, incoming_reconfig_success: bool, - infra_subsize_amount: u64, // TODO - infra_subsizize_success: bool, // TODO + infra_subsidize_amount: u64, // TODO + infra_subsidize_success: bool, // TODO pof_thermo_success: bool, pof_thermo_increase: bool, @@ -95,7 +97,12 @@ module diem_framework::epoch_boundary { public fun initialize(framework: &signer) { if (!exists(@ol_framework)){ - move_to(framework, BoundaryStatus { + move_to(framework, reset()); + } + } + + fun reset(): BoundaryStatus { + BoundaryStatus { security_bill_count: 0, security_bill_amount: 0, security_bill_success: false, @@ -123,7 +130,9 @@ module diem_framework::epoch_boundary { oracle_pay_success: false, epoch_burn_fees: 0, epoch_burn_success: false, - slow_wallet_drip: false, + + slow_wallet_drip_amount: 0, + slow_wallet_drip_success: false, // Process Incoming incoming_compliant: vector::empty(), incoming_compliant_count: 0, @@ -141,14 +150,13 @@ module diem_framework::epoch_boundary { incoming_actual_vals: vector::empty(), incoming_reconfig_success: false, - infra_subsize_amount: 0, - infra_subsizize_success: false, + infra_subsidize_amount: 0, + infra_subsidize_success: false, pof_thermo_success: false, pof_thermo_increase: false, pof_thermo_amount: 0, - }); - } + } } @@ -159,6 +167,7 @@ module diem_framework::epoch_boundary { system_addresses::assert_ol(root); let status = borrow_global_mut(@ol_framework); + *status = reset(); // bill root service fees; root_service_billing(root, status); // run the transactions of donor directed accounts @@ -171,6 +180,7 @@ module diem_framework::epoch_boundary { status.set_fee_makers_success = fee_maker::epoch_reset_fee_maker(root); // randomize the Tower/Oracle difficulty tower_state::reconfig(root); + status.tower_state_success = true; // TODO: there isn't much to check here. let (compliant_vals, n_seats) = musical_chairs::stop_the_music(root, closing_epoch); status.incoming_compliant_count = vector::length(&compliant_vals); @@ -180,12 +190,16 @@ module diem_framework::epoch_boundary { settle_accounts(root, compliant_vals, status); // drip coins - slow_wallet::on_new_epoch(root); + let (s_success, s_amount) = slow_wallet::on_new_epoch(root); + status.slow_wallet_drip_amount = s_amount; + status.slow_wallet_drip_success = s_success; // ======= THIS IS APPROXIMATELY THE BOUNDARY ===== process_incoming_validators(root, status, compliant_vals, n_seats); - subsidize_from_infra_escrow(root); + let (i_success, i_fee) = subsidize_from_infra_escrow(root); + status.infra_subsidize_amount = i_fee; + status.infra_subsidize_success = i_success; let (t_success, t_increase, t_amount) = proof_of_fee::reward_thermostat(root); @@ -237,13 +251,15 @@ module diem_framework::epoch_boundary { let (count, amount) = oracle::epoch_boundary(root, &mut oracle_budget); status.oracle_pay_count = count; status.oracle_pay_amount = amount; - status.oracle_pay_success = status.oracle_budget == amount; + status.oracle_pay_success = (amount > 0); // in case there is any dust left ol_account::merge_coins(&mut all_fees, oracle_budget); }; // remainder gets burnt according to fee maker preferences - burn::epoch_burn_fees(root, &mut all_fees); + let (b_success, b_fees) = burn::epoch_burn_fees(root, &mut all_fees); + status.epoch_burn_success = b_success; + status.epoch_burn_fees = b_fees; // coin can finally be destroyed. Up to here we have been extracting from a mutable. // It's possible there might be some dust, that should get burned @@ -317,14 +333,15 @@ module diem_framework::epoch_boundary { } // set up rewards subsidy for coming epoch - fun subsidize_from_infra_escrow(root: &signer) { + fun subsidize_from_infra_escrow(root: &signer): (bool, u64) { system_addresses::assert_ol(root); let (reward_per, _, _, _ ) = proof_of_fee::get_consensus_reward(); let vals = stake::get_current_validators(); let count_vals = vector::length(&vals); count_vals = count_vals + ORACLE_PROVIDERS_SEATS; let total_epoch_budget = count_vals * reward_per; - infra_escrow::epoch_boundary_collection(root, total_epoch_budget); + infra_escrow::epoch_boundary_collection(root, + total_epoch_budget) } // all services the root collective security is billing for @@ -368,4 +385,4 @@ module diem_framework::epoch_boundary { epoch_boundary(vm, closing_epoch, epoch_round); } -} \ No newline at end of file +} diff --git a/framework/libra-framework/sources/ol_sources/infra_escrow.move b/framework/libra-framework/sources/ol_sources/infra_escrow.move index 98d1727e0..24f2f69c3 100644 --- a/framework/libra-framework/sources/ol_sources/infra_escrow.move +++ b/framework/libra-framework/sources/ol_sources/infra_escrow.move @@ -48,19 +48,26 @@ module ol_framework::infra_escrow{ } /// Helper for epoch boundaries. - /// Collects funds from pledge and places temporarily in network account (TransactionFee account) - public(friend) fun epoch_boundary_collection(root: &signer, amount: u64) { + /// Collects funds from pledge and places temporarily in network account + // (the TransactionFee account) + /// @return tuple of 2 + /// 0: if collection succeeded + /// 1: how much was collected + public(friend) fun epoch_boundary_collection(root: &signer, amount: u64): + (bool, u64) { system_addresses::assert_ol(root); let opt = pledge_accounts::withdraw_from_all_pledge_accounts(root, amount); if (option::is_none(&opt)) { option::destroy_none(opt); - return + return (false, 0) }; let c = option::extract(&mut opt); option::destroy_none(opt); - - transaction_fee::vm_pay_fee(root, @vm_reserved, c); // don't attribute to the user + let value = coin::value(&c); + transaction_fee::vm_pay_fee(root, @vm_reserved, c); // don't attribute + // to the user + return(true, value) } @@ -101,4 +108,4 @@ module ol_framework::infra_escrow{ option::destroy_none(c_opt); } } -} \ No newline at end of file +} diff --git a/framework/libra-framework/sources/ol_sources/libra_coin.move b/framework/libra-framework/sources/ol_sources/libra_coin.move index 683acb57f..e79b3c0a9 100644 --- a/framework/libra-framework/sources/ol_sources/libra_coin.move +++ b/framework/libra-framework/sources/ol_sources/libra_coin.move @@ -162,7 +162,7 @@ module ol_framework::gas_coin { } /// Can only called during genesis to initialize the Diem coin. - public(friend) fun initialize(diem_framework: &signer) { + public(friend) fun initialize(diem_framework: &signer) acquires FinalMint { system_addresses::assert_diem_framework(diem_framework); let (burn_cap, freeze_cap, mint_cap) = coin::initialize_with_parallelizable_supply( @@ -177,8 +177,11 @@ module ol_framework::gas_coin { // have been initialized. move_to(diem_framework, MintCapStore { mint_cap }); + coin::destroy_freeze_cap(freeze_cap); coin::destroy_burn_cap(burn_cap); + + genesis_set_final_supply(diem_framework, 1000) } /// FOR TESTS ONLY @@ -260,10 +263,13 @@ module ol_framework::gas_coin { /// get the gas coin supply. Helper which wraps coin::supply and extracts option type // NOTE: there is casting between u128 and u64, but 0L has final supply below the u64. public fun supply(): u64 { + let supply_opt = coin::supply(); if (option::is_some(&supply_opt)) { let value = *option::borrow(&supply_opt); - assert!(value <= MAX_U64, ESUPPLY_OVERFLOW); + spec { + assume value < MAX_U64; + }; return (value as u64) }; 0 diff --git a/framework/libra-framework/sources/ol_sources/mock.move b/framework/libra-framework/sources/ol_sources/mock.move index d6c91905b..c48b39e57 100644 --- a/framework/libra-framework/sources/ol_sources/mock.move +++ b/framework/libra-framework/sources/ol_sources/mock.move @@ -194,7 +194,9 @@ module ol_framework::mock { i = i + 1; }; - if (drip) slow_wallet::slow_wallet_epoch_drip(root, amount); + if (drip) { + slow_wallet::slow_wallet_epoch_drip(root, amount); + }; gas_coin::restore_mint_cap(root, mint_cap); } diff --git a/framework/libra-framework/sources/ol_sources/musical_chairs.move b/framework/libra-framework/sources/ol_sources/musical_chairs.move index 69faa7e25..2d209298e 100644 --- a/framework/libra-framework/sources/ol_sources/musical_chairs.move +++ b/framework/libra-framework/sources/ol_sources/musical_chairs.move @@ -3,7 +3,6 @@ module ol_framework::musical_chairs { use diem_framework::system_addresses; use diem_framework::stake; use ol_framework::grade; - // use ol_framework::testnet; use std::fixed_point32; use std::vector; // use diem_std::debug::print; @@ -13,7 +12,7 @@ module ol_framework::musical_chairs { struct Chairs has key { // The number of chairs in the game seats_offered: u64, - // A small history, for future use. + // TODO: A small history, for future use. history: vector, } @@ -79,7 +78,9 @@ module ol_framework::musical_chairs { let num_compliant_nodes = vector::length(&compliant_vals); - // failover, there should not be more compliant nodes than seats that were offered. + // failover, there should not be more compliant nodes than seats that + // were offered. + // return with no changes if (num_compliant_nodes > chairs.seats_offered) { return (compliant_vals, chairs.seats_offered) diff --git a/framework/libra-framework/sources/ol_sources/ol_account.move b/framework/libra-framework/sources/ol_sources/ol_account.move index 7bb976116..82d961b55 100644 --- a/framework/libra-framework/sources/ol_sources/ol_account.move +++ b/framework/libra-framework/sources/ol_sources/ol_account.move @@ -3,6 +3,7 @@ module ol_framework::ol_account { use diem_framework::coin::{Self, Coin}; use diem_framework::event::{EventHandle, emit_event}; use diem_framework::system_addresses; + use diem_framework::chain_status; use std::error; use std::signer; use std::option::{Self, Option}; @@ -41,6 +42,15 @@ module ol_framework::ol_account { /// On legacy account migration we need to check if we rotated auth keys correctly and can find the user address. const ECANT_MATCH_ADDRESS_IN_LOOKUP: u64 = 7; + /// trying to transfer zero coins + const EZERO_TRANSFER: u64 = 8; + + /// why is VM trying to use this? + const ENOT_FOR_VM: u64 = 9; + + + + struct BurnTracker has key { prev_supply: u64, @@ -71,17 +81,6 @@ module ol_framework::ol_account { (resource_account_sig, cap) } - // /// Creates an account by sending an initial amount of GAS to it. - // public entry fun create_user_account_by_coin(sender: &signer, auth_key: address, amount: u64) { - // // warn early before attempting to creat the account. - // let limit = slow_wallet::unlocked_amount(signer::address_of(sender)); - // assert!(amount < limit, error::invalid_state(EINSUFFICIENT_BALANCE)); - - // create_impl(auth_key); - // // use the proper tracking - // transfer(sender, auth_key, amount); - // } - fun create_impl(auth_key: address) { let new_signer = account::create_account(auth_key); coin::register(&new_signer); @@ -189,9 +188,19 @@ module ol_framework::ol_account { /// Withdraw funds while respecting the transfer limits public fun withdraw(sender: &signer, amount: u64): Coin acquires BurnTracker { + spec { + assume !system_addresses::signer_is_ol_root(sender); + assume chain_status::is_operating(); + }; + // 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. + let addr = signer::address_of(sender); + assert!(amount > 0, error::invalid_argument(EZERO_TRANSFER)); + let limit = slow_wallet::unlocked_amount(addr); - assert!(amount < limit, error::invalid_state(EINSUFFICIENT_BALANCE)); + assert!(amount <= limit, error::invalid_state(EINSUFFICIENT_BALANCE)); slow_wallet::maybe_track_unlocked_withdraw(addr, amount); let coin = coin::withdraw(sender, amount); // the outgoing coins should trigger an update on this account @@ -208,7 +217,6 @@ module ol_framework::ol_account { if (!account::exists_at(recipient)) { // creates the account address (with the same bytes as the authentication key). create_impl(recipient); - // return }; @@ -326,10 +334,16 @@ module ol_framework::ol_account { let addr = signer::address_of(sig); if (exists(addr)) return; + let prev_supply = if (chain_status::is_genesis()) { + gas_coin::get_final_supply() + } else { + gas_coin::supply() + }; + let (_, current_user_balance) = balance(addr); move_to(sig, BurnTracker { - prev_supply: gas_coin::supply(), + prev_supply, prev_balance: current_user_balance, burn_at_last_calc: 0, cumu_burn: 0, @@ -365,6 +379,10 @@ module ol_framework::ol_account { // only track when the attributable is > 1. Otherwise the // whole chain of updates will be incorrect if (attributed_burn > 0) { + spec { + assume (state.burn_at_last_calc + attributed_burn) < MAX_U64; + }; + state.cumu_burn = state.burn_at_last_calc + attributed_burn; // now change last calc state.burn_at_last_calc = attributed_burn; 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 b794b3f9c..e78a0c0bb 100644 --- a/framework/libra-framework/sources/ol_sources/ol_account.spec.move +++ b/framework/libra-framework/sources/ol_sources/ol_account.spec.move @@ -1,7 +1,10 @@ spec ol_framework::ol_account { spec module { pragma verify = true; - pragma aborts_if_is_strict; + // pragma aborts_if_is_strict; + invariant [suspendable] chain_status::is_operating() ==> exists(@diem_framework); + invariant [suspendable] chain_status::is_operating() ==> exists>(@diem_framework); + } // /// Check if the bytes of the auth_key is 32. @@ -26,9 +29,31 @@ spec ol_framework::ol_account { len(authentication_key) != 32 } - // spec transfer(source: &signer, to: address, amount: u64) { - // pragma verify = false; - // } + // ol_account::withdraw can never use more than the slow wallet limit + 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 balance = coin_store.coin.value; + + aborts_if balance < amount; + + // in the case of slow wallets + let slow_store = global(account_addr); + aborts_if exists(account_addr) && + slow_store.unlocked < 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); + } spec assert_account_exists(addr: address) { aborts_if !account::exists_at(addr); diff --git a/framework/libra-framework/sources/ol_sources/oracle.move b/framework/libra-framework/sources/ol_sources/oracle.move index 0d715c2d1..831a3a613 100644 --- a/framework/libra-framework/sources/ol_sources/oracle.move +++ b/framework/libra-framework/sources/ol_sources/oracle.move @@ -226,7 +226,9 @@ module ol_framework::oracle { global.proofs_in_epoch_above_thresh = global.proofs_in_epoch_above_thresh + 1; // also add to the provider list which would be elegible for rewards let provider_list = borrow_global_mut(@ol_framework); - vector::push_back(&mut provider_list.current_above_threshold, provider_addr); + if (!vector::contains(&provider_list.current_above_threshold, &provider_addr)) { + vector::push_back(&mut provider_list.current_above_threshold, provider_addr); + } }; } @@ -352,4 +354,4 @@ module ol_framework::oracle { return s.count_proofs_in_epoch } -} \ No newline at end of file +} diff --git a/framework/libra-framework/sources/ol_sources/sacred_cows.move b/framework/libra-framework/sources/ol_sources/sacred_cows.move index 71199717e..5eca5afaf 100644 --- a/framework/libra-framework/sources/ol_sources/sacred_cows.move +++ b/framework/libra-framework/sources/ol_sources/sacred_cows.move @@ -107,7 +107,7 @@ module ol_framework::sacred_cows { /// how much each slow wallet gets unlocked at every epoch. Read below. /////////////////////////////////////////// /// TODO: v7: THIS NEEDS TO BE RECALCULATED WITH THE NEW SUPPLY! - const SLOW_WALLET_EPOCH_DRIP: u64 = 100000; + const SLOW_WALLET_EPOCH_DRIP: u64 = 30000 * 1000000; // COINS * SCALING FACTOR /////////////////////////////////////////// /// [SLOW_WALLET_EPOCH_DRIP] This is a principal economic innovation from 0L. /// How to reward the highest level of work with more benefits, @@ -230,6 +230,8 @@ module ol_framework::sacred_cows { // only called by genesis which can spoof a signer for 0x2. public(friend) fun init(zero_x_two_sig: &signer) { chain_status::assert_genesis(); + let addr = signer::address_of(zero_x_two_sig); + assert!( addr == @0x2, error::invalid_state(ENOT_OX2)); bless_this_cow(zero_x_two_sig, SLOW_WALLET_EPOCH_DRIP); } @@ -243,6 +245,8 @@ module ol_framework::sacred_cows { /// initialize the state /// DEVS: this should not be a public function. It should only be callable from genesis fun bless_this_cow(zero_x_two_sig: &signer, value: u64) { + chain_status::assert_genesis(); + let addr = signer::address_of(zero_x_two_sig); assert!( addr == @0x2, error::invalid_state(ENOT_OX2)); assert!(!exists>(addr), error::invalid_state(EALREADY_INITIALIZED)); @@ -252,7 +256,8 @@ module ol_framework::sacred_cows { } // get the stored value - fun get_stored(): u64 acquires SacredCow { + public fun get_stored(): u64 acquires SacredCow { + if (!exists>(@0x2)) return 0; let stored = borrow_global_mut>(@0x2); stored.value } @@ -263,4 +268,4 @@ module ol_framework::sacred_cows { assert_same(stored, SLOW_WALLET_EPOCH_DRIP); SLOW_WALLET_EPOCH_DRIP } -} \ No newline at end of file +} diff --git a/framework/libra-framework/sources/ol_sources/sacred_cows.spec.move b/framework/libra-framework/sources/ol_sources/sacred_cows.spec.move index 6298c220d..79706e0f1 100644 --- a/framework/libra-framework/sources/ol_sources/sacred_cows.spec.move +++ b/framework/libra-framework/sources/ol_sources/sacred_cows.spec.move @@ -4,6 +4,43 @@ spec ol_framework::sacred_cows { pragma verify = true; pragma aborts_if_is_strict; - invariant [suspendable] chain_status::is_operating() ==> exists>(@0x2); + invariant [suspendable] chain_status::is_operating() ==> + exists>(@0x2); + + invariant [suspendable] chain_status::is_operating() ==> + borrow_global>(@0x2).value == 30000 * 1000000; + } + + // only 0x2 can init + spec init(zero_x_two_sig: &signer) { + use std::signer; + aborts_if signer::address_of(zero_x_two_sig) != @0x2; + aborts_if exists>(@0x2); + + } + + // only 0x2 can init + spec get_stored(): u64 { + + } + + // only 0x2 can init + spec assert_same(stored: u64, code: u64) { + aborts_if stored != code; + } + + // only 0x2 can init + spec bless_this_cow(zero_x_two_sig: &signer, value: u64) { + use std::signer; + use diem_framework::chain_status; + aborts_if signer::address_of(zero_x_two_sig) != @0x2; + aborts_if exists>(@0x2); + aborts_if !chain_status::is_genesis(); + } + + + spec get_slow_drip_const(): u64 { + aborts_if !exists>(@0x2); + aborts_if borrow_global>(@0x2).value != SLOW_WALLET_EPOCH_DRIP; } } diff --git a/framework/libra-framework/sources/ol_sources/slow_wallet.move b/framework/libra-framework/sources/ol_sources/slow_wallet.move index 0198d938b..b25967096 100644 --- a/framework/libra-framework/sources/ol_sources/slow_wallet.move +++ b/framework/libra-framework/sources/ol_sources/slow_wallet.move @@ -24,6 +24,10 @@ module ol_framework::slow_wallet { const EGENESIS_ERROR: u64 = 1; + + /// Maximum possible aggregatable coin value. + const MAX_U64: u128 = 18446744073709551615; + struct SlowWallet has key { unlocked: u64, transferred: u64, @@ -104,18 +108,48 @@ module ol_framework::slow_wallet { } } - public fun slow_wallet_epoch_drip(vm: &signer, amount: u64) acquires SlowWallet, SlowWalletList{ + /// VM causes the slow wallet to unlock by X amount + /// @return tuple of 2 + /// 0: bool, was this successful + // 1: u64, how much was dripped + public fun slow_wallet_epoch_drip(vm: &signer, amount: u64): (bool, u64) acquires + SlowWallet, SlowWalletList{ + system_addresses::assert_ol(vm); let list = get_slow_list(); + let len = vector::length
(&list); + if (len == 0) return (false, 0); + let accounts_updated = 0; let i = 0; - while (i < vector::length
(&list)) { + while (i < len) { let addr = vector::borrow
(&list, i); - let total = coin::balance(*addr); + let user_balance = coin::balance(*addr); + if (!exists(*addr)) continue; // NOTE: formal verifiction caught + // this, not sure how it's possible + let state = borrow_global_mut(*addr); + + // TODO implement this as a `spec` + if ((state.unlocked as u128) + (amount as u128) >= MAX_U64) continue; + let next_unlock = state.unlocked + amount; - state.unlocked = if (next_unlock > total) { total } else { next_unlock }; + state.unlocked = if (next_unlock > user_balance) { + // the user might have reached the end of the unlock period, and all + // is unlocked + user_balance + } else { + next_unlock + }; + + // it may be that some accounts were not updated, so we can't report + // success unless that was the case. + accounts_updated = accounts_updated + 1; + + i = i + 1; - } + }; + + (accounts_updated==len, amount) } /// wrapper to both attempt to adjust the slow wallet tracker @@ -128,10 +162,16 @@ module ol_framework::slow_wallet { maybe_track_unlocked_deposit(recipient, amount); } /// if a user spends/transfers unlocked coins we need to track that spend - public(friend) fun maybe_track_unlocked_withdraw(payer: address, amount: u64) acquires SlowWallet { + public(friend) fun maybe_track_unlocked_withdraw(payer: address, amount: + u64) acquires SlowWallet { + if (!exists(payer)) return; let s = borrow_global_mut(payer); + spec { + assume s.transferred + amount < MAX_U64; + }; + s.transferred = s.transferred + amount; // THE VM is able to overdraw an account's unlocked amount. @@ -157,9 +197,13 @@ module ol_framework::slow_wallet { state.unlocked = state.unlocked + amount; } - public fun on_new_epoch(vm: &signer) acquires SlowWallet, SlowWalletList { + /// Every epoch the system will drip a fixed amount + /// @return tuple of 2 + /// 0: bool, was this successful + // 1: u64, how much was dripped + public fun on_new_epoch(vm: &signer): (bool, u64) acquires SlowWallet, SlowWalletList { system_addresses::assert_ol(vm); - slow_wallet_epoch_drip(vm, sacred_cows::get_slow_drip_const()); + slow_wallet_epoch_drip(vm, sacred_cows::get_slow_drip_const()) } ///////// SLOW GETTERS //////// diff --git a/framework/libra-framework/sources/ol_sources/slow_wallet.spec.move b/framework/libra-framework/sources/ol_sources/slow_wallet.spec.move index 8d70da1a0..aef366e0c 100644 --- a/framework/libra-framework/sources/ol_sources/slow_wallet.spec.move +++ b/framework/libra-framework/sources/ol_sources/slow_wallet.spec.move @@ -4,8 +4,21 @@ spec ol_framework::slow_wallet { // pragma aborts_if_is_strict; } + // setting a slow wallet should abort only if there is no SlowWalletList + // present in the 0x1 address spec set_slow(sig: &signer) { - // use diem_framework:: aborts_if !exists(@ol_framework); } + + // at epoch boundaries the slow wallet drip should never abort + // if genesis is initialized properly + spec on_new_epoch(vm: &signer): (bool, u64) { + use ol_framework::sacred_cows::{SacredCow, SlowDrip}; + + aborts_if !system_addresses::signer_is_ol_root(vm); + + aborts_if !exists>(@0x2); + + aborts_if borrow_global>(@0x2).value != 30000 * 1000000; + } } diff --git a/framework/libra-framework/sources/ol_sources/tests/donor_voicetest.move b/framework/libra-framework/sources/ol_sources/tests/donor_voice.test.move similarity index 99% rename from framework/libra-framework/sources/ol_sources/tests/donor_voicetest.move rename to framework/libra-framework/sources/ol_sources/tests/donor_voice.test.move index 984f5acf1..da13f1a39 100644 --- a/framework/libra-framework/sources/ol_sources/tests/donor_voicetest.move +++ b/framework/libra-framework/sources/ol_sources/tests/donor_voice.test.move @@ -469,4 +469,3 @@ module ol_framework::test_donor_voice { assert!(lifetime_burn_now == lifetime_burn_pre, 7357011); } } - diff --git a/framework/libra-framework/sources/system_addresses.move b/framework/libra-framework/sources/system_addresses.move index 4ec88ce96..f02a63e26 100644 --- a/framework/libra-framework/sources/system_addresses.move +++ b/framework/libra-framework/sources/system_addresses.move @@ -94,4 +94,9 @@ module diem_framework::system_addresses { assert!(is_ol_framework_address(addr) || is_reserved_address(addr) || is_core_resource_address(addr) || addr == @0x2, error::permission_denied(ENOT_OL_ROOT_ADDRESS)) } + + public fun signer_is_ol_root(sig: &signer): bool { + let addr = signer::address_of(sig); + is_ol_framework_address(addr) || is_reserved_address(addr) || is_core_resource_address(addr) || addr == @0x2 + } } diff --git a/framework/releases/head.mrb b/framework/releases/head.mrb index c4ca5852818ab0f611cd19a97a320c8f04f5d497..c48254c8c88265846e886fe5d385b21b03e5dfed 100644 GIT binary patch delta 34661 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%0DiE$7RM^KnmhT7}OPN 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 X9E^ss!KmR3QD(x(Ix}H{wb}m<XJ#MV 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 HwVD3|U}zK5 diff --git a/tools/config/src/config_cli.rs b/tools/config/src/config_cli.rs index 7c2da3294..4640cc1cf 100644 --- a/tools/config/src/config_cli.rs +++ b/tools/config/src/config_cli.rs @@ -121,9 +121,17 @@ impl ConfigCli { let client = Client::new(cfg.pick_url(self.chain_name)?); if client.get_index().await.is_ok() { - account_keys.account = client + account_keys.account = match client .lookup_originating_address(account_keys.auth_key) - .await?; + .await + { + Ok(r) => r, + _ => { + println!("This looks like a new account, and it's not yet on chain. If this is not what you expected, are you sure you are using the correct recovery mnemonic?"); + // do nothing + account_keys.account + } + }; }; let profile = diff --git a/tools/config/src/fullnode_config.rs b/tools/config/src/fullnode_config.rs index 0051184aa..f7ae7bbb0 100644 --- a/tools/config/src/fullnode_config.rs +++ b/tools/config/src/fullnode_config.rs @@ -1,6 +1,6 @@ use diem_config::config::NodeConfig; use diem_types::{network_address::NetworkAddress, waypoint::Waypoint, PeerId}; -use libra_types::legacy_types::app_cfg::default_file_path; +use libra_types::global_config_dir; use std::{ collections::HashMap, path::{Path, PathBuf}, @@ -12,10 +12,10 @@ pub async fn init_fullnode_yaml(home_dir: Option) -> anyhow::Result, waypoint: Waypoint) -> anyhow::Result { - let home_dir = home_dir.unwrap_or_else(libra_types::global_config_dir); + let home_dir = home_dir.unwrap_or_else(global_config_dir); let path = home_dir.display().to_string(); let template = format!( @@ -70,7 +70,7 @@ base: from_config: '{waypoint}' execution: - genesis_file_location: '{path}/genesis.blob' + genesis_file_location: '{path}/genesis/genesis.blob' state_sync: state_sync_driver: @@ -91,14 +91,17 @@ api: /// download genesis blob pub async fn download_genesis(home_dir: Option) -> anyhow::Result<()> { - let bytes = reqwest::get("https://github.com/0xzoz/blob/raw/main/genesis.blob") - .await? - .bytes() - .await?; + let bytes = reqwest::get( + "https://github.com/0LNetworkCommunity/epoch-archive-testnet/raw/main/genesis/genesis.blob", + ) + .await? + .bytes() + .await?; - let home = home_dir.unwrap_or_else(default_file_path); - std::fs::create_dir_all(&home)?; - let p = home.join("genesis.blob"); + let home = home_dir.unwrap_or_else(global_config_dir); + let genesis_dir = home.join("genesis/"); + std::fs::create_dir_all(&genesis_dir)?; + let p = genesis_dir.join("genesis.blob"); std::fs::write(p, bytes)?; @@ -106,13 +109,16 @@ pub async fn download_genesis(home_dir: Option) -> anyhow::Result<()> { } pub async fn get_genesis_waypoint(home_dir: Option) -> anyhow::Result { - let wp_string = reqwest::get("https://raw.githubusercontent.com/0xzoz/blob/main/waypoint.txt") - .await? - .text() - .await?; + let wp_string = reqwest::get( + "https://github.com/0LNetworkCommunity/epoch-archive-testnet/raw/main/genesis/waypoint.txt", + ) + .await? + .text() + .await?; - let home = home_dir.unwrap_or_else(default_file_path); - let p = home.join("waypoint.txt"); + let home = home_dir.unwrap_or_else(libra_types::global_config_dir); + let genesis_dir = home.join("genesis/"); + let p = genesis_dir.join("waypoint.txt"); std::fs::write(p, &wp_string)?; diff --git a/tools/genesis/Makefile b/tools/genesis/Makefile index 3ba1f0ee9..e0d753414 100644 --- a/tools/genesis/Makefile +++ b/tools/genesis/Makefile @@ -9,9 +9,8 @@ FUTURE_USES = 0.70 endif ifndef RECOVERY_FILE -# RECOVERY_FILE = v5_recovery -RECOVERY_FILE = sample_export_recovery - +# RECOVERY_FILE = +RECOVERY_FILE = ./tests/fixtures/v5_recovery.json endif ifndef YEARS @@ -19,7 +18,7 @@ YEARS = 7 endif ifndef CHAIN -CHAIN = testnet +CHAIN = mainnet endif ifndef GIT_ORG @@ -27,17 +26,39 @@ GIT_ORG = 0LNetworkCommunity endif ifndef GIT_REPO -GIT_REPO = genesis-smoke +GIT_REPO = release-v6.9.0-rc.0-genesis-7 endif +install: + cargo build --release -p libra -p libra-genesis-tools -p libra-framework + cp ../../target/release/libra* ~/.cargo/bin/ + +register: + libra-genesis-tools register --org-github ${GIT_ORG} --name-github ${GIT_REPO} +# have cli tools use localhost + libra config fix --force-url http://localhost:8080 + +legacy: +### Fetch Ancestry Data, Snapshot, and Use v5.2 codebase and snapshot to generate recovery.json for seeding v6.9.x state + sudo rm -Rf ~/libra-recovery && mkdir -p ~/libra-recovery + wget https://github.com/0LNetworkCommunity/epoch-archive/raw/main/670.tar.gz -O ~/libra-recovery/670.tar.gz + cd ~/libra-recovery && tar -xvzf 670.tar.gz + wget https://raw.githubusercontent.com/sirouk/ol-data-extraction/v-6.9.x-ready/assets/data.json -O ~/libra-recovery/v5_ancestry.json + + sudo rm -Rf ~/libra-legacy-v6 + cd ~ && git clone -b v6 https://github.com/0LNetworkCommunity/libra-legacy-v6 + cd ~/libra-legacy-v6/ol/genesis-tools + cargo r -p ol-genesis-tools -- --export-json ~/libra-recovery/v5_recovery.json --snapshot-path ~/libra-recovery/670/state_ver* --ancestry-file ~/libra-recovery/v5_ancestry.json + cp -f ~/libra-recovery/v5_recovery.json ~/libra-framework/tools/genesis/tests/fixtures/v5_recovery.json + md5sum ~/libra-framework/tools/genesis/tests/fixtures/v5_recovery.json" genesis: stdlib - cargo r -- \ + libra-genesis-tools \ -c ${CHAIN} \ genesis --org-github ${GIT_ORG} \ --name-github ${GIT_REPO} \ --local-framework \ - --json-legacy ./tests/fixtures/${RECOVERY_FILE}.json \ + --json-legacy ${RECOVERY_FILE} \ --target-supply ${TARGET_SUPPLY} \ --target-future-uses ${FUTURE_USES} \ --years-escrow ${YEARS} \ @@ -45,32 +66,24 @@ genesis: stdlib --map-dd-to-slow 2B0E8325DEA5BE93D856CFDE2D0CBA12 -wizard: - cargo r -- -c ${CHAIN} \ - wizard --org-github ${GIT_ORG} \ - --name-github ${GIT_REPO} \ - --local-framework \ - --json-legacy ./tests/fixtures/${RECOVERY_FILE}.json \ - --target-supply ${TARGET_SUPPLY} \ - --target-future-uses ${FUTURE_USES} \ - --years-escrow ${YEARS} \ - --map-dd-to-slow 3A6C51A0B786D644590E8A21591FA8E2 \ - --map-dd-to-slow 2B0E8325DEA5BE93D856CFDE2D0CBA12 - stdlib: - cargo r -p libra-framework -- release + libra-framework release + +############ TESTNET HELPERS ################ + -git-fetch: +testnet: testnet-git-fetch testnet-stdlib testnet-genesis testnet-node + +testnet-git-fetch: @echo WILL RESET GIT AND PULL LATEST COMMIT git reset --hard && git pull -f -testnet: git-fetch stdlib test-genesis node - -test-node: - cargo r -p libra -- node +testnet-stdlib: + cargo r -p libra-framework -- release -node: - diem-node -f ~/.libra/validator.yaml +testnet-node: +# assumes you have done `install` above + libra node ifndef ALICE_IP ALICE_IP = 134.209.32.159 @@ -84,7 +97,7 @@ ifndef CAROL_IP CAROL_IP = 165.22.34.98 endif -test-genesis: +testnet-genesis: LIBRA_CI=1 cargo r -- \ -c ${CHAIN} testnet \ -m ${PERSONA} \ diff --git a/tools/txs/tests/transfer.rs b/tools/txs/tests/transfer.rs index 1130d269a..188ac3610 100644 --- a/tools/txs/tests/transfer.rs +++ b/tools/txs/tests/transfer.rs @@ -109,12 +109,10 @@ async fn smoke_transfer_estimate() { url: Some(s.api_endpoint.clone()), tx_profile: None, tx_cost: Some(TxCost::default_cheap_txs_cost()), - estimate_only: true, + estimate_only: true, // THIS IS THE TEST }; - cli.run() - .await - .expect("cli could not create and transfer to new account"); + cli.run().await.expect("could not get estimate"); // NOTE: This should not fail } diff --git a/types/src/move_resource/gas_coin.rs b/types/src/move_resource/gas_coin.rs index 557906c29..cc8981c8c 100644 --- a/types/src/move_resource/gas_coin.rs +++ b/types/src/move_resource/gas_coin.rs @@ -39,7 +39,7 @@ pub fn cast_decimal_to_coin(decimal: f64) -> u64 { // #[cfg_attr(any(test, feature = "fuzzing"), derive(Arbitrary))] pub struct GasCoinStoreResource { coin: u64, - frozen: bool, + // frozen: bool, deposit_events: EventHandle, withdraw_events: EventHandle, } @@ -47,13 +47,13 @@ pub struct GasCoinStoreResource { impl GasCoinStoreResource { pub fn new( coin: u64, - frozen: bool, + // frozen: bool, deposit_events: EventHandle, withdraw_events: EventHandle, ) -> Self { Self { coin, - frozen, + // frozen, deposit_events, withdraw_events, } @@ -63,9 +63,9 @@ impl GasCoinStoreResource { self.coin } - pub fn frozen(&self) -> bool { - self.frozen - } + // pub fn frozen(&self) -> bool { + // self.frozen + // } pub fn deposit_events(&self) -> &EventHandle { &self.deposit_events diff --git a/util/dev-setup.sh b/util/dev-setup.sh deleted file mode 100644 index e87a3bd05..000000000 --- a/util/dev-setup.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -# Ubuntu -apt-get update - -apt install -y build-essential lld pkg-config libssl-dev libclang-dev libgmp-dev - -# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - -snap install sccache - -echo [build]$'\n'rustc-wrapper = $(which sccache) > $HOME/.cargo/config.toml  diff --git a/util/dev_setup.sh b/util/dev_setup.sh new file mode 100644 index 000000000..eb074c791 --- /dev/null +++ b/util/dev_setup.sh @@ -0,0 +1,1085 @@ +#!/bin/bash +# Copyright © Diem Foundation +# Parts of the project are originally copyright © Meta Platforms, Inc. +# SPDX-License-Identifier: Apache-2.0 + +# This script sets up the environment for the build by installing necessary dependencies. +# +# Usage ./dev_setup.sh +# v - verbose, print all statements + +# Assumptions for nix systems: +# 1 The running user is the user who will execute the builds. +# 2 .profile will be used to configure the shell +# 3 ${HOME}/bin/, or ${INSTALL_DIR} is expected to be on the path - hashicorp tools/etc. will be installed there on linux systems. + +# fast fail. +set -eo pipefail + +SHELLCHECK_VERSION=0.7.1 +GRCOV_VERSION=0.8.2 +KUBECTL_VERSION=1.18.6 +TERRAFORM_VERSION=0.12.26 +HELM_VERSION=3.2.4 +VAULT_VERSION=1.5.0 +Z3_VERSION=4.11.2 +CVC5_VERSION=0.0.3 +DOTNET_VERSION=6.0 +BOOGIE_VERSION=2.15.8 +ALLURE_VERSION=2.15.pr1135 +# this is 3.21.4; the "3" is silent +PROTOC_VERSION=21.4 +SOLC_VERSION="v0.8.11+commit.d7f03943" + +SCRIPT_PATH="$( cd "$( dirname "$0" )" >/dev/null 2>&1 && pwd )" +cd "$SCRIPT_PATH/.." || exit + +function usage { + echo "Usage:" + echo "Installs or updates necessary dev tools for Libra." + echo "-b batch mode, no user interactions and minimal output" + echo "-p update ${HOME}/.profile" + echo "-r install protoc and related tools" + echo "-t install build tools" + echo "-o install operations tooling as well: helm, terraform, yamllint, vault, docker, kubectl, python3" + echo "-y install or update Move Prover tools: z3, cvc5, dotnet, boogie" + echo "-d install tools for the Move documentation generator: graphviz" + echo "-a install tools for build and test api" + echo "-P install PostgreSQL" + echo "-J install js/ts tools" + echo "-v verbose mode" + echo "-i installs an individual tool by name" + echo "-n will target the /opt/ dir rather than the $HOME dir. /opt/bin/, /opt/rustup/, and /opt/dotnet/ rather than $HOME/bin/, $HOME/.rustup/, and $HOME/.dotnet/" + echo "If no toolchain component is selected with -t, -o, -y, -d, or -p, the behavior is as if -t had been provided." + echo "This command must be called from the root folder of the Libra project." +} + +function add_to_profile { + eval "$1" + + if [[ "${BATCH_MODE}" == "true" ]]; then + FOUND=$(grep -c "$1" < "${HOME}/.profile" || true) # grep error return would kill the script. + if [ "$FOUND" == "0" ]; then + echo "$1" >> "${HOME}"/.profile + fi + return + fi + + printf "\nYour ENV needs: $1 \n" + printf "Update .bashrc instead of .profile? (y/N) > " + read -e -r input + if [[ "$input" != "y"* ]]; then + FOUND=$(grep -c "$1" < "${HOME}/.bashrc" || true) # grep error return would kill the script. + if [ "$FOUND" == "0" ]; then + echo "$1" >> "${HOME}"/.bashrc + fi + else + FOUND=$(grep -c "$1" < "${HOME}/.profile" || true) # grep error return would kill the script. + if [ "$FOUND" == "0" ]; then + echo "$1" >> "${HOME}"/.profile + fi + fi +} + + +# It is important to keep all path updates together to allow this script to work well when run in github actions +# inside of a docker image created using this script. GHA wipes the home directory via docker mount options, so +# this profile needs built and sourced on every execution of a job using the docker image. See the .github/actions/build-setup +# action in this repo, as well as docker/ci/github/Dockerfile. +function update_path_and_profile { + touch "${HOME}"/.profile + + DOTNET_ROOT="$HOME/.dotnet" + BIN_DIR="$HOME/bin" + C_HOME="${HOME}/.cargo" + if [[ "$OPT_DIR" == "true" ]]; then + DOTNET_ROOT="/opt/dotnet" + BIN_DIR="/opt/bin" + C_HOME="/opt/cargo" + fi + + mkdir -p "${BIN_DIR}" + if [ -n "$CARGO_HOME" ]; then + add_to_profile "export CARGO_HOME=\"${CARGO_HOME}\"" + add_to_profile "export PATH=\"${BIN_DIR}:${CARGO_HOME}/bin:\$PATH\"" + else + add_to_profile "export PATH=\"${BIN_DIR}:${C_HOME}/bin:\$PATH\"" + fi + if [[ "$INSTALL_PROTOC" == "true" ]]; then + add_to_profile "export PATH=\$PATH:/usr/local/include" + fi + if [[ "$INSTALL_PROVER" == "true" ]]; then + add_to_profile "export DOTNET_ROOT=\"${DOTNET_ROOT}\"" + add_to_profile "export PATH=\"${DOTNET_ROOT}/tools:\$PATH\"" + add_to_profile "export Z3_EXE=\"${BIN_DIR}/z3\"" + add_to_profile "export CVC5_EXE=\"${BIN_DIR}/cvc5\"" + add_to_profile "export BOOGIE_EXE=\"${DOTNET_ROOT}/tools/boogie\"" + fi + add_to_profile "export SOLC_EXE=\"${BIN_DIR}/solc\"" +} + +function install_build_essentials { + PACKAGE_MANAGER=$1 + #Differently named packages for pkg-config + if [[ "$PACKAGE_MANAGER" == "apt-get" ]]; then + install_pkg build-essential "$PACKAGE_MANAGER" + fi + if [[ "$PACKAGE_MANAGER" == "pacman" ]]; then + install_pkg base-devel "$PACKAGE_MANAGER" + fi + if [[ "$PACKAGE_MANAGER" == "apk" ]]; then + install_pkg alpine-sdk "$PACKAGE_MANAGER" + install_pkg coreutils "$PACKAGE_MANAGER" + fi + if [[ "$PACKAGE_MANAGER" == "yum" ]] || [[ "$PACKAGE_MANAGER" == "dnf" ]]; then + install_pkg gcc "$PACKAGE_MANAGER" + install_pkg gcc-c++ "$PACKAGE_MANAGER" + install_pkg make "$PACKAGE_MANAGER" + fi + #if [[ "$PACKAGE_MANAGER" == "brew" ]]; then + # install_pkg pkgconfig "$PACKAGE_MANAGER" + #fi +} + +function install_protoc { + INSTALL_PROTOC="true" + echo "Installing protoc and plugins" + + if command -v "${INSTALL_DIR}protoc" &>/dev/null && [[ "$("${INSTALL_DIR}protoc" --version || true)" =~ .*${PROTOC_VERSION}.* ]]; then + echo "protoc 3.${PROTOC_VERSION} already installed" + return + fi + + if [[ "$(uname)" == "Linux" ]]; then + PROTOC_PKG="protoc-$PROTOC_VERSION-linux-x86_64" + elif [[ "$(uname)" == "Darwin" ]]; then + PROTOC_PKG="protoc-$PROTOC_VERSION-osx-universal_binary" + else + echo "protoc support not configured for this platform (uname=$(uname))" + return + fi + + TMPFILE=$(mktemp) + rm "$TMPFILE" + mkdir -p "$TMPFILE"/ + ( + cd "$TMPFILE" || exit + curl -LOs "https://github.com/protocolbuffers/protobuf/releases/download/v$PROTOC_VERSION/$PROTOC_PKG.zip" --retry 3 + sudo unzip -o "$PROTOC_PKG.zip" -d /usr/local bin/protoc + sudo unzip -o "$PROTOC_PKG.zip" -d /usr/local 'include/*' + sudo chmod +x "/usr/local/bin/protoc" + ) + rm -rf "$TMPFILE" + + # Install the cargo plugins + if ! command -v protoc-gen-prost &> /dev/null; then + cargo install protoc-gen-prost --locked + fi + if ! command -v protoc-gen-prost-serde &> /dev/null; then + cargo install protoc-gen-prost-serde --locked + fi + if ! command -v protoc-gen-prost-crate &> /dev/null; then + cargo install protoc-gen-prost-crate --locked + fi +} + +function install_rustup { + echo installing rust. + BATCH_MODE=$1 + if [[ "$OPT_DIR" == "true" ]]; then + export RUSTUP_HOME=/opt/rustup/ + mkdir -p "$RUSTUP_HOME" || true + export CARGO_HOME=/opt/cargo/ + mkdir -p "$CARGO_HOME" || true + fi + + # Install Rust + if [[ "${BATCH_MODE}" == "false" ]]; then + echo "Installing Rust......" + fi + VERSION="$(rustup --version || true)" + if [ -n "$VERSION" ]; then + if [[ "${BATCH_MODE}" == "false" ]]; then + echo "Rustup is already installed, version: $VERSION" + fi + else + curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain stable + if [[ -n "${CARGO_HOME}" ]]; then + PATH="${CARGO_HOME}/bin:${PATH}" + else + PATH="${HOME}/.cargo/bin:${PATH}" + fi + fi +} + +function install_vault { + VERSION=$("${INSTALL_DIR}"/vault --version || true) + if [[ "$VERSION" != "Vault v${VAULT_VERSION}" ]]; then + MACHINE=$(uname -m); + if [[ $MACHINE == "x86_64" ]]; then + MACHINE="amd64" + fi + TMPFILE=$(mktemp) + curl -sL -o "$TMPFILE" "https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_$(uname -s | tr '[:upper:]' '[:lower:]')_${MACHINE}.zip" + unzip -qq -d "$INSTALL_DIR" "$TMPFILE" + rm "$TMPFILE" + chmod +x "${INSTALL_DIR}"/vault + fi + "${INSTALL_DIR}"/vault --version +} + +function install_helm { + if ! command -v helm &> /dev/null; then + if [[ $(uname -s) == "Darwin" ]]; then + install_pkg helm brew + else + MACHINE=$(uname -m); + if [[ $MACHINE == "x86_64" ]]; then + MACHINE="amd64" + fi + TMPFILE=$(mktemp) + rm "$TMPFILE" + mkdir -p "$TMPFILE"/ + curl -sL -o "$TMPFILE"/out.tar.gz "https://get.helm.sh/helm-v${HELM_VERSION}-$(uname -s | tr '[:upper:]' '[:lower:]')-${MACHINE}.tar.gz" + tar -zxvf "$TMPFILE"/out.tar.gz -C "$TMPFILE"/ + cp "${TMPFILE}/$(uname -s | tr '[:upper:]' '[:lower:]')-${MACHINE}/helm" "${INSTALL_DIR}/helm" + rm -rf "$TMPFILE" + chmod +x "${INSTALL_DIR}"/helm + fi + fi +} + +function install_terraform { + VERSION=$(terraform --version | head -1 || true) + if [[ "$VERSION" != "Terraform v${TERRAFORM_VERSION}" ]]; then + if [[ $(uname -s) == "Darwin" ]]; then + install_pkg tfenv brew + tfenv install ${TERRAFORM_VERSION} + tfenv use ${TERRAFORM_VERSION} + else + MACHINE=$(uname -m); + if [[ $MACHINE == "x86_64" ]]; then + MACHINE="amd64" + fi + TMPFILE=$(mktemp) + curl -sL -o "$TMPFILE" "https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_$(uname -s | tr '[:upper:]' '[:lower:]')_${MACHINE}.zip" + unzip -qq -d "${INSTALL_DIR}" "$TMPFILE" + rm "$TMPFILE" + chmod +x "${INSTALL_DIR}"/terraform + terraform --version + fi + fi +} + +function install_kubectl { + VERSION=$(kubectl version client --short=true | head -1 || true) + if [[ "$VERSION" != "Client Version: v${KUBECTL_VERSION}" ]]; then + if [[ $(uname -s) == "Darwin" ]]; then + install_pkg kubectl brew + else + MACHINE=$(uname -m); + if [[ $MACHINE == "x86_64" ]]; then + MACHINE="amd64" + fi + curl -sL -o "${INSTALL_DIR}"/kubectl "https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VERSION}/bin/$(uname -s | tr '[:upper:]' '[:lower:]')/${MACHINE}/kubectl" + chmod +x "${INSTALL_DIR}"/kubectl + fi + fi + kubectl version client --short=true | head -1 || true +} + +function install_awscli { + PACKAGE_MANAGER=$1 + if ! command -v aws &> /dev/null; then + if [[ $(uname -s) == "Darwin" ]]; then + install_pkg awscli brew + elif [[ "$PACKAGE_MANAGER" == "apk" ]]; then + apk add --no-cache python3 py3-pip \ + && pip3 install --upgrade pip \ + && pip3 install awscli + else + MACHINE=$(uname -m); + TMPFILE=$(mktemp) + rm "$TMPFILE" + mkdir -p "$TMPFILE"/work/ + curl -sL -o "$TMPFILE"/aws.zip "https://awscli.amazonaws.com/awscli-exe-$(uname -s | tr '[:upper:]' '[:lower:]')-${MACHINE}.zip" + unzip -qq -d "$TMPFILE"/work/ "$TMPFILE"/aws.zip + TARGET_DIR="${HOME}"/.local/ + if [[ "$OPT_DIR" == "true" ]]; then + TARGET_DIR="/opt/aws/" + fi + mkdir -p "${TARGET_DIR}" + "$TMPFILE"/work/aws/install -i "${TARGET_DIR}" -b "${INSTALL_DIR}" + "${INSTALL_DIR}"aws --version + fi + fi +} + +function install_pkg { + package=$1 + PACKAGE_MANAGER=$2 + PRE_COMMAND=() + if [ "$(whoami)" != 'root' ]; then + PRE_COMMAND=(sudo) + fi + if command -v "$package" &>/dev/null; then + echo "$package is already installed" + else + echo "Installing ${package}." + if [[ "$PACKAGE_MANAGER" == "yum" ]]; then + "${PRE_COMMAND[@]}" yum install "${package}" -y + elif [[ "$PACKAGE_MANAGER" == "apt-get" ]]; then + "${PRE_COMMAND[@]}" apt-get install "${package}" --no-install-recommends -y + echo apt-get install result code: $? + elif [[ "$PACKAGE_MANAGER" == "pacman" ]]; then + "${PRE_COMMAND[@]}" pacman -Syu "$package" --noconfirm + elif [[ "$PACKAGE_MANAGER" == "apk" ]]; then + apk --update add --no-cache "${package}" + elif [[ "$PACKAGE_MANAGER" == "dnf" ]]; then + dnf install "$package" + elif [[ "$PACKAGE_MANAGER" == "brew" ]]; then + brew install "$package" + fi + fi +} + +function install_pkg_config { + PACKAGE_MANAGER=$1 + #Differently named packages for pkg-config + if [[ "$PACKAGE_MANAGER" == "apt-get" ]] || [[ "$PACKAGE_MANAGER" == "dnf" ]]; then + install_pkg pkg-config "$PACKAGE_MANAGER" + fi + if [[ "$PACKAGE_MANAGER" == "pacman" ]]; then + install_pkg pkgconf "$PACKAGE_MANAGER" + fi + if [[ "$PACKAGE_MANAGER" == "brew" ]] || [[ "$PACKAGE_MANAGER" == "apk" ]] || [[ "$PACKAGE_MANAGER" == "yum" ]]; then + install_pkg pkgconfig "$PACKAGE_MANAGER" + fi +} + +function install_shellcheck { + if ! command -v shellcheck &> /dev/null; then + if [[ $(uname -s) == "Darwin" ]]; then + install_pkg shellcheck brew + else + install_pkg xz "$PACKAGE_MANAGER" + MACHINE=$(uname -m); + TMPFILE=$(mktemp) + rm "$TMPFILE" + mkdir -p "$TMPFILE"/ + curl -sL -o "$TMPFILE"/out.xz "https://github.com/koalaman/shellcheck/releases/download/v${SHELLCHECK_VERSION}/shellcheck-v${SHELLCHECK_VERSION}.$(uname -s | tr '[:upper:]' '[:lower:]').${MACHINE}.tar.xz" + tar -xf "$TMPFILE"/out.xz -C "$TMPFILE"/ + cp "${TMPFILE}/shellcheck-v${SHELLCHECK_VERSION}/shellcheck" "${INSTALL_DIR}/shellcheck" + rm -rf "$TMPFILE" + chmod +x "${INSTALL_DIR}"/shellcheck + fi + fi +} + +function install_openssl_dev { + PACKAGE_MANAGER=$1 + #Differently named packages for openssl dev + if [[ "$PACKAGE_MANAGER" == "apk" ]]; then + install_pkg openssl-dev "$PACKAGE_MANAGER" + fi + if [[ "$PACKAGE_MANAGER" == "apt-get" ]]; then + install_pkg libssl-dev "$PACKAGE_MANAGER" + fi + if [[ "$PACKAGE_MANAGER" == "yum" ]] || [[ "$PACKAGE_MANAGER" == "dnf" ]]; then + install_pkg openssl-devel "$PACKAGE_MANAGER" + fi + if [[ "$PACKAGE_MANAGER" == "pacman" ]] || [[ "$PACKAGE_MANAGER" == "brew" ]]; then + install_pkg openssl "$PACKAGE_MANAGER" + fi +} + +function install_lcov { + PACKAGE_MANAGER=$1 + #Differently named packages for lcov with different sources. + if [[ "$PACKAGE_MANAGER" == "apk" ]]; then + apk --update add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing lcov + fi + if [[ "$PACKAGE_MANAGER" == "apt-get" ]] || [[ "$PACKAGE_MANAGER" == "yum" ]] || [[ "$PACKAGE_MANAGER" == "dnf" ]] || [[ "$PACKAGE_MANAGER" == "brew" ]]; then + install_pkg lcov "$PACKAGE_MANAGER" + fi + if [[ "$PACKAGE_MANAGER" == "pacman" ]]; then + echo nope no lcov for you. + echo You can try installing yourself with: + echo install_pkg git "$PACKAGE_MANAGER" + echo cd lcov; + echo git clone https://aur.archlinux.org/lcov.git + echo makepkg -si --noconfirm + fi +} + +function install_tidy { + PACKAGE_MANAGER=$1 + #Differently named packages for tidy + if [[ "$PACKAGE_MANAGER" == "apk" ]]; then + apk --update add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing tidyhtml + else + install_pkg tidy "$PACKAGE_MANAGER" + fi +} + +function install_toolchain { + version=$1 + FOUND=$(rustup show | grep -c "$version" || true ) + if [[ "$FOUND" == "0" ]]; then + echo "Installing ${version} of rust toolchain" + rustup install "$version" + else + echo "${version} rust toolchain already installed" + fi +} + +function install_rustup_components_and_nightly { + echo "Printing the rustup version and toolchain list" + rustup --version + rustup show + rustup toolchain list -v + + echo "Updating rustup and installing rustfmt & clippy" + rustup update + rustup component add rustfmt + rustup component add clippy + + # We require nightly for strict rust formatting + echo "Installing the nightly toolchain and rustfmt nightly" + if ! rustup toolchain install nightly + then + if [[ "$(uname)" == "Linux" ]]; then + # TODO: remove this once we have an answer: https://github.com/rust-lang/rustup/issues/3390 + echo "Failed to install the nightly toolchain using rustup! Falling back to an older linux build at 2023-06-01." + rustup toolchain install nightly-2023-06-01 # Fix the date to avoid flakiness + + # Rename the toolchain to nightly (crazy... see: https://github.com/rust-lang/rustup/issues/1299). + # Note: this only works for linux. The primary purpose is to unblock CI/CD on flakes. + mv ~/.rustup/toolchains/nightly-2023-06-01-x86_64-unknown-linux-gnu ~/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu + else + echo "Failed to install the nightly toolchain using rustup! Manual installation is required!" + fi + fi + + if ! rustup component add rustfmt --toolchain nightly + then + echo "Failed to install rustfmt nightly using rustup." + fi +} + +function install_cargo_sort { + if ! command -v cargo-sort &> /dev/null; then + cargo install cargo-sort --locked + fi +} + +function install_cargo_nextest { + if ! command -v cargo-nextest &> /dev/null; then + cargo install cargo-nextest --locked + fi +} + +function install_grcov { + if ! command -v grcov &> /dev/null; then + cargo install grcov --version="${GRCOV_VERSION}" --locked + fi +} + +function install_dotnet { + echo "Installing .Net" + mkdir -p "${DOTNET_INSTALL_DIR}" || true + if [[ $("${DOTNET_INSTALL_DIR}/dotnet" --list-sdks | grep -c "^${DOTNET_VERSION}" || true) == "0" ]]; then + if [[ "$(uname)" == "Linux" ]]; then + # Install various prerequisites for .dotnet. There are known bugs + # in the dotnet installer to warn even if they are present. We try + # to install anyway based on the warnings the dotnet installer creates. + if [ "$PACKAGE_MANAGER" == "apk" ]; then + install_pkg icu "$PACKAGE_MANAGER" + install_pkg zlib "$PACKAGE_MANAGER" + install_pkg libintl "$PACKAGE_MANAGER" + install_pkg libcurl "$PACKAGE_MANAGER" + elif [ "$PACKAGE_MANAGER" == "apt-get" ]; then + install_pkg gettext "$PACKAGE_MANAGER" + install_pkg zlib1g "$PACKAGE_MANAGER" + elif [ "$PACKAGE_MANAGER" == "yum" ] || [ "$PACKAGE_MANAGER" == "dnf" ]; then + install_pkg icu "$PACKAGE_MANAGER" + install_pkg zlib "$PACKAGE_MANAGER" + elif [ "$PACKAGE_MANAGER" == "pacman" ]; then + install_pkg icu "$PACKAGE_MANAGER" + install_pkg zlib "$PACKAGE_MANAGER" + fi + fi + # Below we need to (a) set TERM variable because the .net installer expects it and it is not set + # in some environments (b) use bash not sh because the installer uses bash features. + # NOTE: use wget to better follow the redirect + wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh + chmod +x dotnet-install.sh + ./dotnet-install.sh --channel $DOTNET_VERSION --install-dir "${DOTNET_INSTALL_DIR}" --version latest + rm dotnet-install.sh + else + echo Dotnet already installed. + fi +} + +function install_boogie { + echo "Installing boogie" + mkdir -p "${DOTNET_INSTALL_DIR}tools/" || true + if [[ "$("${DOTNET_INSTALL_DIR}dotnet" tool list --tool-path "${DOTNET_INSTALL_DIR}tools/")" =~ .*boogie.*${BOOGIE_VERSION}.* ]]; then + echo "Boogie $BOOGIE_VERSION already installed" + else + "${DOTNET_INSTALL_DIR}dotnet" tool update --tool-path "${DOTNET_INSTALL_DIR}tools/" Boogie --version $BOOGIE_VERSION + fi +} + +function install_z3 { + echo "Installing Z3" + if command -v /usr/local/bin/z3 &>/dev/null; then + echo "z3 already exists at /usr/local/bin/z3" + echo "but this install will go to ${INSTALL_DIR}/z3." + echo "you may want to remove the shared instance to avoid version confusion" + fi + if command -v "${INSTALL_DIR}z3" &>/dev/null && [[ "$("${INSTALL_DIR}z3" --version || true)" =~ .*${Z3_VERSION}.* ]]; then + echo "Z3 ${Z3_VERSION} already installed" + return + fi + if [[ "$(uname)" == "Linux" ]]; then + Z3_PKG="z3-$Z3_VERSION-x64-glibc-2.31" + elif [[ "$(uname)" == "Darwin" ]]; then + if [[ "$(uname -m)" == "arm64" ]]; then + Z3_PKG="z3-$Z3_VERSION-arm64-osx-11.0" + else + Z3_PKG="z3-$Z3_VERSION-x64-osx-10.16" + fi + else + echo "Z3 support not configured for this platform (uname=$(uname))" + return + fi + TMPFILE=$(mktemp) + rm "$TMPFILE" + mkdir -p "$TMPFILE"/ + ( + cd "$TMPFILE" || exit + curl -LOs "https://github.com/Z3Prover/z3/releases/download/z3-$Z3_VERSION/$Z3_PKG.zip" + unzip -q "$Z3_PKG.zip" + cp "$Z3_PKG/bin/z3" "${INSTALL_DIR}" + chmod +x "${INSTALL_DIR}z3" + ) + rm -rf "$TMPFILE" +} + +function install_cvc5 { + echo "Installing cvc5" + if command -v /usr/local/bin/cvc5 &>/dev/null; then + echo "cvc5 already exists at /usr/local/bin/cvc5" + echo "but this install will go to $${INSTALL_DIR}cvc5." + echo "you may want to remove the shared instance to avoid version confusion" + fi + if command -v "${INSTALL_DIR}cvc5" &>/dev/null && [[ "$("${INSTALL_DIR}cvc5" --version || true)" =~ .*${CVC5_VERSION}.* ]]; then + echo "cvc5 ${CVC5_VERSION} already installed" + return + fi + if [[ "$(uname)" == "Linux" ]]; then + CVC5_PKG="cvc5-Linux" + elif [[ "$(uname)" == "Darwin" ]]; then + CVC5_PKG="cvc5-macOS" + else + echo "cvc5 support not configured for this platform (uname=$(uname))" + return + fi + TMPFILE=$(mktemp) + rm "$TMPFILE" + mkdir -p "$TMPFILE"/ + ( + cd "$TMPFILE" || exit + curl -LOs "https://github.com/cvc5/cvc5/releases/download/cvc5-$CVC5_VERSION/$CVC5_PKG" || true + cp "$CVC5_PKG" "${INSTALL_DIR}cvc5" || true + chmod +x "${INSTALL_DIR}cvc5" || true + ) + rm -rf "$TMPFILE" +} + +function install_allure { + VERSION="$(allure --version || true)" + if [[ "$VERSION" != "${ALLURE_VERSION}" ]]; then + if [[ "$PACKAGE_MANAGER" == "apt-get" ]]; then + "${PRE_COMMAND[@]}" apt-get install default-jre -y --no-install-recommends + export ALLURE=${HOME}/allure_"${ALLURE_VERSION}"-1_all.deb + curl -sL -o "$ALLURE" "https://github.com/diem/allure2/releases/download/${ALLURE_VERSION}/allure_${ALLURE_VERSION}-1_all.deb" + "${PRE_COMMAND[@]}" dpkg -i "$ALLURE" + rm "$ALLURE" + elif [[ "$PACKAGE_MANAGER" == "apk" ]]; then + apk --update add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/community openjdk11 + else + echo No good way to install allure 'install_pkg allure '"$PACKAGE_MANAGER" + fi + fi +} + +function install_xsltproc { + if [[ "$PACKAGE_MANAGER" == "apt-get" ]]; then + install_pkg xsltproc "$PACKAGE_MANAGER" + else + install_pkg libxslt "$PACKAGE_MANAGER" + fi +} + +function install_nodejs { + if [[ "$PACKAGE_MANAGER" == "apt-get" ]]; then + curl -fsSL https://deb.nodesource.com/setup_14.x | "${PRE_COMMAND[@]}" bash - + fi + install_pkg nodejs "$PACKAGE_MANAGER" + install_pkg npm "$PACKAGE_MANAGER" +} + +function install_solidity { + echo "Installing Solidity compiler" + if [ -f "${INSTALL_DIR}solc" ]; then + echo "Solidity already installed at ${INSTALL_DIR}solc" + return + fi + # We fetch the binary from https://binaries.soliditylang.org + if [[ "$(uname)" == "Linux" ]]; then + SOLC_BIN="linux-amd64/solc-linux-amd64-${SOLC_VERSION}" + elif [[ "$(uname)" == "Darwin" ]]; then + if [[ "$(uname -m)" == "arm64" ]]; then + # no native binary supplied, but brew can build one + brew install solidity + return + else + SOLC_BIN="macosx-amd64/solc-macosx-amd64-${SOLC_VERSION}" + fi + else + echo "Solidity support not configured for this platform (uname=$(uname))" + return + fi + curl -o "${INSTALL_DIR}solc" "https://binaries.soliditylang.org/${SOLC_BIN}" + chmod +x "${INSTALL_DIR}solc" +} + +function install_pnpm { + curl -fsSL https://get.pnpm.io/install.sh | "${PRE_COMMAND[@]}" env PNPM_VERSION=8.2.0 SHELL="$(which bash)" bash - +} + +function install_python3 { + if [[ "$PACKAGE_MANAGER" == "apt-get" ]]; then + install_pkg python3-all-dev "$PACKAGE_MANAGER" + install_pkg python3-setuptools "$PACKAGE_MANAGER" + install_pkg python3-pip "$PACKAGE_MANAGER" + elif [[ "$PACKAGE_MANAGER" == "apk" ]]; then + install_pkg python3-dev "$PACKAGE_MANAGER" + else + install_pkg python3 "$PACKAGE_MANAGER" + fi +} + +function install_postgres { + if [[ "$PACKAGE_MANAGER" == "apt-get" ]] || [[ "$PACKAGE_MANAGER" == "apk" ]]; then + install_pkg libpq-dev "$PACKAGE_MANAGER" + fi + if [[ "$PACKAGE_MANAGER" == "pacman" ]] || [[ "$PACKAGE_MANAGER" == "yum" ]]; then + install_pkg postgresql-libs "$PACKAGE_MANAGER" + fi + if [[ "$PACKAGE_MANAGER" == "dnf" ]]; then + install_pkg libpq-devel "$PACKAGE_MANAGER" + fi + if [[ "$PACKAGE_MANAGER" == "brew" ]]; then + install_pkg postgresql "$PACKAGE_MANAGER" + fi +} + +function install_lld { + # Right now, only install lld for linux + if [[ "$(uname)" == "Linux" ]]; then + install_pkg lld "$PACKAGE_MANAGER" + fi +} + +# this is needed for hdpi crate from diem-ledger +function install_libudev-dev { + # Need to install libudev-dev for linux + if [[ "$(uname)" == "Linux" ]]; then + install_pkg libudev-dev "$PACKAGE_MANAGER" + fi +} + +function welcome_message { +cat < /dev/null; then + PACKAGE_MANAGER="yum" + elif command -v apt-get &> /dev/null; then + PACKAGE_MANAGER="apt-get" + elif command -v pacman &> /dev/null; then + PACKAGE_MANAGER="pacman" + elif command -v apk &>/dev/null; then + PACKAGE_MANAGER="apk" + elif command -v dnf &>/dev/null; then + echo "WARNING: dnf package manager support is experimental" + PACKAGE_MANAGER="dnf" + else + echo "Unable to find supported package manager (yum, apt-get, dnf, or pacman). Abort" + exit 1 + fi +elif [[ "$(uname)" == "Darwin" ]]; then + if command -v brew &>/dev/null; then + PACKAGE_MANAGER="brew" + else + echo "Missing package manager Homebrew (https://brew.sh/). Abort" + exit 1 + fi +else + echo "Unknown OS. Abort." + exit 1 +fi + +if [[ "$BATCH_MODE" == "false" ]]; then + welcome_message + printf "Proceed with installing necessary dependencies? (y/N) > " + read -e -r input + if [[ "$input" != "y"* ]]; then + echo "Exiting..." + exit 0 + fi +fi + +if [[ "$PACKAGE_MANAGER" == "apt-get" ]]; then + if [[ "$BATCH_MODE" == "false" ]]; then + echo "Updating apt-get......" + fi + "${PRE_COMMAND[@]}" apt-get update + if [[ "$BATCH_MODE" == "false" ]]; then + echo "Installing ca-certificates......" + fi + install_pkg ca-certificates "$PACKAGE_MANAGER" +fi + +if [[ "$INSTALL_PROFILE" == "true" ]]; then + update_path_and_profile +fi + +install_pkg curl "$PACKAGE_MANAGER" +install_pkg unzip "$PACKAGE_MANAGER" + +if [[ "$INSTALL_BUILD_TOOLS" == "true" ]]; then + install_build_essentials "$PACKAGE_MANAGER" + install_pkg cmake "$PACKAGE_MANAGER" + install_pkg clang "$PACKAGE_MANAGER" + install_pkg llvm "$PACKAGE_MANAGER" + # 0L for VDF + install_pkg libgmp-dev "$PACKAGE_MANAGER" + + install_openssl_dev "$PACKAGE_MANAGER" + install_pkg_config "$PACKAGE_MANAGER" + + install_lld + + install_rustup "$BATCH_MODE" + install_toolchain "$(cat ./rust-toolchain)" + install_rustup_components_and_nightly + + install_cargo_sort + install_cargo_nextest + install_grcov + install_pkg git "$PACKAGE_MANAGER" + install_lcov "$PACKAGE_MANAGER" + install_pkg unzip "$PACKAGE_MANAGER" + install_protoc +fi + +if [[ "$INSTALL_PROTOC" == "true" ]]; then + if [[ "$INSTALL_BUILD_TOOLS" == "false" ]]; then + install_pkg unzip "$PACKAGE_MANAGER" + install_protoc + fi +fi + +if [[ "$OPERATIONS" == "true" ]]; then + install_pkg yamllint "$PACKAGE_MANAGER" + install_pkg python3 "$PACKAGE_MANAGER" + install_pkg unzip "$PACKAGE_MANAGER" + install_pkg jq "$PACKAGE_MANAGER" + install_pkg git "$PACKAGE_MANAGER" + install_tidy "$PACKAGE_MANAGER" + install_xsltproc + #for timeout + if [[ "$PACKAGE_MANAGER" == "apt-get" ]]; then + install_pkg coreutils "$PACKAGE_MANAGER" + fi + install_shellcheck + install_vault + install_helm + install_terraform + install_kubectl + install_awscli "$PACKAGE_MANAGER" + install_allure +fi + +if [[ "$INSTALL_INDIVIDUAL" == "true" ]]; then + for (( i=0; i < ${#INSTALL_PACKAGES[@]}; i++ )); + do + PACKAGE=${INSTALL_PACKAGES[$i]} + if ! command -v "install_${PACKAGE}" &> /dev/null; then + install_pkg "$PACKAGE" "$PACKAGE_MANAGER" + else + "install_${PACKAGE}" + fi + done +fi + +if [[ "$INSTALL_PROVER" == "true" ]]; then + export DOTNET_INSTALL_DIR="${HOME}/.dotnet/" + if [[ "$OPT_DIR" == "true" ]]; then + export DOTNET_INSTALL_DIR="/opt/dotnet/" + mkdir -p "$DOTNET_INSTALL_DIR" || true + fi + install_pkg unzip "$PACKAGE_MANAGER" + install_z3 + install_cvc5 + install_dotnet + install_boogie +fi + +if [[ "$INSTALL_DOC" == "true" ]]; then + install_pkg graphviz "$PACKAGE_MANAGER" +fi + +if [[ "$INSTALL_API_BUILD_TOOLS" == "true" ]]; then + # python and tools + install_python3 + "${PRE_COMMAND[@]}" python3 -m pip install schemathesis +fi + +if [[ "$INSTALL_POSTGRES" == "true" ]]; then + install_postgres +fi + +if [[ "$INSTALL_JSTS" == "true" ]]; then + # javascript and typescript tools + install_nodejs "$PACKAGE_MANAGER" + install_pnpm "$PACKAGE_MANAGER" + install_solidity +fi + +install_python3 +pip3 install pre-commit + +install_libudev-dev + +# For now best effort install, will need to improve later +if command -v pre-commit; then + pre-commit install +else + ~/.local/bin/pre-commit install +fi + +if [[ "${BATCH_MODE}" == "false" ]]; then +cat <