diff --git a/.circleci/config.yml b/.circleci/config.yml index 189e714d..dfdd68af 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,7 +11,7 @@ orbs: executors: linux2204: docker: - - image: cimg/rust:1.67 + - image: cimg/rust:1.81 resource_class: xlarge # 8 cores, 16Gb linux2204_machine: machine: @@ -48,7 +48,11 @@ jobs: steps: - run: name: install cbor-diag - command: cargo install --force cbor-diag-cli + command: | + wget https://github.com/liftedinit/cbor-diag-rs/releases/download/cbor-diag-cli-0.1.8-ll.1/cbor-diag + chmod +x cbor-diag + sudo mv cbor-diag /usr/local/bin/cbor-diag + cbor-diag --version - run: name: rustfmt, clippy, build and tests and doc tests (linux) command: | diff --git a/cargo-bazel-lock.json b/cargo-bazel-lock.json index 37e7bc29..150e2c27 100644 --- a/cargo-bazel-lock.json +++ b/cargo-bazel-lock.json @@ -1,5 +1,5 @@ { - "checksum": "2c2c0c43c761a46e0a0663ae8f918b710f8933b2c1dfe8904026181106228cb6", + "checksum": "8e608299ab3beef4115906f61ad02c79b63133baa41a1a2630c68c562a5bdaee", "crates": { "addr2line 0.21.0": { "name": "addr2line", @@ -15235,6 +15235,10 @@ "id": "num-traits 0.2.16", "target": "num_traits" }, + { + "id": "once_cell 1.18.0", + "target": "once_cell" + }, { "id": "rand 0.8.5", "target": "rand" @@ -15280,10 +15284,6 @@ "id": "cucumber 0.20.0", "target": "cucumber" }, - { - "id": "once_cell 1.18.0", - "target": "once_cell" - }, { "id": "proptest 1.2.0", "target": "proptest" diff --git a/docker/Makefile.common b/docker/Makefile.common index 447fdeca..8902b695 100644 --- a/docker/Makefile.common +++ b/docker/Makefile.common @@ -1,6 +1,7 @@ # Options NB_NODES ?= 4 ID_WITH_BALANCES ?= +TOKEN ?= "mqbfbahksdwaqeenayy2gxke32hgb7aq4ao4wt745lsfs6wiaaaaqnz" # Constants SHELL = bash diff --git a/docker/Makefile.ledger b/docker/Makefile.ledger index de3505e7..969c7176 100644 --- a/docker/Makefile.ledger +++ b/docker/Makefile.ledger @@ -44,6 +44,7 @@ genfiles-ledger/docker-compose.json: genfiles-common/jsonnet-docker docker-compo /volume/copy-docker-compose-ledger.jsonnet \ --tla-code nb_nodes=$(NB_NODES) \ --tla-code user=$$(id -u) \ + --tla-code token=\"$(TOKEN)\" \ --tla-code id_with_balances=\"$(ID_WITH_BALANCES)\" \ --tla-code enable_migrations=$(ENABLE_MIGRATIONS) \ --tla-code abci_migrations=$(ENABLE_ABCI_MIGRATIONS) \ diff --git a/docker/docker-compose-ledger.jsonnet b/docker/docker-compose-ledger.jsonnet index 743cdebd..42db742e 100644 --- a/docker/docker-compose-ledger.jsonnet +++ b/docker/docker-compose-ledger.jsonnet @@ -55,7 +55,7 @@ local abci(i, user, allow_addrs, abci_migrations) = { depends_on: [ "ledger-" + i ], }; -local ledger(i, user, id_with_balances, enable_migrations) = { +local ledger(i, user, id_with_balances, token, enable_migrations) = { image: "bazel/src/many-ledger:many-ledger-image", user: "" + user, volumes: [ @@ -70,7 +70,7 @@ local ledger(i, user, id_with_balances, enable_migrations) = { "--persistent=/persistent/ledger.db", "--addr=0.0.0.0:8000", ] + load_migrations(enable_migrations) - + generate_balance_flags(id_with_balances) + + generate_balance_flags(id_with_balances, token) }; local tendermint(i, user) = { @@ -87,12 +87,12 @@ local tendermint(i, user) = { ports: [ "" + (26600 + i) + ":26657" ], }; -function(nb_nodes=4, user=1000, id_with_balances="", allow_addrs=false, enable_migrations=false, abci_migrations=false) { +function(nb_nodes=4, user=1000, id_with_balances="", token="mqbfbahksdwaqeenayy2gxke32hgb7aq4ao4wt745lsfs6wiaaaaqnz", allow_addrs=false, enable_migrations=false, abci_migrations=false) { version: '3', services: { ["abci-" + i]: abci(i, user, allow_addrs, abci_migrations) for i in std.range(0, nb_nodes - 1) } + { - ["ledger-" + i]: ledger(i, user, id_with_balances, enable_migrations) for i in std.range(0, nb_nodes - 1) + ["ledger-" + i]: ledger(i, user, id_with_balances, token, enable_migrations) for i in std.range(0, nb_nodes - 1) } + { ["tendermint-" + i]: tendermint(i, user) for i in std.range(0, nb_nodes - 1) }, diff --git a/src/many-ledger/Cargo.toml b/src/many-ledger/Cargo.toml index c883fdfd..2a5bc815 100644 --- a/src/many-ledger/Cargo.toml +++ b/src/many-ledger/Cargo.toml @@ -41,6 +41,7 @@ many-protocol = { path = "../many-protocol", version = "0.2.6" } # managed by re many-server = { path = "../many-server", version = "0.2.6" } # managed by release.sh many-server-cache = { path = "../many-server-cache", version = "0.2.6" } # managed by release.sh many-types = { path = "../many-types", version = "0.2.6" } # managed by release.sh +once_cell = "1.17.1" rand = "0.8.5" serde = "=1.0.163" serde_json = "1.0.96" @@ -53,7 +54,6 @@ typenum = "1.16.0" [dev-dependencies] cucumber = { version = "0.20.0", features = ["libtest"] } -once_cell = "1.17.1" many-identity = { path = "../many-identity", features = ["default", "serde", "testing"], version = "0.2.6" } # managed by release.sh many-identity-dsa = { path = "../many-identity-dsa", features = [ "ed25519", "testing" ], version = "0.2.6" } # managed by release.sh many-ledger = { path = ".", features = ["balance_testing", "migration_testing"] } diff --git a/src/many-ledger/src/module/ledger_mintburn.rs b/src/many-ledger/src/module/ledger_mintburn.rs index 2f765c23..656cfc28 100644 --- a/src/many-ledger/src/module/ledger_mintburn.rs +++ b/src/many-ledger/src/module/ledger_mintburn.rs @@ -9,7 +9,14 @@ use many_modules::events::EventInfo; use many_modules::ledger; use many_modules::ledger::{TokenBurnArgs, TokenBurnReturns, TokenMintArgs, TokenMintReturns}; use many_types::ledger::Symbol; +use once_cell::sync::Lazy; use std::collections::BTreeSet; +use std::str::FromStr; + +// Production network MFX address +pub static MFX: Lazy
= Lazy::new(|| { + Address::from_str("mqbh742x4s356ddaryrxaowt4wxtlocekzpufodvowrirfrqaaaaa3l").unwrap() +}); /// Check if a symbol exists in the storage fn check_symbol_exists(symbol: &Symbol, symbols: BTreeSet) -> Result<(), ManyError> { @@ -30,22 +37,23 @@ impl ledger::LedgerMintBurnModuleBackend for LedgerModuleImpl { return Err(ManyError::invalid_method_name("tokens.mint")); } - if self - .storage - .migrations() - .is_active(&DISABLE_TOKEN_MINT_MIGRATION) - { - return Err(ManyError::unknown( - "Token minting is disabled on this network", - )); - } - let TokenMintArgs { symbol, distribution, memo, } = args; + if symbol != *MFX + && self + .storage + .migrations() + .is_active(&DISABLE_TOKEN_MINT_MIGRATION) + { + return Err(ManyError::unknown( + "Token minting is disabled on this network", + )); + } + self.verify_mint_burn_identity(sender, &symbol)?; check_symbol_exists(&symbol, self.storage.get_symbols()?)?; diff --git a/tests/resiliency/ledger/disable_token_minting_migration.bats b/tests/resiliency/ledger/disable_token_minting_migration.bats index 0090c7b4..5f3de34c 100644 --- a/tests/resiliency/ledger/disable_token_minting_migration.bats +++ b/tests/resiliency/ledger/disable_token_minting_migration.bats @@ -3,7 +3,7 @@ GIT_ROOT="$BATS_TEST_DIRNAME/../../../" MIGRATION_ROOT="$GIT_ROOT/staging/ledger_migrations.json" MAKEFILE="Makefile.ledger" -MFX_ADDRESS=mqbfbahksdwaqeenayy2gxke32hgb7aq4ao4wt745lsfs6wiaaaaqnz +MFX_ADDRESS=mqbh742x4s356ddaryrxaowt4wxtlocekzpufodvowrirfrqaaaaa3l load '../../test_helper/load' load '../../test_helper/ledger' @@ -32,11 +32,21 @@ function setup() { }' \ "$MIGRATION_ROOT" > "$BATS_TEST_ROOTDIR/migrations.json" + cp "$GIT_ROOT/staging/ledger_state.json5" "$BATS_TEST_ROOTDIR/ledger_state.json5" + + # Use production MFX address + sed -i.bak 's/mqbfbahksdwaqeenayy2gxke32hgb7aq4ao4wt745lsfs6wiaaaaqnz/mqbh742x4s356ddaryrxaowt4wxtlocekzpufodvowrirfrqaaaaa3l/g' "$BATS_TEST_ROOTDIR/ledger_state.json5" + + # Skip hash check + sed -i.bak 's/hash/\/\/hash/' "$BATS_TEST_ROOTDIR/ledger_state.json5" + ( cd "$GIT_ROOT/docker/" || exit make -f $MAKEFILE clean make -f $MAKEFILE start-nodes-detached \ ID_WITH_BALANCES="$(identity 1):1000000" \ + STATE="$BATS_TEST_ROOTDIR/ledger_state.json5" \ + TOKEN="$MFX_ADDRESS" \ MIGRATIONS="$BATS_TEST_ROOTDIR/migrations.json" || { echo '# Could not start nodes...' >&3 exit 1 @@ -73,18 +83,35 @@ function teardown() { check_consistency --pem=2 --balance=123 8000 8001 8002 8003 check_consistency --pem=3 --balance=456 8000 8001 8002 8003 + # Create a new token + create_token --pem=1 --port=8000 + call_ledger --pem=1 --port=8000 token update --name "\"ZZZ name\"" \ + --ticker "ZZZ" \ + --decimals "6" \ + --memo "\"Update memo\"" \ + --owner "$(identity 2)" \ + "${SYMBOL}" + # Disable Token Minting wait_for_block 35 - # Token endpoints should be disabled + # MFX minting should still work call_ledger --pem=1 --port=8000 token mint MFX ''\''{"'$(identity 2)'": 123, "'$(identity 3)'": 456}'\''' - assert_output --partial "Token minting is disabled on this network" + refute_output --partial "Token minting is disabled on this network" check_consistency --pem=1 --balance=1000000 --id="$(identity 1)" 8000 8001 8002 8003 - check_consistency --pem=2 --balance=123 8000 8001 8002 8003 - check_consistency --pem=3 --balance=456 8000 8001 8002 8003 + check_consistency --pem=2 --balance=246 8000 8001 8002 8003 + check_consistency --pem=3 --balance=912 8000 8001 8002 8003 # Token burn should still work - call_ledger --pem=1 --port=8000 token burn MFX ''\''{"'$(identity 2)'": 123, "'$(identity 3)'": 456}'\''' --error-on-under-burn + call_ledger --pem=1 --port=8000 token burn MFX ''\''{"'$(identity 2)'": 246, "'$(identity 3)'": 912}'\''' --error-on-under-burn check_consistency --pem=2 --balance=0 8000 8001 8002 8003 check_consistency --pem=3 --balance=0 8000 8001 8002 8003 + + # ZZZ minting should fail + call_ledger --pem=1 --port=8000 token mint ZZZ ''\''{"'$(identity 2)'": 123, "'$(identity 3)'": 456}'\''' + assert_output --partial "Token minting is disabled on this network" + + call_ledger --port=8000 token info "${SYMBOL}" + assert_output --regexp "total:.*(.*0,.*)" + assert_output --regexp "circulating:.*(.*0,.*)" }