From b2faa3990311ff03ef403ed0f5dd5cfb624c1435 Mon Sep 17 00:00:00 2001 From: Conor Schaefer Date: Sat, 4 May 2024 23:41:23 -0700 Subject: [PATCH] feat(tests): automated migration testing Building on the smoke-test rewrite to use process-compose, let's script the migration process, so that we can test current HEAD of the monorepo against a prior tagged version, and validate that necessary migrations are in place. One possible approach is to fetch prebuilt binaries from uploaded artifacts on Github. That's fine for `pd`, but doesn't work for running the smoke tests, due to client/server incompatibility. Therefore we'll clone the entire repo in a git-ignored subdir, and build the old binaries there. Heavy, but reliable. Updated to use the concise `pd migrate` UX from #4339. Previously, there were missing AuctionParams, resolved by #4338. It's imperative that we use the vote-to-halt mechanism to prepare for the upgrade, otherwise the priv validator state munging will not work. feat: migration-test crate Strictly for running the migration-test suite of integration tests, very similar in nature to the network-integration tests AKA smoke tests. tests. Copy/pastes a lot of code from the smokes, which we can always factor out into reusable utils, but not bothering with that right now. Next up: still trying to wrangle a migrated-state archive so that a fresh node can join, via `pd testnet join --archive-url`. Don't have that working yet. --- .github/workflows/migration.yml | 38 ++ .gitignore | 4 + Cargo.lock | 82 ++++ Cargo.toml | 2 +- crates/test/migration-test/Cargo.toml | 107 +++++ .../files/migration-allocations.csv | 410 ++++++++++++++++++ crates/test/migration-test/src/main.rs | 3 + .../tests/network_integration.rs | 404 +++++++++++++++++ .../process-compose-migration-test-1.yml | 62 +++ .../process-compose-migration-test-2.yml | 49 +++ .../compose/process-compose-smoke-test.yml | 11 +- deployments/compose/process-compose.yml | 70 +++ deployments/scripts/migration-test | 165 +++++++ deployments/scripts/warn-about-pd-state | 14 + justfile | 10 +- 15 files changed, 1425 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/migration.yml create mode 100644 crates/test/migration-test/Cargo.toml create mode 100644 crates/test/migration-test/files/migration-allocations.csv create mode 100644 crates/test/migration-test/src/main.rs create mode 100644 crates/test/migration-test/tests/network_integration.rs create mode 100644 deployments/compose/process-compose-migration-test-1.yml create mode 100644 deployments/compose/process-compose-migration-test-2.yml create mode 100644 deployments/compose/process-compose.yml create mode 100755 deployments/scripts/migration-test create mode 100755 deployments/scripts/warn-about-pd-state diff --git a/.github/workflows/migration.yml b/.github/workflows/migration.yml new file mode 100644 index 0000000000..00315d1cf0 --- /dev/null +++ b/.github/workflows/migration.yml @@ -0,0 +1,38 @@ +--- +name: Migration test +on: + pull_request: + +jobs: + migration_test: + runs-on: buildjet-16vcpu-ubuntu-2204 + concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + steps: + - uses: actions/checkout@v4 + with: + lfs: true + fetch-tags: true + fetch-depth: 0 + + - name: Load rust cache + uses: astriaorg/buildjet-rust-cache@v2.5.1 + with: + # Cache the git worktree for faster builds + workspaces: |- + . + ./deployments/worktrees/v0.73.1 + + - name: Install cometbft binary + run: ./deployments/scripts/install-cometbft + + - name: Install process-compose + run: >- + sh -c "$(curl --location https://raw.githubusercontent.com/F1bonacc1/process-compose/main/scripts/get-pc.sh)" -- + -d -b ~/bin + + - name: Run migration test + run: | + export PATH="$HOME/bin:$PATH" + ./deployments/scripts/migration-test v0.73.1 diff --git a/.gitignore b/.gitignore index 0ea14d1815..323e152df1 100644 --- a/.gitignore +++ b/.gitignore @@ -50,7 +50,11 @@ deployments/relayer/configs/penumbra-local.json # Logs, and other files from smoke tests deployments/logs/ +deployments/worktrees/ +deployments/bin/ crates/bin/pcli/proposal.toml +crates/test/migration-test/proposal.toml + # Memory profiler, via bytehound or otherwise *.dat diff --git a/Cargo.lock b/Cargo.lock index 13bedf087b..74acbec9d1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3905,6 +3905,88 @@ dependencies = [ "sketches-ddsketch", ] +[[package]] +name = "migration-test" +version = "0.74.0-alpha.1" +dependencies = [ + "anyhow", + "ark-ff", + "assert_cmd", + "async-stream", + "base64 0.21.7", + "bincode", + "blake2b_simd 1.0.2", + "bytes", + "camino", + "clap", + "colored", + "colored_json", + "comfy-table", + "decaf377 0.5.0", + "decaf377-rdsa", + "dialoguer", + "directories", + "ed25519-consensus", + "futures", + "hex", + "http-body", + "humantime", + "ibc-proto", + "ibc-types", + "indicatif", + "jmt", + "ndarray", + "once_cell", + "pbjson-types", + "penumbra-app", + "penumbra-asset", + "penumbra-auction", + "penumbra-community-pool", + "penumbra-compact-block", + "penumbra-custody", + "penumbra-dex", + "penumbra-fee", + "penumbra-governance", + "penumbra-ibc", + "penumbra-keys", + "penumbra-num", + "penumbra-proof-params", + "penumbra-proof-setup", + "penumbra-proto", + "penumbra-sct", + "penumbra-shielded-pool", + "penumbra-stake", + "penumbra-tct", + "penumbra-transaction", + "penumbra-view", + "penumbra-wallet", + "pin-project", + "predicates 2.1.5", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "regex", + "rpassword", + "serde", + "serde_json", + "serde_with", + "sha2 0.10.8", + "simple-base64", + "tempfile", + "tendermint", + "termion", + "time 0.3.34", + "tokio", + "tokio-stream", + "tokio-util 0.7.10", + "toml 0.7.8", + "tonic", + "tower", + "tracing", + "tracing-subscriber 0.3.18", + "url", +] + [[package]] name = "mime" version = "0.3.17" diff --git a/Cargo.toml b/Cargo.toml index 179cd3d960..169a71cfb3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,7 +52,7 @@ members = [ "crates/util/tower-trace", "crates/view", "crates/wallet", - "tools/summonerd", + "tools/summonerd", "crates/test/migration-test", ] # Config for 'cargo dist' diff --git a/crates/test/migration-test/Cargo.toml b/crates/test/migration-test/Cargo.toml new file mode 100644 index 0000000000..f5bf7dbed5 --- /dev/null +++ b/crates/test/migration-test/Cargo.toml @@ -0,0 +1,107 @@ +[package] +name = "migration-test" +description = "Integration test runner for evaluating Penumbra upgrades" +authors.workspace = true +edition.workspace = true +version.workspace = true +repository.workspace = true +homepage.workspace = true +license.workspace = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[features] +# By default, don't enable migration-tests: require explicit opt-in via +# `--features migration-test`. +default = [] +sct-divergence-check = ["penumbra-view/sct-divergence-check"] +migration-test = ["sct-divergence-check"] + +[dependencies] +anyhow = {workspace = true} +pbjson-types = { workspace = true } +ark-ff = {workspace = true, default-features = false} +async-stream = {workspace = true} +base64 = {workspace = true} +bincode = {workspace = true} +blake2b_simd = {workspace = true} +bytes = {workspace = true} +camino = {workspace = true} +clap = {workspace = true, features = ["derive", "env"]} +colored = "2.1.0" +colored_json = "4.1" +comfy-table = "5" +decaf377 = {workspace = true, default-features = true} +decaf377-rdsa = {workspace = true} +dialoguer = "0.10.4" +time = "0.3" +directories = {workspace = true} +ed25519-consensus = {workspace = true} +futures = {workspace = true} +hex = {workspace = true} +http-body = {workspace = true} +humantime = {workspace = true} +ibc-proto = {workspace = true, default-features = true} +ibc-types = {workspace = true, features = ["std", "with_serde"], default-features = true} +indicatif = {workspace = true} +jmt = {workspace = true} +ndarray = "0.15.6" +once_cell = {workspace = true} +penumbra-app = {workspace = true} +penumbra-asset = {workspace = true, default-features = false} +penumbra-community-pool = {workspace = true, default-features = false} +penumbra-compact-block = {workspace = true, default-features = false} +penumbra-custody = {workspace = true} +penumbra-auction = {workspace = true, default-features = false} +penumbra-dex = {workspace = true, default-features = false} +penumbra-fee = {workspace = true, default-features = false} +penumbra-governance = {workspace = true, default-features = false} +penumbra-ibc = {workspace = true, default-features = false} +penumbra-keys = {workspace = true, default-features = false} +penumbra-num = {workspace = true, default-features = false} +penumbra-proof-setup = {workspace = true} +penumbra-proto = {workspace = true, features = ["rpc", "box-grpc"], default-features = true} +penumbra-sct = {workspace = true, default-features = false} +penumbra-shielded-pool = {workspace = true, default-features = false} +penumbra-stake = {workspace = true, default-features = false} +penumbra-tct = {workspace = true, default-features = true} +penumbra-transaction = {workspace = true, default-features = true} +penumbra-view = {workspace = true} +penumbra-wallet = { path = "../../wallet" } +pin-project = {workspace = true} +rand = {workspace = true} +rand_chacha = {workspace = true} +rand_core = {workspace = true, features = ["getrandom"]} +regex = {workspace = true} +rpassword = "7" +serde = {workspace = true, features = ["derive"]} +serde_json = {workspace = true} +serde_with = {workspace = true, features = ["hex"]} +sha2 = {workspace = true} +simple-base64 = "0.23" +tendermint = {workspace = true, features = ["rust-crypto"], default-features = true} +tokio = {workspace = true, features = ["full"]} +tokio-stream = {workspace = true} +tokio-util = {workspace = true} +toml = {workspace = true, features = ["preserve_order"]} +tonic = {workspace = true, features = ["tls-webpki-roots", "tls"]} +tower = {workspace = true, features = ["full"]} +termion = {workspace = true} +tracing = {workspace = true} +tracing-subscriber = {workspace = true, features = ["env-filter", "ansi"]} +url = {workspace = true, features = ["serde"]} + +[dev-dependencies] +assert_cmd = {workspace = true} +penumbra-governance = {workspace = true, default-features = false} +predicates = "2.1" +regex = {workspace = true} +tempfile = {workspace = true} + +[dev-dependencies.penumbra-proof-params] +default-features = true +workspace = true +features = [ + "bundled-proving-keys", + "download-proving-keys", +] diff --git a/crates/test/migration-test/files/migration-allocations.csv b/crates/test/migration-test/files/migration-allocations.csv new file mode 100644 index 0000000000..f11dfc2bdb --- /dev/null +++ b/crates/test/migration-test/files/migration-allocations.csv @@ -0,0 +1,410 @@ +amount,denom,address +1_000_000__000_000,upenumbra,penumbra1tj9s0dh8ymphnw2qgrva57wpcmpr38e9a8w05t5c8dyynr7dt58hgnare7tunqyuryc7yag084rqxrsrj9yx8uk9yhs8lmg64hl993wn3rphlvan3paxdd6suyhwnpkd6cwzes +20_000,gm,penumbra1tj9s0dh8ymphnw2qgrva57wpcmpr38e9a8w05t5c8dyynr7dt58hgnare7tunqyuryc7yag084rqxrsrj9yx8uk9yhs8lmg64hl993wn3rphlvan3paxdd6suyhwnpkd6cwzes +20_000,gn,penumbra1tj9s0dh8ymphnw2qgrva57wpcmpr38e9a8w05t5c8dyynr7dt58hgnare7tunqyuryc7yag084rqxrsrj9yx8uk9yhs8lmg64hl993wn3rphlvan3paxdd6suyhwnpkd6cwzes +10_000,pizza,penumbra1tj9s0dh8ymphnw2qgrva57wpcmpr38e9a8w05t5c8dyynr7dt58hgnare7tunqyuryc7yag084rqxrsrj9yx8uk9yhs8lmg64hl993wn3rphlvan3paxdd6suyhwnpkd6cwzes +100,cube,penumbra1tj9s0dh8ymphnw2qgrva57wpcmpr38e9a8w05t5c8dyynr7dt58hgnare7tunqyuryc7yag084rqxrsrj9yx8uk9yhs8lmg64hl993wn3rphlvan3paxdd6suyhwnpkd6cwzes +500_000,test_usd,penumbra1tj9s0dh8ymphnw2qgrva57wpcmpr38e9a8w05t5c8dyynr7dt58hgnare7tunqyuryc7yag084rqxrsrj9yx8uk9yhs8lmg64hl993wn3rphlvan3paxdd6suyhwnpkd6cwzes +1_000_000__000_000,upenumbra,penumbra12ts5g469dpjdcn2wmdkz25nng6snxkuxumfnmygtrp2fm6776zjw7r35y2j7s07h8368a4kr3c904w8cjgpm6v3ysaj6gh930z7fwlqq9kvjewsy9fgamzxyj874kgu5uvcshg +20_000,gm,penumbra12ts5g469dpjdcn2wmdkz25nng6snxkuxumfnmygtrp2fm6776zjw7r35y2j7s07h8368a4kr3c904w8cjgpm6v3ysaj6gh930z7fwlqq9kvjewsy9fgamzxyj874kgu5uvcshg +20_000,gn,penumbra12ts5g469dpjdcn2wmdkz25nng6snxkuxumfnmygtrp2fm6776zjw7r35y2j7s07h8368a4kr3c904w8cjgpm6v3ysaj6gh930z7fwlqq9kvjewsy9fgamzxyj874kgu5uvcshg +10_000,pizza,penumbra12ts5g469dpjdcn2wmdkz25nng6snxkuxumfnmygtrp2fm6776zjw7r35y2j7s07h8368a4kr3c904w8cjgpm6v3ysaj6gh930z7fwlqq9kvjewsy9fgamzxyj874kgu5uvcshg +100,cube,penumbra12ts5g469dpjdcn2wmdkz25nng6snxkuxumfnmygtrp2fm6776zjw7r35y2j7s07h8368a4kr3c904w8cjgpm6v3ysaj6gh930z7fwlqq9kvjewsy9fgamzxyj874kgu5uvcshg +500_000,test_usd,penumbra12ts5g469dpjdcn2wmdkz25nng6snxkuxumfnmygtrp2fm6776zjw7r35y2j7s07h8368a4kr3c904w8cjgpm6v3ysaj6gh930z7fwlqq9kvjewsy9fgamzxyj874kgu5uvcshg +1_000_000__000_000,upenumbra,penumbra19zz058ttl8vhsypztc0gyl9yfs7jcn3906kgd3pzeh944klh8vf2ttx7qvscxwtuecw92cy6n55ttjn482q7ufpzwj5yem9xcvecrd2zc6vgctxzc3k7mnpg0lk8vved00e3g0 +20_000,gm,penumbra19zz058ttl8vhsypztc0gyl9yfs7jcn3906kgd3pzeh944klh8vf2ttx7qvscxwtuecw92cy6n55ttjn482q7ufpzwj5yem9xcvecrd2zc6vgctxzc3k7mnpg0lk8vved00e3g0 +20_000,gn,penumbra19zz058ttl8vhsypztc0gyl9yfs7jcn3906kgd3pzeh944klh8vf2ttx7qvscxwtuecw92cy6n55ttjn482q7ufpzwj5yem9xcvecrd2zc6vgctxzc3k7mnpg0lk8vved00e3g0 +10_000,pizza,penumbra19zz058ttl8vhsypztc0gyl9yfs7jcn3906kgd3pzeh944klh8vf2ttx7qvscxwtuecw92cy6n55ttjn482q7ufpzwj5yem9xcvecrd2zc6vgctxzc3k7mnpg0lk8vved00e3g0 +100,cube,penumbra19zz058ttl8vhsypztc0gyl9yfs7jcn3906kgd3pzeh944klh8vf2ttx7qvscxwtuecw92cy6n55ttjn482q7ufpzwj5yem9xcvecrd2zc6vgctxzc3k7mnpg0lk8vved00e3g0 +500_000,test_usd,penumbra19zz058ttl8vhsypztc0gyl9yfs7jcn3906kgd3pzeh944klh8vf2ttx7qvscxwtuecw92cy6n55ttjn482q7ufpzwj5yem9xcvecrd2zc6vgctxzc3k7mnpg0lk8vved00e3g0 +1_000_000__000_000,upenumbra,penumbra1hckq024z3fd6wl29kk4rwfnykgyxyawpuw8zc04npc7s40hey0xghltdcsk7q5k0cq77qjtg8gt0cnvqff94s8j5tvx94ssyjyr35c9rqx08lkwxfqgr6dt3vu99wg8dg0c7jz +20_000,gm,penumbra1hckq024z3fd6wl29kk4rwfnykgyxyawpuw8zc04npc7s40hey0xghltdcsk7q5k0cq77qjtg8gt0cnvqff94s8j5tvx94ssyjyr35c9rqx08lkwxfqgr6dt3vu99wg8dg0c7jz +20_000,gn,penumbra1hckq024z3fd6wl29kk4rwfnykgyxyawpuw8zc04npc7s40hey0xghltdcsk7q5k0cq77qjtg8gt0cnvqff94s8j5tvx94ssyjyr35c9rqx08lkwxfqgr6dt3vu99wg8dg0c7jz +10_000,pizza,penumbra1hckq024z3fd6wl29kk4rwfnykgyxyawpuw8zc04npc7s40hey0xghltdcsk7q5k0cq77qjtg8gt0cnvqff94s8j5tvx94ssyjyr35c9rqx08lkwxfqgr6dt3vu99wg8dg0c7jz +100,cube,penumbra1hckq024z3fd6wl29kk4rwfnykgyxyawpuw8zc04npc7s40hey0xghltdcsk7q5k0cq77qjtg8gt0cnvqff94s8j5tvx94ssyjyr35c9rqx08lkwxfqgr6dt3vu99wg8dg0c7jz +500_000,test_usd,penumbra1hckq024z3fd6wl29kk4rwfnykgyxyawpuw8zc04npc7s40hey0xghltdcsk7q5k0cq77qjtg8gt0cnvqff94s8j5tvx94ssyjyr35c9rqx08lkwxfqgr6dt3vu99wg8dg0c7jz +1_000_000__000_000,upenumbra,penumbra1djxk3jzq5d3ga63vut39gdr9lh57yp34pu79jnjmjna3mmxuqaf476e7ar9je0hfn35cpuu4s7l9vae4gfd4773zepygwed5pfgdad26pvzd6qqaur4czes0cl5ku7jjvhx0e0 +20_000,gm,penumbra1djxk3jzq5d3ga63vut39gdr9lh57yp34pu79jnjmjna3mmxuqaf476e7ar9je0hfn35cpuu4s7l9vae4gfd4773zepygwed5pfgdad26pvzd6qqaur4czes0cl5ku7jjvhx0e0 +20_000,gn,penumbra1djxk3jzq5d3ga63vut39gdr9lh57yp34pu79jnjmjna3mmxuqaf476e7ar9je0hfn35cpuu4s7l9vae4gfd4773zepygwed5pfgdad26pvzd6qqaur4czes0cl5ku7jjvhx0e0 +10_000,pizza,penumbra1djxk3jzq5d3ga63vut39gdr9lh57yp34pu79jnjmjna3mmxuqaf476e7ar9je0hfn35cpuu4s7l9vae4gfd4773zepygwed5pfgdad26pvzd6qqaur4czes0cl5ku7jjvhx0e0 +100,cube,penumbra1djxk3jzq5d3ga63vut39gdr9lh57yp34pu79jnjmjna3mmxuqaf476e7ar9je0hfn35cpuu4s7l9vae4gfd4773zepygwed5pfgdad26pvzd6qqaur4czes0cl5ku7jjvhx0e0 +500_000,test_usd,penumbra1djxk3jzq5d3ga63vut39gdr9lh57yp34pu79jnjmjna3mmxuqaf476e7ar9je0hfn35cpuu4s7l9vae4gfd4773zepygwed5pfgdad26pvzd6qqaur4czes0cl5ku7jjvhx0e0 +1_000_000__000_000,upenumbra,penumbra1f5qra6dk8pmp0m2s42sq4qsxthjp6mmcpj3rjwrn74getpmwhrgzhe545fhz6eew2gdcpn2ee0j7fdm4whxl8ux6p5jz6g5fz72u4pzd4z26jnxeasvsvwapx2lvhxw8uy7dvw +20_000,gm,penumbra1f5qra6dk8pmp0m2s42sq4qsxthjp6mmcpj3rjwrn74getpmwhrgzhe545fhz6eew2gdcpn2ee0j7fdm4whxl8ux6p5jz6g5fz72u4pzd4z26jnxeasvsvwapx2lvhxw8uy7dvw +20_000,gn,penumbra1f5qra6dk8pmp0m2s42sq4qsxthjp6mmcpj3rjwrn74getpmwhrgzhe545fhz6eew2gdcpn2ee0j7fdm4whxl8ux6p5jz6g5fz72u4pzd4z26jnxeasvsvwapx2lvhxw8uy7dvw +10_000,pizza,penumbra1f5qra6dk8pmp0m2s42sq4qsxthjp6mmcpj3rjwrn74getpmwhrgzhe545fhz6eew2gdcpn2ee0j7fdm4whxl8ux6p5jz6g5fz72u4pzd4z26jnxeasvsvwapx2lvhxw8uy7dvw +100,cube,penumbra1f5qra6dk8pmp0m2s42sq4qsxthjp6mmcpj3rjwrn74getpmwhrgzhe545fhz6eew2gdcpn2ee0j7fdm4whxl8ux6p5jz6g5fz72u4pzd4z26jnxeasvsvwapx2lvhxw8uy7dvw +500_000,test_usd,penumbra1f5qra6dk8pmp0m2s42sq4qsxthjp6mmcpj3rjwrn74getpmwhrgzhe545fhz6eew2gdcpn2ee0j7fdm4whxl8ux6p5jz6g5fz72u4pzd4z26jnxeasvsvwapx2lvhxw8uy7dvw +1_000_000__000_000,upenumbra,penumbra18dms48wvudc7qljl6zjq48hyuvxxvhm2se2zltpjndpnn5c092mwych7uvs0xztpc7q0e2j7s89nyfxyj2pmu50zafvhwq5x4prm49ax6c7txmvjjdkgu9c8u0nhyqgrsmfn2c +20_000,gm,penumbra18dms48wvudc7qljl6zjq48hyuvxxvhm2se2zltpjndpnn5c092mwych7uvs0xztpc7q0e2j7s89nyfxyj2pmu50zafvhwq5x4prm49ax6c7txmvjjdkgu9c8u0nhyqgrsmfn2c +20_000,gn,penumbra18dms48wvudc7qljl6zjq48hyuvxxvhm2se2zltpjndpnn5c092mwych7uvs0xztpc7q0e2j7s89nyfxyj2pmu50zafvhwq5x4prm49ax6c7txmvjjdkgu9c8u0nhyqgrsmfn2c +10_000,pizza,penumbra18dms48wvudc7qljl6zjq48hyuvxxvhm2se2zltpjndpnn5c092mwych7uvs0xztpc7q0e2j7s89nyfxyj2pmu50zafvhwq5x4prm49ax6c7txmvjjdkgu9c8u0nhyqgrsmfn2c +100,cube,penumbra18dms48wvudc7qljl6zjq48hyuvxxvhm2se2zltpjndpnn5c092mwych7uvs0xztpc7q0e2j7s89nyfxyj2pmu50zafvhwq5x4prm49ax6c7txmvjjdkgu9c8u0nhyqgrsmfn2c +500_000,test_usd,penumbra18dms48wvudc7qljl6zjq48hyuvxxvhm2se2zltpjndpnn5c092mwych7uvs0xztpc7q0e2j7s89nyfxyj2pmu50zafvhwq5x4prm49ax6c7txmvjjdkgu9c8u0nhyqgrsmfn2c +1_000_000__000_000,upenumbra,penumbra169w7gexlfa9m7gsa3vmwyfpu92j0yxawmlkt06g3qg5ta29czwzepzqp0d0nl324jgcjrc6fy0kmqhjlureeyjulejug8e2h6zj0kqf0vapwszahqm8swg634extm3837kl59v +20_000,gm,penumbra169w7gexlfa9m7gsa3vmwyfpu92j0yxawmlkt06g3qg5ta29czwzepzqp0d0nl324jgcjrc6fy0kmqhjlureeyjulejug8e2h6zj0kqf0vapwszahqm8swg634extm3837kl59v +20_000,gn,penumbra169w7gexlfa9m7gsa3vmwyfpu92j0yxawmlkt06g3qg5ta29czwzepzqp0d0nl324jgcjrc6fy0kmqhjlureeyjulejug8e2h6zj0kqf0vapwszahqm8swg634extm3837kl59v +10_000,pizza,penumbra169w7gexlfa9m7gsa3vmwyfpu92j0yxawmlkt06g3qg5ta29czwzepzqp0d0nl324jgcjrc6fy0kmqhjlureeyjulejug8e2h6zj0kqf0vapwszahqm8swg634extm3837kl59v +100,cube,penumbra169w7gexlfa9m7gsa3vmwyfpu92j0yxawmlkt06g3qg5ta29czwzepzqp0d0nl324jgcjrc6fy0kmqhjlureeyjulejug8e2h6zj0kqf0vapwszahqm8swg634extm3837kl59v +500_000,test_usd,penumbra169w7gexlfa9m7gsa3vmwyfpu92j0yxawmlkt06g3qg5ta29czwzepzqp0d0nl324jgcjrc6fy0kmqhjlureeyjulejug8e2h6zj0kqf0vapwszahqm8swg634extm3837kl59v +1_000_000__000_000,upenumbra,penumbra10as9rd2ny8w6v70sx4cetrph9twy5vu4ystjz6ae0uuutjamfztl2649vdufmya02a6r0907ywuxkhz3uve6thaf5et2jhnx97k0h0t07ad9pdhawls7wzklrktefzwwvrxtsn +20_000,gm,penumbra10as9rd2ny8w6v70sx4cetrph9twy5vu4ystjz6ae0uuutjamfztl2649vdufmya02a6r0907ywuxkhz3uve6thaf5et2jhnx97k0h0t07ad9pdhawls7wzklrktefzwwvrxtsn +20_000,gn,penumbra10as9rd2ny8w6v70sx4cetrph9twy5vu4ystjz6ae0uuutjamfztl2649vdufmya02a6r0907ywuxkhz3uve6thaf5et2jhnx97k0h0t07ad9pdhawls7wzklrktefzwwvrxtsn +10_000,pizza,penumbra10as9rd2ny8w6v70sx4cetrph9twy5vu4ystjz6ae0uuutjamfztl2649vdufmya02a6r0907ywuxkhz3uve6thaf5et2jhnx97k0h0t07ad9pdhawls7wzklrktefzwwvrxtsn +100,cube,penumbra10as9rd2ny8w6v70sx4cetrph9twy5vu4ystjz6ae0uuutjamfztl2649vdufmya02a6r0907ywuxkhz3uve6thaf5et2jhnx97k0h0t07ad9pdhawls7wzklrktefzwwvrxtsn +500_000,test_usd,penumbra10as9rd2ny8w6v70sx4cetrph9twy5vu4ystjz6ae0uuutjamfztl2649vdufmya02a6r0907ywuxkhz3uve6thaf5et2jhnx97k0h0t07ad9pdhawls7wzklrktefzwwvrxtsn +1_000_000__000_000,upenumbra,penumbra1ks9t4vrp9alvk9yfapyu75hjf7p3wva76t0dz9a902zlp8vuyn0q9j2a72pu9j0uxmg356xstqpmafkj28ktx37l4lzq25nmgdeay5ls00yky2pgladnr5z7u3ftav7lw9vnre +20_000,gm,penumbra1ks9t4vrp9alvk9yfapyu75hjf7p3wva76t0dz9a902zlp8vuyn0q9j2a72pu9j0uxmg356xstqpmafkj28ktx37l4lzq25nmgdeay5ls00yky2pgladnr5z7u3ftav7lw9vnre +20_000,gn,penumbra1ks9t4vrp9alvk9yfapyu75hjf7p3wva76t0dz9a902zlp8vuyn0q9j2a72pu9j0uxmg356xstqpmafkj28ktx37l4lzq25nmgdeay5ls00yky2pgladnr5z7u3ftav7lw9vnre +10_000,pizza,penumbra1ks9t4vrp9alvk9yfapyu75hjf7p3wva76t0dz9a902zlp8vuyn0q9j2a72pu9j0uxmg356xstqpmafkj28ktx37l4lzq25nmgdeay5ls00yky2pgladnr5z7u3ftav7lw9vnre +100,cube,penumbra1ks9t4vrp9alvk9yfapyu75hjf7p3wva76t0dz9a902zlp8vuyn0q9j2a72pu9j0uxmg356xstqpmafkj28ktx37l4lzq25nmgdeay5ls00yky2pgladnr5z7u3ftav7lw9vnre +500_000,test_usd,penumbra1ks9t4vrp9alvk9yfapyu75hjf7p3wva76t0dz9a902zlp8vuyn0q9j2a72pu9j0uxmg356xstqpmafkj28ktx37l4lzq25nmgdeay5ls00yky2pgladnr5z7u3ftav7lw9vnre +1_000_000__000_000,upenumbra,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +20_000,gm,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +20_000,gn,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +10_000,pizza,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +100,cube,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +500_000,test_usd,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +1_000_000__000_000,upenumbra,penumbra1u8eg9v2dlge3yd7gjkdmnzj3quvgwy204ueryl0uzxpjjpan4fwkjwd8mlrkpfffe6vuweeq0x7wn3rhljj7qaedye4kuhpj9fmcu4zl0cn6up0syg60hrc70x9edf2gy0shft +20_000,gm,penumbra1u8eg9v2dlge3yd7gjkdmnzj3quvgwy204ueryl0uzxpjjpan4fwkjwd8mlrkpfffe6vuweeq0x7wn3rhljj7qaedye4kuhpj9fmcu4zl0cn6up0syg60hrc70x9edf2gy0shft +20_000,gn,penumbra1u8eg9v2dlge3yd7gjkdmnzj3quvgwy204ueryl0uzxpjjpan4fwkjwd8mlrkpfffe6vuweeq0x7wn3rhljj7qaedye4kuhpj9fmcu4zl0cn6up0syg60hrc70x9edf2gy0shft +10_000,pizza,penumbra1u8eg9v2dlge3yd7gjkdmnzj3quvgwy204ueryl0uzxpjjpan4fwkjwd8mlrkpfffe6vuweeq0x7wn3rhljj7qaedye4kuhpj9fmcu4zl0cn6up0syg60hrc70x9edf2gy0shft +100,cube,penumbra1u8eg9v2dlge3yd7gjkdmnzj3quvgwy204ueryl0uzxpjjpan4fwkjwd8mlrkpfffe6vuweeq0x7wn3rhljj7qaedye4kuhpj9fmcu4zl0cn6up0syg60hrc70x9edf2gy0shft +500_000,test_usd,penumbra1u8eg9v2dlge3yd7gjkdmnzj3quvgwy204ueryl0uzxpjjpan4fwkjwd8mlrkpfffe6vuweeq0x7wn3rhljj7qaedye4kuhpj9fmcu4zl0cn6up0syg60hrc70x9edf2gy0shft +1_000_000__000_000,upenumbra,penumbra1r70z64vqnmv28rttpv60hppd7gca9w5a3zwctx4c6yrtfd4mlvjrevkx3l2swdnw8vq7amylgfwaq2x97dlxmmh0flpxetmd8gjf0rpmg083ms94psmvpgy7hgdhwwn6nr92sc +20_000,gm,penumbra1r70z64vqnmv28rttpv60hppd7gca9w5a3zwctx4c6yrtfd4mlvjrevkx3l2swdnw8vq7amylgfwaq2x97dlxmmh0flpxetmd8gjf0rpmg083ms94psmvpgy7hgdhwwn6nr92sc +20_000,gn,penumbra1r70z64vqnmv28rttpv60hppd7gca9w5a3zwctx4c6yrtfd4mlvjrevkx3l2swdnw8vq7amylgfwaq2x97dlxmmh0flpxetmd8gjf0rpmg083ms94psmvpgy7hgdhwwn6nr92sc +10_000,pizza,penumbra1r70z64vqnmv28rttpv60hppd7gca9w5a3zwctx4c6yrtfd4mlvjrevkx3l2swdnw8vq7amylgfwaq2x97dlxmmh0flpxetmd8gjf0rpmg083ms94psmvpgy7hgdhwwn6nr92sc +100,cube,penumbra1r70z64vqnmv28rttpv60hppd7gca9w5a3zwctx4c6yrtfd4mlvjrevkx3l2swdnw8vq7amylgfwaq2x97dlxmmh0flpxetmd8gjf0rpmg083ms94psmvpgy7hgdhwwn6nr92sc +500_000,test_usd,penumbra1r70z64vqnmv28rttpv60hppd7gca9w5a3zwctx4c6yrtfd4mlvjrevkx3l2swdnw8vq7amylgfwaq2x97dlxmmh0flpxetmd8gjf0rpmg083ms94psmvpgy7hgdhwwn6nr92sc +1_000_000__000_000,upenumbra,penumbra18z69jxec5008krvlhw84459ecermc2x5r06flunlz6m45ftmphp2djp9cpxy4n4m2tykz00jjd3pgm5n3etpaq43ypt4xffcz8ag0ay3hutt7hdfevmjfft237j2x2vae99v3f +20_000,gm,penumbra18z69jxec5008krvlhw84459ecermc2x5r06flunlz6m45ftmphp2djp9cpxy4n4m2tykz00jjd3pgm5n3etpaq43ypt4xffcz8ag0ay3hutt7hdfevmjfft237j2x2vae99v3f +20_000,gn,penumbra18z69jxec5008krvlhw84459ecermc2x5r06flunlz6m45ftmphp2djp9cpxy4n4m2tykz00jjd3pgm5n3etpaq43ypt4xffcz8ag0ay3hutt7hdfevmjfft237j2x2vae99v3f +10_000,pizza,penumbra18z69jxec5008krvlhw84459ecermc2x5r06flunlz6m45ftmphp2djp9cpxy4n4m2tykz00jjd3pgm5n3etpaq43ypt4xffcz8ag0ay3hutt7hdfevmjfft237j2x2vae99v3f +100,cube,penumbra18z69jxec5008krvlhw84459ecermc2x5r06flunlz6m45ftmphp2djp9cpxy4n4m2tykz00jjd3pgm5n3etpaq43ypt4xffcz8ag0ay3hutt7hdfevmjfft237j2x2vae99v3f +500_000,test_usd,penumbra18z69jxec5008krvlhw84459ecermc2x5r06flunlz6m45ftmphp2djp9cpxy4n4m2tykz00jjd3pgm5n3etpaq43ypt4xffcz8ag0ay3hutt7hdfevmjfft237j2x2vae99v3f +1_000_000__000_000,upenumbra,penumbra1q87euedu4yw3f8c025zulgu6tgc8frmhak7ge6xwyauuptlp4z25mn92z6qpa9nhdp08rfs3lakxqpgpd58m8u02cjcrpec0xdt6t9zlgq7fkxmklvtpktykwn0rdlxeqyny2n +20_000,gm,penumbra1q87euedu4yw3f8c025zulgu6tgc8frmhak7ge6xwyauuptlp4z25mn92z6qpa9nhdp08rfs3lakxqpgpd58m8u02cjcrpec0xdt6t9zlgq7fkxmklvtpktykwn0rdlxeqyny2n +20_000,gn,penumbra1q87euedu4yw3f8c025zulgu6tgc8frmhak7ge6xwyauuptlp4z25mn92z6qpa9nhdp08rfs3lakxqpgpd58m8u02cjcrpec0xdt6t9zlgq7fkxmklvtpktykwn0rdlxeqyny2n +10_000,pizza,penumbra1q87euedu4yw3f8c025zulgu6tgc8frmhak7ge6xwyauuptlp4z25mn92z6qpa9nhdp08rfs3lakxqpgpd58m8u02cjcrpec0xdt6t9zlgq7fkxmklvtpktykwn0rdlxeqyny2n +100,cube,penumbra1q87euedu4yw3f8c025zulgu6tgc8frmhak7ge6xwyauuptlp4z25mn92z6qpa9nhdp08rfs3lakxqpgpd58m8u02cjcrpec0xdt6t9zlgq7fkxmklvtpktykwn0rdlxeqyny2n +500_000,test_usd,penumbra1q87euedu4yw3f8c025zulgu6tgc8frmhak7ge6xwyauuptlp4z25mn92z6qpa9nhdp08rfs3lakxqpgpd58m8u02cjcrpec0xdt6t9zlgq7fkxmklvtpktykwn0rdlxeqyny2n +1_000_000__000_000,upenumbra,penumbra1zn54t9n55da28vkytffkkrlfxcwutn4nlj05xwfw4jmgzr60jfqazvahzwz2ts9j0juru8r8ghwr47klmcvuhny6jfcunahs84z7fmgkk54xvfmvveqh4yjc69sg0jrf92r6kn +20_000,gm,penumbra1zn54t9n55da28vkytffkkrlfxcwutn4nlj05xwfw4jmgzr60jfqazvahzwz2ts9j0juru8r8ghwr47klmcvuhny6jfcunahs84z7fmgkk54xvfmvveqh4yjc69sg0jrf92r6kn +20_000,gn,penumbra1zn54t9n55da28vkytffkkrlfxcwutn4nlj05xwfw4jmgzr60jfqazvahzwz2ts9j0juru8r8ghwr47klmcvuhny6jfcunahs84z7fmgkk54xvfmvveqh4yjc69sg0jrf92r6kn +10_000,pizza,penumbra1zn54t9n55da28vkytffkkrlfxcwutn4nlj05xwfw4jmgzr60jfqazvahzwz2ts9j0juru8r8ghwr47klmcvuhny6jfcunahs84z7fmgkk54xvfmvveqh4yjc69sg0jrf92r6kn +100,cube,penumbra1zn54t9n55da28vkytffkkrlfxcwutn4nlj05xwfw4jmgzr60jfqazvahzwz2ts9j0juru8r8ghwr47klmcvuhny6jfcunahs84z7fmgkk54xvfmvveqh4yjc69sg0jrf92r6kn +500_000,test_usd,penumbra1zn54t9n55da28vkytffkkrlfxcwutn4nlj05xwfw4jmgzr60jfqazvahzwz2ts9j0juru8r8ghwr47klmcvuhny6jfcunahs84z7fmgkk54xvfmvveqh4yjc69sg0jrf92r6kn +1_000_000__000_000,upenumbra,penumbra10kqp4qk220hc2flys45czh2vsc30jwl4mfy8styvjnz0zlhtw6gef74k0v2r7nqghlkuauxd9wafpz2nh8rjfqp747hc3hxakml793rjau6ljnm46vlmnpmczt4jkq8xcdakgg +20_000,gm,penumbra10kqp4qk220hc2flys45czh2vsc30jwl4mfy8styvjnz0zlhtw6gef74k0v2r7nqghlkuauxd9wafpz2nh8rjfqp747hc3hxakml793rjau6ljnm46vlmnpmczt4jkq8xcdakgg +20_000,gn,penumbra10kqp4qk220hc2flys45czh2vsc30jwl4mfy8styvjnz0zlhtw6gef74k0v2r7nqghlkuauxd9wafpz2nh8rjfqp747hc3hxakml793rjau6ljnm46vlmnpmczt4jkq8xcdakgg +10_000,pizza,penumbra10kqp4qk220hc2flys45czh2vsc30jwl4mfy8styvjnz0zlhtw6gef74k0v2r7nqghlkuauxd9wafpz2nh8rjfqp747hc3hxakml793rjau6ljnm46vlmnpmczt4jkq8xcdakgg +100,cube,penumbra10kqp4qk220hc2flys45czh2vsc30jwl4mfy8styvjnz0zlhtw6gef74k0v2r7nqghlkuauxd9wafpz2nh8rjfqp747hc3hxakml793rjau6ljnm46vlmnpmczt4jkq8xcdakgg +500_000,test_usd,penumbra10kqp4qk220hc2flys45czh2vsc30jwl4mfy8styvjnz0zlhtw6gef74k0v2r7nqghlkuauxd9wafpz2nh8rjfqp747hc3hxakml793rjau6ljnm46vlmnpmczt4jkq8xcdakgg +5_000_000__000_000,upenumbra,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg +50_000,gm,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg +50_000,gn,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg +25_000,pizza,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg +250,cube,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg +1_000_000,test_usd,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg +10_000,nala,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg +5_000_000__000_000,upenumbra,penumbra1mflr95lhj0vjr86uyffkmxg6hjamjs7rrcykwgnyt8lcz0a6xqzh0xz78hpnq3x70s8cnu4cnyqq2wgkt9nthcc3k8scf4wlraccdmkr6wyzsap88t0du2dlv5xclgkmwmwnct +50_000,gm,penumbra1mflr95lhj0vjr86uyffkmxg6hjamjs7rrcykwgnyt8lcz0a6xqzh0xz78hpnq3x70s8cnu4cnyqq2wgkt9nthcc3k8scf4wlraccdmkr6wyzsap88t0du2dlv5xclgkmwmwnct +50_000,gn,penumbra1mflr95lhj0vjr86uyffkmxg6hjamjs7rrcykwgnyt8lcz0a6xqzh0xz78hpnq3x70s8cnu4cnyqq2wgkt9nthcc3k8scf4wlraccdmkr6wyzsap88t0du2dlv5xclgkmwmwnct +25_000,pizza,penumbra1mflr95lhj0vjr86uyffkmxg6hjamjs7rrcykwgnyt8lcz0a6xqzh0xz78hpnq3x70s8cnu4cnyqq2wgkt9nthcc3k8scf4wlraccdmkr6wyzsap88t0du2dlv5xclgkmwmwnct +250,cube,penumbra1mflr95lhj0vjr86uyffkmxg6hjamjs7rrcykwgnyt8lcz0a6xqzh0xz78hpnq3x70s8cnu4cnyqq2wgkt9nthcc3k8scf4wlraccdmkr6wyzsap88t0du2dlv5xclgkmwmwnct +1_000_000,test_usd,penumbra1mflr95lhj0vjr86uyffkmxg6hjamjs7rrcykwgnyt8lcz0a6xqzh0xz78hpnq3x70s8cnu4cnyqq2wgkt9nthcc3k8scf4wlraccdmkr6wyzsap88t0du2dlv5xclgkmwmwnct +10_000,nala,penumbra1mflr95lhj0vjr86uyffkmxg6hjamjs7rrcykwgnyt8lcz0a6xqzh0xz78hpnq3x70s8cnu4cnyqq2wgkt9nthcc3k8scf4wlraccdmkr6wyzsap88t0du2dlv5xclgkmwmwnct +5_000_000__000_000,upenumbra,penumbra1jdgsqxnqqhqwjc6j3lhm4qnqz4gu02j87p4v0uj95ur9xdtym9acnj6p6ykqx89crmj0gw8r6fl4xh4la2yxyks9czl4lvqsxm9e5u86gdus0fh9hqxvg8aq47cw9fv8l2vh34 +50_000,gm,penumbra1jdgsqxnqqhqwjc6j3lhm4qnqz4gu02j87p4v0uj95ur9xdtym9acnj6p6ykqx89crmj0gw8r6fl4xh4la2yxyks9czl4lvqsxm9e5u86gdus0fh9hqxvg8aq47cw9fv8l2vh34 +50_000,gn,penumbra1jdgsqxnqqhqwjc6j3lhm4qnqz4gu02j87p4v0uj95ur9xdtym9acnj6p6ykqx89crmj0gw8r6fl4xh4la2yxyks9czl4lvqsxm9e5u86gdus0fh9hqxvg8aq47cw9fv8l2vh34 +25_000,pizza,penumbra1jdgsqxnqqhqwjc6j3lhm4qnqz4gu02j87p4v0uj95ur9xdtym9acnj6p6ykqx89crmj0gw8r6fl4xh4la2yxyks9czl4lvqsxm9e5u86gdus0fh9hqxvg8aq47cw9fv8l2vh34 +250,cube,penumbra1jdgsqxnqqhqwjc6j3lhm4qnqz4gu02j87p4v0uj95ur9xdtym9acnj6p6ykqx89crmj0gw8r6fl4xh4la2yxyks9czl4lvqsxm9e5u86gdus0fh9hqxvg8aq47cw9fv8l2vh34 +1_000_000,test_usd,penumbra1jdgsqxnqqhqwjc6j3lhm4qnqz4gu02j87p4v0uj95ur9xdtym9acnj6p6ykqx89crmj0gw8r6fl4xh4la2yxyks9czl4lvqsxm9e5u86gdus0fh9hqxvg8aq47cw9fv8l2vh34 +10_000,nala,penumbra1jdgsqxnqqhqwjc6j3lhm4qnqz4gu02j87p4v0uj95ur9xdtym9acnj6p6ykqx89crmj0gw8r6fl4xh4la2yxyks9czl4lvqsxm9e5u86gdus0fh9hqxvg8aq47cw9fv8l2vh34 +5_000_000__000_000,upenumbra,penumbra1k20526f5je6c3mftpuu7p7mn3tr3p84x4qgm2nla9czwae9awse6mqsvn8qgr83y3cnhh7wkwv0s29ycs9r4p6lr5eeee0emquun8v7qlt7lt8w7ck3ukl5ctnufhzwmj00utn +50_000,gm,penumbra1k20526f5je6c3mftpuu7p7mn3tr3p84x4qgm2nla9czwae9awse6mqsvn8qgr83y3cnhh7wkwv0s29ycs9r4p6lr5eeee0emquun8v7qlt7lt8w7ck3ukl5ctnufhzwmj00utn +50_000,gn,penumbra1k20526f5je6c3mftpuu7p7mn3tr3p84x4qgm2nla9czwae9awse6mqsvn8qgr83y3cnhh7wkwv0s29ycs9r4p6lr5eeee0emquun8v7qlt7lt8w7ck3ukl5ctnufhzwmj00utn +25_000,pizza,penumbra1k20526f5je6c3mftpuu7p7mn3tr3p84x4qgm2nla9czwae9awse6mqsvn8qgr83y3cnhh7wkwv0s29ycs9r4p6lr5eeee0emquun8v7qlt7lt8w7ck3ukl5ctnufhzwmj00utn +250,cube,penumbra1k20526f5je6c3mftpuu7p7mn3tr3p84x4qgm2nla9czwae9awse6mqsvn8qgr83y3cnhh7wkwv0s29ycs9r4p6lr5eeee0emquun8v7qlt7lt8w7ck3ukl5ctnufhzwmj00utn +1_000_000,test_usd,penumbra1k20526f5je6c3mftpuu7p7mn3tr3p84x4qgm2nla9czwae9awse6mqsvn8qgr83y3cnhh7wkwv0s29ycs9r4p6lr5eeee0emquun8v7qlt7lt8w7ck3ukl5ctnufhzwmj00utn +10_000,nala,penumbra1k20526f5je6c3mftpuu7p7mn3tr3p84x4qgm2nla9czwae9awse6mqsvn8qgr83y3cnhh7wkwv0s29ycs9r4p6lr5eeee0emquun8v7qlt7lt8w7ck3ukl5ctnufhzwmj00utn +5_000_000__000_000,upenumbra,penumbra1s03zdrdjy4uc68rwtp2mz94lgg0k8fuyma4pphk6v2a66dap2d8xfd0l8rmtnh8l2pxdxyyy6gn9rqyzuga36sjnd30w6t0prq82wxve0tlx3veme9qpjlq82uvh6eytujzefr +50_000,gm,penumbra1s03zdrdjy4uc68rwtp2mz94lgg0k8fuyma4pphk6v2a66dap2d8xfd0l8rmtnh8l2pxdxyyy6gn9rqyzuga36sjnd30w6t0prq82wxve0tlx3veme9qpjlq82uvh6eytujzefr +50_000,gn,penumbra1s03zdrdjy4uc68rwtp2mz94lgg0k8fuyma4pphk6v2a66dap2d8xfd0l8rmtnh8l2pxdxyyy6gn9rqyzuga36sjnd30w6t0prq82wxve0tlx3veme9qpjlq82uvh6eytujzefr +25_000,pizza,penumbra1s03zdrdjy4uc68rwtp2mz94lgg0k8fuyma4pphk6v2a66dap2d8xfd0l8rmtnh8l2pxdxyyy6gn9rqyzuga36sjnd30w6t0prq82wxve0tlx3veme9qpjlq82uvh6eytujzefr +250,cube,penumbra1s03zdrdjy4uc68rwtp2mz94lgg0k8fuyma4pphk6v2a66dap2d8xfd0l8rmtnh8l2pxdxyyy6gn9rqyzuga36sjnd30w6t0prq82wxve0tlx3veme9qpjlq82uvh6eytujzefr +1_000_000,test_usd,penumbra1s03zdrdjy4uc68rwtp2mz94lgg0k8fuyma4pphk6v2a66dap2d8xfd0l8rmtnh8l2pxdxyyy6gn9rqyzuga36sjnd30w6t0prq82wxve0tlx3veme9qpjlq82uvh6eytujzefr +10_000,nala,penumbra1s03zdrdjy4uc68rwtp2mz94lgg0k8fuyma4pphk6v2a66dap2d8xfd0l8rmtnh8l2pxdxyyy6gn9rqyzuga36sjnd30w6t0prq82wxve0tlx3veme9qpjlq82uvh6eytujzefr +5_000_000__000_000,upenumbra,penumbra1ydlrv3mu25v5sz4fy0729lktq2xfwdhe4sfpe8886zmh82qn8j49ysnjc7cp3j4jzyp55m0a8dtr38uetzx97wjvcce5a9w42n5r7k5xzsypp59k0wkay5mq030lgdhz9pnf5w +50_000,gm,penumbra1ydlrv3mu25v5sz4fy0729lktq2xfwdhe4sfpe8886zmh82qn8j49ysnjc7cp3j4jzyp55m0a8dtr38uetzx97wjvcce5a9w42n5r7k5xzsypp59k0wkay5mq030lgdhz9pnf5w +50_000,gn,penumbra1ydlrv3mu25v5sz4fy0729lktq2xfwdhe4sfpe8886zmh82qn8j49ysnjc7cp3j4jzyp55m0a8dtr38uetzx97wjvcce5a9w42n5r7k5xzsypp59k0wkay5mq030lgdhz9pnf5w +25_000,pizza,penumbra1ydlrv3mu25v5sz4fy0729lktq2xfwdhe4sfpe8886zmh82qn8j49ysnjc7cp3j4jzyp55m0a8dtr38uetzx97wjvcce5a9w42n5r7k5xzsypp59k0wkay5mq030lgdhz9pnf5w +250,cube,penumbra1ydlrv3mu25v5sz4fy0729lktq2xfwdhe4sfpe8886zmh82qn8j49ysnjc7cp3j4jzyp55m0a8dtr38uetzx97wjvcce5a9w42n5r7k5xzsypp59k0wkay5mq030lgdhz9pnf5w +1_000_000,test_usd,penumbra1ydlrv3mu25v5sz4fy0729lktq2xfwdhe4sfpe8886zmh82qn8j49ysnjc7cp3j4jzyp55m0a8dtr38uetzx97wjvcce5a9w42n5r7k5xzsypp59k0wkay5mq030lgdhz9pnf5w +10_000,nala,penumbra1ydlrv3mu25v5sz4fy0729lktq2xfwdhe4sfpe8886zmh82qn8j49ysnjc7cp3j4jzyp55m0a8dtr38uetzx97wjvcce5a9w42n5r7k5xzsypp59k0wkay5mq030lgdhz9pnf5w +5_000_000__000_000,upenumbra,penumbra1csu9gn9x9pt237s3jmc9sen6d0th582623e737s9hymqp55hwnfp3j3mhjcksktzqpx0qls6n4anc9nl82w7y5zpeztg4dxma6lmgw6dwj76v7drqn8tznl86jnrpvm3zfg3y4 +50_000,gm,penumbra1csu9gn9x9pt237s3jmc9sen6d0th582623e737s9hymqp55hwnfp3j3mhjcksktzqpx0qls6n4anc9nl82w7y5zpeztg4dxma6lmgw6dwj76v7drqn8tznl86jnrpvm3zfg3y4 +50_000,gn,penumbra1csu9gn9x9pt237s3jmc9sen6d0th582623e737s9hymqp55hwnfp3j3mhjcksktzqpx0qls6n4anc9nl82w7y5zpeztg4dxma6lmgw6dwj76v7drqn8tznl86jnrpvm3zfg3y4 +25_000,pizza,penumbra1csu9gn9x9pt237s3jmc9sen6d0th582623e737s9hymqp55hwnfp3j3mhjcksktzqpx0qls6n4anc9nl82w7y5zpeztg4dxma6lmgw6dwj76v7drqn8tznl86jnrpvm3zfg3y4 +250,cube,penumbra1csu9gn9x9pt237s3jmc9sen6d0th582623e737s9hymqp55hwnfp3j3mhjcksktzqpx0qls6n4anc9nl82w7y5zpeztg4dxma6lmgw6dwj76v7drqn8tznl86jnrpvm3zfg3y4 +1_000_000,test_usd,penumbra1csu9gn9x9pt237s3jmc9sen6d0th582623e737s9hymqp55hwnfp3j3mhjcksktzqpx0qls6n4anc9nl82w7y5zpeztg4dxma6lmgw6dwj76v7drqn8tznl86jnrpvm3zfg3y4 +10_000,nala,penumbra1csu9gn9x9pt237s3jmc9sen6d0th582623e737s9hymqp55hwnfp3j3mhjcksktzqpx0qls6n4anc9nl82w7y5zpeztg4dxma6lmgw6dwj76v7drqn8tznl86jnrpvm3zfg3y4 +5_000_000__000_000,upenumbra,penumbra1ufmv2ztuts8uuwa0lhn5v7fyp7tkrhseddkx54m538qknjrdyexj9kc5lez8s925vrqlkn724elqfq657gdpfr3z2qn3krhxx3zfpgnq43mct9zwzjjqscueml8w349php0aup +50_000,gm,penumbra1ufmv2ztuts8uuwa0lhn5v7fyp7tkrhseddkx54m538qknjrdyexj9kc5lez8s925vrqlkn724elqfq657gdpfr3z2qn3krhxx3zfpgnq43mct9zwzjjqscueml8w349php0aup +50_000,gn,penumbra1ufmv2ztuts8uuwa0lhn5v7fyp7tkrhseddkx54m538qknjrdyexj9kc5lez8s925vrqlkn724elqfq657gdpfr3z2qn3krhxx3zfpgnq43mct9zwzjjqscueml8w349php0aup +25_000,pizza,penumbra1ufmv2ztuts8uuwa0lhn5v7fyp7tkrhseddkx54m538qknjrdyexj9kc5lez8s925vrqlkn724elqfq657gdpfr3z2qn3krhxx3zfpgnq43mct9zwzjjqscueml8w349php0aup +250,cube,penumbra1ufmv2ztuts8uuwa0lhn5v7fyp7tkrhseddkx54m538qknjrdyexj9kc5lez8s925vrqlkn724elqfq657gdpfr3z2qn3krhxx3zfpgnq43mct9zwzjjqscueml8w349php0aup +1_000_000,test_usd,penumbra1ufmv2ztuts8uuwa0lhn5v7fyp7tkrhseddkx54m538qknjrdyexj9kc5lez8s925vrqlkn724elqfq657gdpfr3z2qn3krhxx3zfpgnq43mct9zwzjjqscueml8w349php0aup +10_000,nala,penumbra1ufmv2ztuts8uuwa0lhn5v7fyp7tkrhseddkx54m538qknjrdyexj9kc5lez8s925vrqlkn724elqfq657gdpfr3z2qn3krhxx3zfpgnq43mct9zwzjjqscueml8w349php0aup +5_000_000__000_000,upenumbra,penumbra1qu6svkqwyw5wu3huzuxcygurtvr7fek96akrwaypqq3sqggghaq6xdykx4gh8tvtgegqfyllrpmx4vhfpgq2sxmrfpv9zww5ugjxpfac7304hwhc3v7x0kw2wn9ng68nsejhz8 +50_000,gm,penumbra1qu6svkqwyw5wu3huzuxcygurtvr7fek96akrwaypqq3sqggghaq6xdykx4gh8tvtgegqfyllrpmx4vhfpgq2sxmrfpv9zww5ugjxpfac7304hwhc3v7x0kw2wn9ng68nsejhz8 +50_000,gn,penumbra1qu6svkqwyw5wu3huzuxcygurtvr7fek96akrwaypqq3sqggghaq6xdykx4gh8tvtgegqfyllrpmx4vhfpgq2sxmrfpv9zww5ugjxpfac7304hwhc3v7x0kw2wn9ng68nsejhz8 +25_000,pizza,penumbra1qu6svkqwyw5wu3huzuxcygurtvr7fek96akrwaypqq3sqggghaq6xdykx4gh8tvtgegqfyllrpmx4vhfpgq2sxmrfpv9zww5ugjxpfac7304hwhc3v7x0kw2wn9ng68nsejhz8 +250,cube,penumbra1qu6svkqwyw5wu3huzuxcygurtvr7fek96akrwaypqq3sqggghaq6xdykx4gh8tvtgegqfyllrpmx4vhfpgq2sxmrfpv9zww5ugjxpfac7304hwhc3v7x0kw2wn9ng68nsejhz8 +1_000_000,test_usd,penumbra1qu6svkqwyw5wu3huzuxcygurtvr7fek96akrwaypqq3sqggghaq6xdykx4gh8tvtgegqfyllrpmx4vhfpgq2sxmrfpv9zww5ugjxpfac7304hwhc3v7x0kw2wn9ng68nsejhz8 +10_000,nala,penumbra1qu6svkqwyw5wu3huzuxcygurtvr7fek96akrwaypqq3sqggghaq6xdykx4gh8tvtgegqfyllrpmx4vhfpgq2sxmrfpv9zww5ugjxpfac7304hwhc3v7x0kw2wn9ng68nsejhz8 +5_000_000__000_000,upenumbra,penumbra1ayr3xctcv7l8hqj3fq6fg9m5xnvpx5257dnc8axqeeaw7da8llenv53f4au2vyr8kzu7hh6ehlup5kxcnfqr7sgxzmtmu02qt9sxw2k97txa4x6crprlllvd0ly5ku5nd88cgg +50_000,gm,penumbra1ayr3xctcv7l8hqj3fq6fg9m5xnvpx5257dnc8axqeeaw7da8llenv53f4au2vyr8kzu7hh6ehlup5kxcnfqr7sgxzmtmu02qt9sxw2k97txa4x6crprlllvd0ly5ku5nd88cgg +50_000,gn,penumbra1ayr3xctcv7l8hqj3fq6fg9m5xnvpx5257dnc8axqeeaw7da8llenv53f4au2vyr8kzu7hh6ehlup5kxcnfqr7sgxzmtmu02qt9sxw2k97txa4x6crprlllvd0ly5ku5nd88cgg +25_000,pizza,penumbra1ayr3xctcv7l8hqj3fq6fg9m5xnvpx5257dnc8axqeeaw7da8llenv53f4au2vyr8kzu7hh6ehlup5kxcnfqr7sgxzmtmu02qt9sxw2k97txa4x6crprlllvd0ly5ku5nd88cgg +250,cube,penumbra1ayr3xctcv7l8hqj3fq6fg9m5xnvpx5257dnc8axqeeaw7da8llenv53f4au2vyr8kzu7hh6ehlup5kxcnfqr7sgxzmtmu02qt9sxw2k97txa4x6crprlllvd0ly5ku5nd88cgg +1_000_000,test_usd,penumbra1ayr3xctcv7l8hqj3fq6fg9m5xnvpx5257dnc8axqeeaw7da8llenv53f4au2vyr8kzu7hh6ehlup5kxcnfqr7sgxzmtmu02qt9sxw2k97txa4x6crprlllvd0ly5ku5nd88cgg +10_000,nala,penumbra1ayr3xctcv7l8hqj3fq6fg9m5xnvpx5257dnc8axqeeaw7da8llenv53f4au2vyr8kzu7hh6ehlup5kxcnfqr7sgxzmtmu02qt9sxw2k97txa4x6crprlllvd0ly5ku5nd88cgg +5_000_000__000_000,upenumbra,penumbra1ptthvmv380xzsph57ly92ctr88x285rce9adggsxgmwtve7n2q80lgea7q33gpxyfzevu36jk45sxh9muyj4kx7dhsasnzx8kass5p77j2vg5yp4gzpez3e6w0tqmpmwmr4s0w +50_000,gm,penumbra1ptthvmv380xzsph57ly92ctr88x285rce9adggsxgmwtve7n2q80lgea7q33gpxyfzevu36jk45sxh9muyj4kx7dhsasnzx8kass5p77j2vg5yp4gzpez3e6w0tqmpmwmr4s0w +50_000,gn,penumbra1ptthvmv380xzsph57ly92ctr88x285rce9adggsxgmwtve7n2q80lgea7q33gpxyfzevu36jk45sxh9muyj4kx7dhsasnzx8kass5p77j2vg5yp4gzpez3e6w0tqmpmwmr4s0w +25_000,pizza,penumbra1ptthvmv380xzsph57ly92ctr88x285rce9adggsxgmwtve7n2q80lgea7q33gpxyfzevu36jk45sxh9muyj4kx7dhsasnzx8kass5p77j2vg5yp4gzpez3e6w0tqmpmwmr4s0w +250,cube,penumbra1ptthvmv380xzsph57ly92ctr88x285rce9adggsxgmwtve7n2q80lgea7q33gpxyfzevu36jk45sxh9muyj4kx7dhsasnzx8kass5p77j2vg5yp4gzpez3e6w0tqmpmwmr4s0w +1_000_000,test_usd,penumbra1ptthvmv380xzsph57ly92ctr88x285rce9adggsxgmwtve7n2q80lgea7q33gpxyfzevu36jk45sxh9muyj4kx7dhsasnzx8kass5p77j2vg5yp4gzpez3e6w0tqmpmwmr4s0w +10_000,nala,penumbra1ptthvmv380xzsph57ly92ctr88x285rce9adggsxgmwtve7n2q80lgea7q33gpxyfzevu36jk45sxh9muyj4kx7dhsasnzx8kass5p77j2vg5yp4gzpez3e6w0tqmpmwmr4s0w +5_000_000__000_000,upenumbra,penumbra1jf62rvcyl7pz4373a52r7wyey4tanjwvstgnh8t6a9vatut6pg5xz89mvegjxr6jjxyzdvtfxlenalwcx2pc0pzv93czarx86wvtgs6k7xrjy3ra07wwkgjqzckxsx00g8kawf +50_000,gm,penumbra1jf62rvcyl7pz4373a52r7wyey4tanjwvstgnh8t6a9vatut6pg5xz89mvegjxr6jjxyzdvtfxlenalwcx2pc0pzv93czarx86wvtgs6k7xrjy3ra07wwkgjqzckxsx00g8kawf +50_000,gn,penumbra1jf62rvcyl7pz4373a52r7wyey4tanjwvstgnh8t6a9vatut6pg5xz89mvegjxr6jjxyzdvtfxlenalwcx2pc0pzv93czarx86wvtgs6k7xrjy3ra07wwkgjqzckxsx00g8kawf +25_000,pizza,penumbra1jf62rvcyl7pz4373a52r7wyey4tanjwvstgnh8t6a9vatut6pg5xz89mvegjxr6jjxyzdvtfxlenalwcx2pc0pzv93czarx86wvtgs6k7xrjy3ra07wwkgjqzckxsx00g8kawf +250,cube,penumbra1jf62rvcyl7pz4373a52r7wyey4tanjwvstgnh8t6a9vatut6pg5xz89mvegjxr6jjxyzdvtfxlenalwcx2pc0pzv93czarx86wvtgs6k7xrjy3ra07wwkgjqzckxsx00g8kawf +1_000_000,test_usd,penumbra1jf62rvcyl7pz4373a52r7wyey4tanjwvstgnh8t6a9vatut6pg5xz89mvegjxr6jjxyzdvtfxlenalwcx2pc0pzv93czarx86wvtgs6k7xrjy3ra07wwkgjqzckxsx00g8kawf +10_000,nala,penumbra1jf62rvcyl7pz4373a52r7wyey4tanjwvstgnh8t6a9vatut6pg5xz89mvegjxr6jjxyzdvtfxlenalwcx2pc0pzv93czarx86wvtgs6k7xrjy3ra07wwkgjqzckxsx00g8kawf +5_000_000__000_000,upenumbra,penumbra1grp3dk8vze54vq529lw8p5ankpk795hu5pg4zzjqaefggskqsehjaqsugh9uqavzytpmz8maxf4t3w49jl3ltaqakjejr85hw8qxnv8wlve0zhyhxk904q4yagjxgn9368ak8c +50_000,gm,penumbra1grp3dk8vze54vq529lw8p5ankpk795hu5pg4zzjqaefggskqsehjaqsugh9uqavzytpmz8maxf4t3w49jl3ltaqakjejr85hw8qxnv8wlve0zhyhxk904q4yagjxgn9368ak8c +50_000,gn,penumbra1grp3dk8vze54vq529lw8p5ankpk795hu5pg4zzjqaefggskqsehjaqsugh9uqavzytpmz8maxf4t3w49jl3ltaqakjejr85hw8qxnv8wlve0zhyhxk904q4yagjxgn9368ak8c +25_000,pizza,penumbra1grp3dk8vze54vq529lw8p5ankpk795hu5pg4zzjqaefggskqsehjaqsugh9uqavzytpmz8maxf4t3w49jl3ltaqakjejr85hw8qxnv8wlve0zhyhxk904q4yagjxgn9368ak8c +250,cube,penumbra1grp3dk8vze54vq529lw8p5ankpk795hu5pg4zzjqaefggskqsehjaqsugh9uqavzytpmz8maxf4t3w49jl3ltaqakjejr85hw8qxnv8wlve0zhyhxk904q4yagjxgn9368ak8c +1_000_000,test_usd,penumbra1grp3dk8vze54vq529lw8p5ankpk795hu5pg4zzjqaefggskqsehjaqsugh9uqavzytpmz8maxf4t3w49jl3ltaqakjejr85hw8qxnv8wlve0zhyhxk904q4yagjxgn9368ak8c +10_000,nala,penumbra1grp3dk8vze54vq529lw8p5ankpk795hu5pg4zzjqaefggskqsehjaqsugh9uqavzytpmz8maxf4t3w49jl3ltaqakjejr85hw8qxnv8wlve0zhyhxk904q4yagjxgn9368ak8c +5_000_000__000_000,upenumbra,penumbra18vddyvr33t8ukka0c94spdg63fh4yycwdtl9h3gpf4wfmnn5t2wp64xtmmlexlrjn90um2l6ne75evw8cvu27eufstsm5m7dfs740cw04grtmdsvqyc2vmqz3h4wu6ecg6ejrf +50_000,gm,penumbra18vddyvr33t8ukka0c94spdg63fh4yycwdtl9h3gpf4wfmnn5t2wp64xtmmlexlrjn90um2l6ne75evw8cvu27eufstsm5m7dfs740cw04grtmdsvqyc2vmqz3h4wu6ecg6ejrf +50_000,gn,penumbra18vddyvr33t8ukka0c94spdg63fh4yycwdtl9h3gpf4wfmnn5t2wp64xtmmlexlrjn90um2l6ne75evw8cvu27eufstsm5m7dfs740cw04grtmdsvqyc2vmqz3h4wu6ecg6ejrf +25_000,pizza,penumbra18vddyvr33t8ukka0c94spdg63fh4yycwdtl9h3gpf4wfmnn5t2wp64xtmmlexlrjn90um2l6ne75evw8cvu27eufstsm5m7dfs740cw04grtmdsvqyc2vmqz3h4wu6ecg6ejrf +250,cube,penumbra18vddyvr33t8ukka0c94spdg63fh4yycwdtl9h3gpf4wfmnn5t2wp64xtmmlexlrjn90um2l6ne75evw8cvu27eufstsm5m7dfs740cw04grtmdsvqyc2vmqz3h4wu6ecg6ejrf +1_000_000,test_usd,penumbra18vddyvr33t8ukka0c94spdg63fh4yycwdtl9h3gpf4wfmnn5t2wp64xtmmlexlrjn90um2l6ne75evw8cvu27eufstsm5m7dfs740cw04grtmdsvqyc2vmqz3h4wu6ecg6ejrf +10_000,nala,penumbra18vddyvr33t8ukka0c94spdg63fh4yycwdtl9h3gpf4wfmnn5t2wp64xtmmlexlrjn90um2l6ne75evw8cvu27eufstsm5m7dfs740cw04grtmdsvqyc2vmqz3h4wu6ecg6ejrf +5_000_000__000_000,upenumbra,penumbra1zx97wldrv7fku6p0mnuzr2kx4w2zurg869jvjh369vx5tf46krxh6nep0fc4mr82mmphq9w5jk69dav07ywym4ndndgszskfxkvzs6jke483fuqdr06n67kp86dj3er97tgs2p +50_000,gm,penumbra1zx97wldrv7fku6p0mnuzr2kx4w2zurg869jvjh369vx5tf46krxh6nep0fc4mr82mmphq9w5jk69dav07ywym4ndndgszskfxkvzs6jke483fuqdr06n67kp86dj3er97tgs2p +50_000,gn,penumbra1zx97wldrv7fku6p0mnuzr2kx4w2zurg869jvjh369vx5tf46krxh6nep0fc4mr82mmphq9w5jk69dav07ywym4ndndgszskfxkvzs6jke483fuqdr06n67kp86dj3er97tgs2p +25_000,pizza,penumbra1zx97wldrv7fku6p0mnuzr2kx4w2zurg869jvjh369vx5tf46krxh6nep0fc4mr82mmphq9w5jk69dav07ywym4ndndgszskfxkvzs6jke483fuqdr06n67kp86dj3er97tgs2p +250,cube,penumbra1zx97wldrv7fku6p0mnuzr2kx4w2zurg869jvjh369vx5tf46krxh6nep0fc4mr82mmphq9w5jk69dav07ywym4ndndgszskfxkvzs6jke483fuqdr06n67kp86dj3er97tgs2p +1_000_000,test_usd,penumbra1zx97wldrv7fku6p0mnuzr2kx4w2zurg869jvjh369vx5tf46krxh6nep0fc4mr82mmphq9w5jk69dav07ywym4ndndgszskfxkvzs6jke483fuqdr06n67kp86dj3er97tgs2p +10_000,nala,penumbra1zx97wldrv7fku6p0mnuzr2kx4w2zurg869jvjh369vx5tf46krxh6nep0fc4mr82mmphq9w5jk69dav07ywym4ndndgszskfxkvzs6jke483fuqdr06n67kp86dj3er97tgs2p +5_000_000__000_000,upenumbra,penumbra1s9lauumt0uceehtw03nvslann73vwtr2ytk2ej4vpdlrvxhmuze48hs08kguyyvj6td2epsr4y65wv7t3f5qwvmnx9tmpvltxck5jzycuvrumpv4dctq8339n85ep3la7kfvzs +50_000,gm,penumbra1s9lauumt0uceehtw03nvslann73vwtr2ytk2ej4vpdlrvxhmuze48hs08kguyyvj6td2epsr4y65wv7t3f5qwvmnx9tmpvltxck5jzycuvrumpv4dctq8339n85ep3la7kfvzs +50_000,gn,penumbra1s9lauumt0uceehtw03nvslann73vwtr2ytk2ej4vpdlrvxhmuze48hs08kguyyvj6td2epsr4y65wv7t3f5qwvmnx9tmpvltxck5jzycuvrumpv4dctq8339n85ep3la7kfvzs +25_000,pizza,penumbra1s9lauumt0uceehtw03nvslann73vwtr2ytk2ej4vpdlrvxhmuze48hs08kguyyvj6td2epsr4y65wv7t3f5qwvmnx9tmpvltxck5jzycuvrumpv4dctq8339n85ep3la7kfvzs +250,cube,penumbra1s9lauumt0uceehtw03nvslann73vwtr2ytk2ej4vpdlrvxhmuze48hs08kguyyvj6td2epsr4y65wv7t3f5qwvmnx9tmpvltxck5jzycuvrumpv4dctq8339n85ep3la7kfvzs +1_000_000,test_usd,penumbra1s9lauumt0uceehtw03nvslann73vwtr2ytk2ej4vpdlrvxhmuze48hs08kguyyvj6td2epsr4y65wv7t3f5qwvmnx9tmpvltxck5jzycuvrumpv4dctq8339n85ep3la7kfvzs +10_000,nala,penumbra1s9lauumt0uceehtw03nvslann73vwtr2ytk2ej4vpdlrvxhmuze48hs08kguyyvj6td2epsr4y65wv7t3f5qwvmnx9tmpvltxck5jzycuvrumpv4dctq8339n85ep3la7kfvzs +5_000_000__000_000,upenumbra,penumbra1khrsn8jqw8gxswqesq736zknfmtaeuccqrw4dlspn96hqnq80cxx32deke486tqf0644zxerkarwv8kwruh8yq45tegvavmc7uqj42cz77ecfhxcv0nn79vda60ccwsljxh34r +50_000,gm,penumbra1khrsn8jqw8gxswqesq736zknfmtaeuccqrw4dlspn96hqnq80cxx32deke486tqf0644zxerkarwv8kwruh8yq45tegvavmc7uqj42cz77ecfhxcv0nn79vda60ccwsljxh34r +50_000,gn,penumbra1khrsn8jqw8gxswqesq736zknfmtaeuccqrw4dlspn96hqnq80cxx32deke486tqf0644zxerkarwv8kwruh8yq45tegvavmc7uqj42cz77ecfhxcv0nn79vda60ccwsljxh34r +25_000,pizza,penumbra1khrsn8jqw8gxswqesq736zknfmtaeuccqrw4dlspn96hqnq80cxx32deke486tqf0644zxerkarwv8kwruh8yq45tegvavmc7uqj42cz77ecfhxcv0nn79vda60ccwsljxh34r +250,cube,penumbra1khrsn8jqw8gxswqesq736zknfmtaeuccqrw4dlspn96hqnq80cxx32deke486tqf0644zxerkarwv8kwruh8yq45tegvavmc7uqj42cz77ecfhxcv0nn79vda60ccwsljxh34r +1_000_000,test_usd,penumbra1khrsn8jqw8gxswqesq736zknfmtaeuccqrw4dlspn96hqnq80cxx32deke486tqf0644zxerkarwv8kwruh8yq45tegvavmc7uqj42cz77ecfhxcv0nn79vda60ccwsljxh34r +10_000,nala,penumbra1khrsn8jqw8gxswqesq736zknfmtaeuccqrw4dlspn96hqnq80cxx32deke486tqf0644zxerkarwv8kwruh8yq45tegvavmc7uqj42cz77ecfhxcv0nn79vda60ccwsljxh34r +5_000_000__000_000,upenumbra,penumbra1fuc2w752s2q4jzeayfhvvfusqndwplkz2hshuyr65cr9k33tnk8acc7crlfhkvqss9qan0j3q7cv6pagv44ljcu0jwk8g529n2yg539lnezjxajkmdf3fp2mq9rvjx9vv9es2a +50_000,gm,penumbra1fuc2w752s2q4jzeayfhvvfusqndwplkz2hshuyr65cr9k33tnk8acc7crlfhkvqss9qan0j3q7cv6pagv44ljcu0jwk8g529n2yg539lnezjxajkmdf3fp2mq9rvjx9vv9es2a +50_000,gn,penumbra1fuc2w752s2q4jzeayfhvvfusqndwplkz2hshuyr65cr9k33tnk8acc7crlfhkvqss9qan0j3q7cv6pagv44ljcu0jwk8g529n2yg539lnezjxajkmdf3fp2mq9rvjx9vv9es2a +25_000,pizza,penumbra1fuc2w752s2q4jzeayfhvvfusqndwplkz2hshuyr65cr9k33tnk8acc7crlfhkvqss9qan0j3q7cv6pagv44ljcu0jwk8g529n2yg539lnezjxajkmdf3fp2mq9rvjx9vv9es2a +250,cube,penumbra1fuc2w752s2q4jzeayfhvvfusqndwplkz2hshuyr65cr9k33tnk8acc7crlfhkvqss9qan0j3q7cv6pagv44ljcu0jwk8g529n2yg539lnezjxajkmdf3fp2mq9rvjx9vv9es2a +1_000_000,test_usd,penumbra1fuc2w752s2q4jzeayfhvvfusqndwplkz2hshuyr65cr9k33tnk8acc7crlfhkvqss9qan0j3q7cv6pagv44ljcu0jwk8g529n2yg539lnezjxajkmdf3fp2mq9rvjx9vv9es2a +10_000,nala,penumbra1fuc2w752s2q4jzeayfhvvfusqndwplkz2hshuyr65cr9k33tnk8acc7crlfhkvqss9qan0j3q7cv6pagv44ljcu0jwk8g529n2yg539lnezjxajkmdf3fp2mq9rvjx9vv9es2a +5_000_000__000_000,upenumbra,penumbra1n4y4k77hw5hl246mk8u4m7sw3muhgg6m4qmen3dvmz38vctw2htt4y4twwtmgpexcd7us6u7fa3xfmzst7yj3ur85mmmxas0xgj8d0aksqz9he3v4lhll0rmqgvxkgj827vuc0 +50_000,gm,penumbra1n4y4k77hw5hl246mk8u4m7sw3muhgg6m4qmen3dvmz38vctw2htt4y4twwtmgpexcd7us6u7fa3xfmzst7yj3ur85mmmxas0xgj8d0aksqz9he3v4lhll0rmqgvxkgj827vuc0 +50_000,gn,penumbra1n4y4k77hw5hl246mk8u4m7sw3muhgg6m4qmen3dvmz38vctw2htt4y4twwtmgpexcd7us6u7fa3xfmzst7yj3ur85mmmxas0xgj8d0aksqz9he3v4lhll0rmqgvxkgj827vuc0 +25_000,pizza,penumbra1n4y4k77hw5hl246mk8u4m7sw3muhgg6m4qmen3dvmz38vctw2htt4y4twwtmgpexcd7us6u7fa3xfmzst7yj3ur85mmmxas0xgj8d0aksqz9he3v4lhll0rmqgvxkgj827vuc0 +250,cube,penumbra1n4y4k77hw5hl246mk8u4m7sw3muhgg6m4qmen3dvmz38vctw2htt4y4twwtmgpexcd7us6u7fa3xfmzst7yj3ur85mmmxas0xgj8d0aksqz9he3v4lhll0rmqgvxkgj827vuc0 +1_000_000,test_usd,penumbra1n4y4k77hw5hl246mk8u4m7sw3muhgg6m4qmen3dvmz38vctw2htt4y4twwtmgpexcd7us6u7fa3xfmzst7yj3ur85mmmxas0xgj8d0aksqz9he3v4lhll0rmqgvxkgj827vuc0 +10_000,nala,penumbra1n4y4k77hw5hl246mk8u4m7sw3muhgg6m4qmen3dvmz38vctw2htt4y4twwtmgpexcd7us6u7fa3xfmzst7yj3ur85mmmxas0xgj8d0aksqz9he3v4lhll0rmqgvxkgj827vuc0 +5_000_000__000_000,upenumbra,penumbra1lr0ns0jwkdkzzthplehh4wga8qnwcys8gxn9wrgvxvg4ypxfd04s3y4kw0nz8apw99ny84yd4wcks0z6vt7djdrh3hnsxgewn3d354s757jxj6c47vufr023wlgy8zsphy2669 +50_000,gm,penumbra1lr0ns0jwkdkzzthplehh4wga8qnwcys8gxn9wrgvxvg4ypxfd04s3y4kw0nz8apw99ny84yd4wcks0z6vt7djdrh3hnsxgewn3d354s757jxj6c47vufr023wlgy8zsphy2669 +50_000,gn,penumbra1lr0ns0jwkdkzzthplehh4wga8qnwcys8gxn9wrgvxvg4ypxfd04s3y4kw0nz8apw99ny84yd4wcks0z6vt7djdrh3hnsxgewn3d354s757jxj6c47vufr023wlgy8zsphy2669 +25_000,pizza,penumbra1lr0ns0jwkdkzzthplehh4wga8qnwcys8gxn9wrgvxvg4ypxfd04s3y4kw0nz8apw99ny84yd4wcks0z6vt7djdrh3hnsxgewn3d354s757jxj6c47vufr023wlgy8zsphy2669 +250,cube,penumbra1lr0ns0jwkdkzzthplehh4wga8qnwcys8gxn9wrgvxvg4ypxfd04s3y4kw0nz8apw99ny84yd4wcks0z6vt7djdrh3hnsxgewn3d354s757jxj6c47vufr023wlgy8zsphy2669 +1_000_000,test_usd,penumbra1lr0ns0jwkdkzzthplehh4wga8qnwcys8gxn9wrgvxvg4ypxfd04s3y4kw0nz8apw99ny84yd4wcks0z6vt7djdrh3hnsxgewn3d354s757jxj6c47vufr023wlgy8zsphy2669 +10_000,nala,penumbra1lr0ns0jwkdkzzthplehh4wga8qnwcys8gxn9wrgvxvg4ypxfd04s3y4kw0nz8apw99ny84yd4wcks0z6vt7djdrh3hnsxgewn3d354s757jxj6c47vufr023wlgy8zsphy2669 +5_000_000__000_000,upenumbra,penumbra1uhe5hvhdf583s0ldyrurtatj78pa2tmzt0lcf9awgu4fezkrdaxsllmy39l59xqwxaqhx88ganfgkdnjqp8wmvf0s5uy4r9nmglyd497wsu7ny49jfth3dcjhhgs6d6mjc0fxq +50_000,gm,penumbra1uhe5hvhdf583s0ldyrurtatj78pa2tmzt0lcf9awgu4fezkrdaxsllmy39l59xqwxaqhx88ganfgkdnjqp8wmvf0s5uy4r9nmglyd497wsu7ny49jfth3dcjhhgs6d6mjc0fxq +50_000,gn,penumbra1uhe5hvhdf583s0ldyrurtatj78pa2tmzt0lcf9awgu4fezkrdaxsllmy39l59xqwxaqhx88ganfgkdnjqp8wmvf0s5uy4r9nmglyd497wsu7ny49jfth3dcjhhgs6d6mjc0fxq +25_000,pizza,penumbra1uhe5hvhdf583s0ldyrurtatj78pa2tmzt0lcf9awgu4fezkrdaxsllmy39l59xqwxaqhx88ganfgkdnjqp8wmvf0s5uy4r9nmglyd497wsu7ny49jfth3dcjhhgs6d6mjc0fxq +250,cube,penumbra1uhe5hvhdf583s0ldyrurtatj78pa2tmzt0lcf9awgu4fezkrdaxsllmy39l59xqwxaqhx88ganfgkdnjqp8wmvf0s5uy4r9nmglyd497wsu7ny49jfth3dcjhhgs6d6mjc0fxq +1_000_000,test_usd,penumbra1uhe5hvhdf583s0ldyrurtatj78pa2tmzt0lcf9awgu4fezkrdaxsllmy39l59xqwxaqhx88ganfgkdnjqp8wmvf0s5uy4r9nmglyd497wsu7ny49jfth3dcjhhgs6d6mjc0fxq +10_000,nala,penumbra1uhe5hvhdf583s0ldyrurtatj78pa2tmzt0lcf9awgu4fezkrdaxsllmy39l59xqwxaqhx88ganfgkdnjqp8wmvf0s5uy4r9nmglyd497wsu7ny49jfth3dcjhhgs6d6mjc0fxq +5_000_000__000_000,upenumbra,penumbra1fljn093ptt5vxyyd0pgxkqjdu7sqhutsz9q6r0h3fhedw25eta7plthmz80yyvprf4yue64htzts20l9398m6w0uqqe42cn5jefupqa4q5lcez27zwwv3z8aq87pl34r3dddkq +50_000,gm,penumbra1fljn093ptt5vxyyd0pgxkqjdu7sqhutsz9q6r0h3fhedw25eta7plthmz80yyvprf4yue64htzts20l9398m6w0uqqe42cn5jefupqa4q5lcez27zwwv3z8aq87pl34r3dddkq +50_000,gn,penumbra1fljn093ptt5vxyyd0pgxkqjdu7sqhutsz9q6r0h3fhedw25eta7plthmz80yyvprf4yue64htzts20l9398m6w0uqqe42cn5jefupqa4q5lcez27zwwv3z8aq87pl34r3dddkq +25_000,pizza,penumbra1fljn093ptt5vxyyd0pgxkqjdu7sqhutsz9q6r0h3fhedw25eta7plthmz80yyvprf4yue64htzts20l9398m6w0uqqe42cn5jefupqa4q5lcez27zwwv3z8aq87pl34r3dddkq +250,cube,penumbra1fljn093ptt5vxyyd0pgxkqjdu7sqhutsz9q6r0h3fhedw25eta7plthmz80yyvprf4yue64htzts20l9398m6w0uqqe42cn5jefupqa4q5lcez27zwwv3z8aq87pl34r3dddkq +1_000_000,test_usd,penumbra1fljn093ptt5vxyyd0pgxkqjdu7sqhutsz9q6r0h3fhedw25eta7plthmz80yyvprf4yue64htzts20l9398m6w0uqqe42cn5jefupqa4q5lcez27zwwv3z8aq87pl34r3dddkq +10_000,nala,penumbra1fljn093ptt5vxyyd0pgxkqjdu7sqhutsz9q6r0h3fhedw25eta7plthmz80yyvprf4yue64htzts20l9398m6w0uqqe42cn5jefupqa4q5lcez27zwwv3z8aq87pl34r3dddkq +5_000_000__000_000,upenumbra,penumbra13ftasxxac2c3288dsud8decvk98gql0lapgcelj4zd4nx6h9086zlt5pdlk7wnh799fr8e8wqyh082uf4x5jhk5wpl6p9smgwp8dkrvryha5cx2psq6s03utsu7ce3qyzl30at +50_000,gm,penumbra13ftasxxac2c3288dsud8decvk98gql0lapgcelj4zd4nx6h9086zlt5pdlk7wnh799fr8e8wqyh082uf4x5jhk5wpl6p9smgwp8dkrvryha5cx2psq6s03utsu7ce3qyzl30at +50_000,gn,penumbra13ftasxxac2c3288dsud8decvk98gql0lapgcelj4zd4nx6h9086zlt5pdlk7wnh799fr8e8wqyh082uf4x5jhk5wpl6p9smgwp8dkrvryha5cx2psq6s03utsu7ce3qyzl30at +25_000,pizza,penumbra13ftasxxac2c3288dsud8decvk98gql0lapgcelj4zd4nx6h9086zlt5pdlk7wnh799fr8e8wqyh082uf4x5jhk5wpl6p9smgwp8dkrvryha5cx2psq6s03utsu7ce3qyzl30at +250,cube,penumbra13ftasxxac2c3288dsud8decvk98gql0lapgcelj4zd4nx6h9086zlt5pdlk7wnh799fr8e8wqyh082uf4x5jhk5wpl6p9smgwp8dkrvryha5cx2psq6s03utsu7ce3qyzl30at +1_000_000,test_usd,penumbra13ftasxxac2c3288dsud8decvk98gql0lapgcelj4zd4nx6h9086zlt5pdlk7wnh799fr8e8wqyh082uf4x5jhk5wpl6p9smgwp8dkrvryha5cx2psq6s03utsu7ce3qyzl30at +10_000,nala,penumbra13ftasxxac2c3288dsud8decvk98gql0lapgcelj4zd4nx6h9086zlt5pdlk7wnh799fr8e8wqyh082uf4x5jhk5wpl6p9smgwp8dkrvryha5cx2psq6s03utsu7ce3qyzl30at +5_000_000__000_000,upenumbra,penumbra1mjnf0wpx7slv5ztzhk5fztg7xauack82w8ey6yqna5aqpygjap350qnrelpnlz5dv9zzczate02s4uu89tf87c6d85yatauhzg6rk08u25epzeu7efks704uqn4glx5dsqscer +50_000,gm,penumbra1mjnf0wpx7slv5ztzhk5fztg7xauack82w8ey6yqna5aqpygjap350qnrelpnlz5dv9zzczate02s4uu89tf87c6d85yatauhzg6rk08u25epzeu7efks704uqn4glx5dsqscer +50_000,gn,penumbra1mjnf0wpx7slv5ztzhk5fztg7xauack82w8ey6yqna5aqpygjap350qnrelpnlz5dv9zzczate02s4uu89tf87c6d85yatauhzg6rk08u25epzeu7efks704uqn4glx5dsqscer +25_000,pizza,penumbra1mjnf0wpx7slv5ztzhk5fztg7xauack82w8ey6yqna5aqpygjap350qnrelpnlz5dv9zzczate02s4uu89tf87c6d85yatauhzg6rk08u25epzeu7efks704uqn4glx5dsqscer +250,cube,penumbra1mjnf0wpx7slv5ztzhk5fztg7xauack82w8ey6yqna5aqpygjap350qnrelpnlz5dv9zzczate02s4uu89tf87c6d85yatauhzg6rk08u25epzeu7efks704uqn4glx5dsqscer +1_000_000,test_usd,penumbra1mjnf0wpx7slv5ztzhk5fztg7xauack82w8ey6yqna5aqpygjap350qnrelpnlz5dv9zzczate02s4uu89tf87c6d85yatauhzg6rk08u25epzeu7efks704uqn4glx5dsqscer +10_000,nala,penumbra1mjnf0wpx7slv5ztzhk5fztg7xauack82w8ey6yqna5aqpygjap350qnrelpnlz5dv9zzczate02s4uu89tf87c6d85yatauhzg6rk08u25epzeu7efks704uqn4glx5dsqscer +5_000_000__000_000,upenumbra,penumbra13fwnptqqpvq8r8v90phns04sewtdls8mtcce35sqffypdl8r8az0ayw926lnef508sk4wa9njxxfyp84tcexljgv0mq8vcz2fesrrth8wrkmwcj3q7k7jyk6lcet9pfwyvj5yp +50_000,gm,penumbra13fwnptqqpvq8r8v90phns04sewtdls8mtcce35sqffypdl8r8az0ayw926lnef508sk4wa9njxxfyp84tcexljgv0mq8vcz2fesrrth8wrkmwcj3q7k7jyk6lcet9pfwyvj5yp +50_000,gn,penumbra13fwnptqqpvq8r8v90phns04sewtdls8mtcce35sqffypdl8r8az0ayw926lnef508sk4wa9njxxfyp84tcexljgv0mq8vcz2fesrrth8wrkmwcj3q7k7jyk6lcet9pfwyvj5yp +25_000,pizza,penumbra13fwnptqqpvq8r8v90phns04sewtdls8mtcce35sqffypdl8r8az0ayw926lnef508sk4wa9njxxfyp84tcexljgv0mq8vcz2fesrrth8wrkmwcj3q7k7jyk6lcet9pfwyvj5yp +250,cube,penumbra13fwnptqqpvq8r8v90phns04sewtdls8mtcce35sqffypdl8r8az0ayw926lnef508sk4wa9njxxfyp84tcexljgv0mq8vcz2fesrrth8wrkmwcj3q7k7jyk6lcet9pfwyvj5yp +1_000_000,test_usd,penumbra13fwnptqqpvq8r8v90phns04sewtdls8mtcce35sqffypdl8r8az0ayw926lnef508sk4wa9njxxfyp84tcexljgv0mq8vcz2fesrrth8wrkmwcj3q7k7jyk6lcet9pfwyvj5yp +10_000,nala,penumbra13fwnptqqpvq8r8v90phns04sewtdls8mtcce35sqffypdl8r8az0ayw926lnef508sk4wa9njxxfyp84tcexljgv0mq8vcz2fesrrth8wrkmwcj3q7k7jyk6lcet9pfwyvj5yp +5_000_000__000_000,upenumbra,penumbra1zy3rrk6dk0r25kq6kfaecs55rlh8egdx2crs54anz70qtlx6jyyywv4g2ah8hh6pjftzr9w296zrjcagys4ztdhwfnjuvdj3js6ltmld48wwl4m0kgmr3asmdxw85ty79lddv0 +50_000,gm,penumbra1zy3rrk6dk0r25kq6kfaecs55rlh8egdx2crs54anz70qtlx6jyyywv4g2ah8hh6pjftzr9w296zrjcagys4ztdhwfnjuvdj3js6ltmld48wwl4m0kgmr3asmdxw85ty79lddv0 +50_000,gn,penumbra1zy3rrk6dk0r25kq6kfaecs55rlh8egdx2crs54anz70qtlx6jyyywv4g2ah8hh6pjftzr9w296zrjcagys4ztdhwfnjuvdj3js6ltmld48wwl4m0kgmr3asmdxw85ty79lddv0 +25_000,pizza,penumbra1zy3rrk6dk0r25kq6kfaecs55rlh8egdx2crs54anz70qtlx6jyyywv4g2ah8hh6pjftzr9w296zrjcagys4ztdhwfnjuvdj3js6ltmld48wwl4m0kgmr3asmdxw85ty79lddv0 +250,cube,penumbra1zy3rrk6dk0r25kq6kfaecs55rlh8egdx2crs54anz70qtlx6jyyywv4g2ah8hh6pjftzr9w296zrjcagys4ztdhwfnjuvdj3js6ltmld48wwl4m0kgmr3asmdxw85ty79lddv0 +1_000_000,test_usd,penumbra1zy3rrk6dk0r25kq6kfaecs55rlh8egdx2crs54anz70qtlx6jyyywv4g2ah8hh6pjftzr9w296zrjcagys4ztdhwfnjuvdj3js6ltmld48wwl4m0kgmr3asmdxw85ty79lddv0 +10_000,nala,penumbra1zy3rrk6dk0r25kq6kfaecs55rlh8egdx2crs54anz70qtlx6jyyywv4g2ah8hh6pjftzr9w296zrjcagys4ztdhwfnjuvdj3js6ltmld48wwl4m0kgmr3asmdxw85ty79lddv0 +5_000_000__000_000,upenumbra,penumbra1xuxvkfwszgu4s6s3c44kcpr40lawrddaknsqk705tfcea2fxvmk87kkurj7my4w92jraxrmfjlyvp0fqpyttpp5tqt96pw54nnndjglgmqjnjev9drtrmrx2x60ejr3sf08r82 +50_000,gm,penumbra1xuxvkfwszgu4s6s3c44kcpr40lawrddaknsqk705tfcea2fxvmk87kkurj7my4w92jraxrmfjlyvp0fqpyttpp5tqt96pw54nnndjglgmqjnjev9drtrmrx2x60ejr3sf08r82 +50_000,gn,penumbra1xuxvkfwszgu4s6s3c44kcpr40lawrddaknsqk705tfcea2fxvmk87kkurj7my4w92jraxrmfjlyvp0fqpyttpp5tqt96pw54nnndjglgmqjnjev9drtrmrx2x60ejr3sf08r82 +25_000,pizza,penumbra1xuxvkfwszgu4s6s3c44kcpr40lawrddaknsqk705tfcea2fxvmk87kkurj7my4w92jraxrmfjlyvp0fqpyttpp5tqt96pw54nnndjglgmqjnjev9drtrmrx2x60ejr3sf08r82 +250,cube,penumbra1xuxvkfwszgu4s6s3c44kcpr40lawrddaknsqk705tfcea2fxvmk87kkurj7my4w92jraxrmfjlyvp0fqpyttpp5tqt96pw54nnndjglgmqjnjev9drtrmrx2x60ejr3sf08r82 +1_000_000,test_usd,penumbra1xuxvkfwszgu4s6s3c44kcpr40lawrddaknsqk705tfcea2fxvmk87kkurj7my4w92jraxrmfjlyvp0fqpyttpp5tqt96pw54nnndjglgmqjnjev9drtrmrx2x60ejr3sf08r82 +10_000,nala,penumbra1xuxvkfwszgu4s6s3c44kcpr40lawrddaknsqk705tfcea2fxvmk87kkurj7my4w92jraxrmfjlyvp0fqpyttpp5tqt96pw54nnndjglgmqjnjev9drtrmrx2x60ejr3sf08r82 +5_000_000__000_000,upenumbra,penumbra10r8mu4dzf8v3a4k0q30h300e7y9pns0u76xhagqfwqr2wt6pqdgwjf4q3uq6wwn8mhas0w2a9qm3quqjk09yljetuwaf29x2r8jq69l93euhjhhfwkdrnk7x7zn7cfa2xjuhk5 +50_000,gm,penumbra10r8mu4dzf8v3a4k0q30h300e7y9pns0u76xhagqfwqr2wt6pqdgwjf4q3uq6wwn8mhas0w2a9qm3quqjk09yljetuwaf29x2r8jq69l93euhjhhfwkdrnk7x7zn7cfa2xjuhk5 +50_000,gn,penumbra10r8mu4dzf8v3a4k0q30h300e7y9pns0u76xhagqfwqr2wt6pqdgwjf4q3uq6wwn8mhas0w2a9qm3quqjk09yljetuwaf29x2r8jq69l93euhjhhfwkdrnk7x7zn7cfa2xjuhk5 +25_000,pizza,penumbra10r8mu4dzf8v3a4k0q30h300e7y9pns0u76xhagqfwqr2wt6pqdgwjf4q3uq6wwn8mhas0w2a9qm3quqjk09yljetuwaf29x2r8jq69l93euhjhhfwkdrnk7x7zn7cfa2xjuhk5 +250,cube,penumbra10r8mu4dzf8v3a4k0q30h300e7y9pns0u76xhagqfwqr2wt6pqdgwjf4q3uq6wwn8mhas0w2a9qm3quqjk09yljetuwaf29x2r8jq69l93euhjhhfwkdrnk7x7zn7cfa2xjuhk5 +1_000_000,test_usd,penumbra10r8mu4dzf8v3a4k0q30h300e7y9pns0u76xhagqfwqr2wt6pqdgwjf4q3uq6wwn8mhas0w2a9qm3quqjk09yljetuwaf29x2r8jq69l93euhjhhfwkdrnk7x7zn7cfa2xjuhk5 +10_000,nala,penumbra10r8mu4dzf8v3a4k0q30h300e7y9pns0u76xhagqfwqr2wt6pqdgwjf4q3uq6wwn8mhas0w2a9qm3quqjk09yljetuwaf29x2r8jq69l93euhjhhfwkdrnk7x7zn7cfa2xjuhk5 +5_000_000__000_000,upenumbra,penumbra1yw9pvm5ujry02yv7f67czu2pgqf36akpmvq90tk6f3h7pwn6y5vqnsg90ejn7zvu7rvmxd6stz4cqdazk0fvyurkvrkzau2wn275xaxfszsrd0mxqpegprdpu8wtjrk3snc2vx +50_000,gm,penumbra1yw9pvm5ujry02yv7f67czu2pgqf36akpmvq90tk6f3h7pwn6y5vqnsg90ejn7zvu7rvmxd6stz4cqdazk0fvyurkvrkzau2wn275xaxfszsrd0mxqpegprdpu8wtjrk3snc2vx +50_000,gn,penumbra1yw9pvm5ujry02yv7f67czu2pgqf36akpmvq90tk6f3h7pwn6y5vqnsg90ejn7zvu7rvmxd6stz4cqdazk0fvyurkvrkzau2wn275xaxfszsrd0mxqpegprdpu8wtjrk3snc2vx +25_000,pizza,penumbra1yw9pvm5ujry02yv7f67czu2pgqf36akpmvq90tk6f3h7pwn6y5vqnsg90ejn7zvu7rvmxd6stz4cqdazk0fvyurkvrkzau2wn275xaxfszsrd0mxqpegprdpu8wtjrk3snc2vx +250,cube,penumbra1yw9pvm5ujry02yv7f67czu2pgqf36akpmvq90tk6f3h7pwn6y5vqnsg90ejn7zvu7rvmxd6stz4cqdazk0fvyurkvrkzau2wn275xaxfszsrd0mxqpegprdpu8wtjrk3snc2vx +1_000_000,test_usd,penumbra1yw9pvm5ujry02yv7f67czu2pgqf36akpmvq90tk6f3h7pwn6y5vqnsg90ejn7zvu7rvmxd6stz4cqdazk0fvyurkvrkzau2wn275xaxfszsrd0mxqpegprdpu8wtjrk3snc2vx +10_000,nala,penumbra1yw9pvm5ujry02yv7f67czu2pgqf36akpmvq90tk6f3h7pwn6y5vqnsg90ejn7zvu7rvmxd6stz4cqdazk0fvyurkvrkzau2wn275xaxfszsrd0mxqpegprdpu8wtjrk3snc2vx +5_000_000__000_000,upenumbra,penumbra19ps33tjkfgntse69wewdgk2axx0tj5h23mvsw436h7pnnr3jnfxfksh0jw8hy0mssp4hpwkkh6pje5jfm4kkj2j59s3tdaweka9sywktqfkxkha6nzj36vatvfjzpglvxyh4xz +50_000,gm,penumbra19ps33tjkfgntse69wewdgk2axx0tj5h23mvsw436h7pnnr3jnfxfksh0jw8hy0mssp4hpwkkh6pje5jfm4kkj2j59s3tdaweka9sywktqfkxkha6nzj36vatvfjzpglvxyh4xz +50_000,gn,penumbra19ps33tjkfgntse69wewdgk2axx0tj5h23mvsw436h7pnnr3jnfxfksh0jw8hy0mssp4hpwkkh6pje5jfm4kkj2j59s3tdaweka9sywktqfkxkha6nzj36vatvfjzpglvxyh4xz +25_000,pizza,penumbra19ps33tjkfgntse69wewdgk2axx0tj5h23mvsw436h7pnnr3jnfxfksh0jw8hy0mssp4hpwkkh6pje5jfm4kkj2j59s3tdaweka9sywktqfkxkha6nzj36vatvfjzpglvxyh4xz +250,cube,penumbra19ps33tjkfgntse69wewdgk2axx0tj5h23mvsw436h7pnnr3jnfxfksh0jw8hy0mssp4hpwkkh6pje5jfm4kkj2j59s3tdaweka9sywktqfkxkha6nzj36vatvfjzpglvxyh4xz +1_000_000,test_usd,penumbra19ps33tjkfgntse69wewdgk2axx0tj5h23mvsw436h7pnnr3jnfxfksh0jw8hy0mssp4hpwkkh6pje5jfm4kkj2j59s3tdaweka9sywktqfkxkha6nzj36vatvfjzpglvxyh4xz +10_000,nala,penumbra19ps33tjkfgntse69wewdgk2axx0tj5h23mvsw436h7pnnr3jnfxfksh0jw8hy0mssp4hpwkkh6pje5jfm4kkj2j59s3tdaweka9sywktqfkxkha6nzj36vatvfjzpglvxyh4xz +5_000_000__000_000,upenumbra,penumbra1d3au0cyjjzhmlr9umplm8s5v8hmw9242r8ve2j9rsd7m72npw6snw8s4r0j4cur8n9c7l6mwf9884arxd5cmw9c8htmym46nap3v8vpmnf0kcyrj9q44wcgvcjyjaegvptwvk5 +50_000,gm,penumbra1d3au0cyjjzhmlr9umplm8s5v8hmw9242r8ve2j9rsd7m72npw6snw8s4r0j4cur8n9c7l6mwf9884arxd5cmw9c8htmym46nap3v8vpmnf0kcyrj9q44wcgvcjyjaegvptwvk5 +50_000,gn,penumbra1d3au0cyjjzhmlr9umplm8s5v8hmw9242r8ve2j9rsd7m72npw6snw8s4r0j4cur8n9c7l6mwf9884arxd5cmw9c8htmym46nap3v8vpmnf0kcyrj9q44wcgvcjyjaegvptwvk5 +25_000,pizza,penumbra1d3au0cyjjzhmlr9umplm8s5v8hmw9242r8ve2j9rsd7m72npw6snw8s4r0j4cur8n9c7l6mwf9884arxd5cmw9c8htmym46nap3v8vpmnf0kcyrj9q44wcgvcjyjaegvptwvk5 +250,cube,penumbra1d3au0cyjjzhmlr9umplm8s5v8hmw9242r8ve2j9rsd7m72npw6snw8s4r0j4cur8n9c7l6mwf9884arxd5cmw9c8htmym46nap3v8vpmnf0kcyrj9q44wcgvcjyjaegvptwvk5 +1_000_000,test_usd,penumbra1d3au0cyjjzhmlr9umplm8s5v8hmw9242r8ve2j9rsd7m72npw6snw8s4r0j4cur8n9c7l6mwf9884arxd5cmw9c8htmym46nap3v8vpmnf0kcyrj9q44wcgvcjyjaegvptwvk5 +10_000,nala,penumbra1d3au0cyjjzhmlr9umplm8s5v8hmw9242r8ve2j9rsd7m72npw6snw8s4r0j4cur8n9c7l6mwf9884arxd5cmw9c8htmym46nap3v8vpmnf0kcyrj9q44wcgvcjyjaegvptwvk5 +5_000_000__000_000,upenumbra,penumbra1r3jn4v5jgl4ed3a9wg065zvajzu7kgcpdmtejjj9a0shtu4wy507vfcpdyx5t8pevs2k99a86kd4r4rghu5f7kd0h8n8p389cp973w82n5ylamhr95d4qz9wftrn3cwu2pfgzu +50_000,gm,penumbra1r3jn4v5jgl4ed3a9wg065zvajzu7kgcpdmtejjj9a0shtu4wy507vfcpdyx5t8pevs2k99a86kd4r4rghu5f7kd0h8n8p389cp973w82n5ylamhr95d4qz9wftrn3cwu2pfgzu +50_000,gn,penumbra1r3jn4v5jgl4ed3a9wg065zvajzu7kgcpdmtejjj9a0shtu4wy507vfcpdyx5t8pevs2k99a86kd4r4rghu5f7kd0h8n8p389cp973w82n5ylamhr95d4qz9wftrn3cwu2pfgzu +25_000,pizza,penumbra1r3jn4v5jgl4ed3a9wg065zvajzu7kgcpdmtejjj9a0shtu4wy507vfcpdyx5t8pevs2k99a86kd4r4rghu5f7kd0h8n8p389cp973w82n5ylamhr95d4qz9wftrn3cwu2pfgzu +250,cube,penumbra1r3jn4v5jgl4ed3a9wg065zvajzu7kgcpdmtejjj9a0shtu4wy507vfcpdyx5t8pevs2k99a86kd4r4rghu5f7kd0h8n8p389cp973w82n5ylamhr95d4qz9wftrn3cwu2pfgzu +1_000_000,test_usd,penumbra1r3jn4v5jgl4ed3a9wg065zvajzu7kgcpdmtejjj9a0shtu4wy507vfcpdyx5t8pevs2k99a86kd4r4rghu5f7kd0h8n8p389cp973w82n5ylamhr95d4qz9wftrn3cwu2pfgzu +10_000,nala,penumbra1r3jn4v5jgl4ed3a9wg065zvajzu7kgcpdmtejjj9a0shtu4wy507vfcpdyx5t8pevs2k99a86kd4r4rghu5f7kd0h8n8p389cp973w82n5ylamhr95d4qz9wftrn3cwu2pfgzu +5_000_000__000_000,upenumbra,penumbra1zearguc6jdx29yevaxacyfvhwmzvah72lwfw8ejtjezcs7u7vxpz7etwujqq0zmh0aqlkcfx2nednv57vpzj5gc7dg6wcjshdr05rdfza4uzp6tp0lyj2xafd6msp3p62u3h0w +50_000,gm,penumbra1zearguc6jdx29yevaxacyfvhwmzvah72lwfw8ejtjezcs7u7vxpz7etwujqq0zmh0aqlkcfx2nednv57vpzj5gc7dg6wcjshdr05rdfza4uzp6tp0lyj2xafd6msp3p62u3h0w +50_000,gn,penumbra1zearguc6jdx29yevaxacyfvhwmzvah72lwfw8ejtjezcs7u7vxpz7etwujqq0zmh0aqlkcfx2nednv57vpzj5gc7dg6wcjshdr05rdfza4uzp6tp0lyj2xafd6msp3p62u3h0w +25_000,pizza,penumbra1zearguc6jdx29yevaxacyfvhwmzvah72lwfw8ejtjezcs7u7vxpz7etwujqq0zmh0aqlkcfx2nednv57vpzj5gc7dg6wcjshdr05rdfza4uzp6tp0lyj2xafd6msp3p62u3h0w +250,cube,penumbra1zearguc6jdx29yevaxacyfvhwmzvah72lwfw8ejtjezcs7u7vxpz7etwujqq0zmh0aqlkcfx2nednv57vpzj5gc7dg6wcjshdr05rdfza4uzp6tp0lyj2xafd6msp3p62u3h0w +1_000_000,test_usd,penumbra1zearguc6jdx29yevaxacyfvhwmzvah72lwfw8ejtjezcs7u7vxpz7etwujqq0zmh0aqlkcfx2nednv57vpzj5gc7dg6wcjshdr05rdfza4uzp6tp0lyj2xafd6msp3p62u3h0w +10_000,nala,penumbra1zearguc6jdx29yevaxacyfvhwmzvah72lwfw8ejtjezcs7u7vxpz7etwujqq0zmh0aqlkcfx2nednv57vpzj5gc7dg6wcjshdr05rdfza4uzp6tp0lyj2xafd6msp3p62u3h0w +5_000_000__000_000,upenumbra,penumbra1vw6j4uankvltjwz08khc7tx0u7fsgjc4x58skfvxfda079rqys73y88kwank6mncr5xewz4ahy7863s0flnshvqyaapxtcjv0wrmtpgdue9f8v9hp3m9k85rhhd59mzta53xvm +50_000,gm,penumbra1vw6j4uankvltjwz08khc7tx0u7fsgjc4x58skfvxfda079rqys73y88kwank6mncr5xewz4ahy7863s0flnshvqyaapxtcjv0wrmtpgdue9f8v9hp3m9k85rhhd59mzta53xvm +50_000,gn,penumbra1vw6j4uankvltjwz08khc7tx0u7fsgjc4x58skfvxfda079rqys73y88kwank6mncr5xewz4ahy7863s0flnshvqyaapxtcjv0wrmtpgdue9f8v9hp3m9k85rhhd59mzta53xvm +25_000,pizza,penumbra1vw6j4uankvltjwz08khc7tx0u7fsgjc4x58skfvxfda079rqys73y88kwank6mncr5xewz4ahy7863s0flnshvqyaapxtcjv0wrmtpgdue9f8v9hp3m9k85rhhd59mzta53xvm +250,cube,penumbra1vw6j4uankvltjwz08khc7tx0u7fsgjc4x58skfvxfda079rqys73y88kwank6mncr5xewz4ahy7863s0flnshvqyaapxtcjv0wrmtpgdue9f8v9hp3m9k85rhhd59mzta53xvm +1_000_000,test_usd,penumbra1vw6j4uankvltjwz08khc7tx0u7fsgjc4x58skfvxfda079rqys73y88kwank6mncr5xewz4ahy7863s0flnshvqyaapxtcjv0wrmtpgdue9f8v9hp3m9k85rhhd59mzta53xvm +10_000,nala,penumbra1vw6j4uankvltjwz08khc7tx0u7fsgjc4x58skfvxfda079rqys73y88kwank6mncr5xewz4ahy7863s0flnshvqyaapxtcjv0wrmtpgdue9f8v9hp3m9k85rhhd59mzta53xvm +5_000_000__000_000,upenumbra,penumbra1e2tn2yzapw8mxncn3uwjqe2k8fsdvdxu3pcswlwl80a8gf87glrq3mqstc7rlcxa7snk6vke8rrwzxytpf4w3xzhy2edhhuxde4u2z48w7a2f97xea3z5da9pk3h2j0axn294m +50_000,gm,penumbra1e2tn2yzapw8mxncn3uwjqe2k8fsdvdxu3pcswlwl80a8gf87glrq3mqstc7rlcxa7snk6vke8rrwzxytpf4w3xzhy2edhhuxde4u2z48w7a2f97xea3z5da9pk3h2j0axn294m +50_000,gn,penumbra1e2tn2yzapw8mxncn3uwjqe2k8fsdvdxu3pcswlwl80a8gf87glrq3mqstc7rlcxa7snk6vke8rrwzxytpf4w3xzhy2edhhuxde4u2z48w7a2f97xea3z5da9pk3h2j0axn294m +25_000,pizza,penumbra1e2tn2yzapw8mxncn3uwjqe2k8fsdvdxu3pcswlwl80a8gf87glrq3mqstc7rlcxa7snk6vke8rrwzxytpf4w3xzhy2edhhuxde4u2z48w7a2f97xea3z5da9pk3h2j0axn294m +250,cube,penumbra1e2tn2yzapw8mxncn3uwjqe2k8fsdvdxu3pcswlwl80a8gf87glrq3mqstc7rlcxa7snk6vke8rrwzxytpf4w3xzhy2edhhuxde4u2z48w7a2f97xea3z5da9pk3h2j0axn294m +1_000_000,test_usd,penumbra1e2tn2yzapw8mxncn3uwjqe2k8fsdvdxu3pcswlwl80a8gf87glrq3mqstc7rlcxa7snk6vke8rrwzxytpf4w3xzhy2edhhuxde4u2z48w7a2f97xea3z5da9pk3h2j0axn294m +10_000,nala,penumbra1e2tn2yzapw8mxncn3uwjqe2k8fsdvdxu3pcswlwl80a8gf87glrq3mqstc7rlcxa7snk6vke8rrwzxytpf4w3xzhy2edhhuxde4u2z48w7a2f97xea3z5da9pk3h2j0axn294m +5_000_000__000_000,upenumbra,penumbra1u3x4wdz7j8qfx7q5hte40u9gq788qz5zn4aqlr5kfzw3dxzxyktxjq2y0ma3tnd6ufwzszm25spg45my74fqn3qmeq9laj3cz3pr7eqym6f4gldsngjrwm22gf4damepgkqegk +50_000,gm,penumbra1u3x4wdz7j8qfx7q5hte40u9gq788qz5zn4aqlr5kfzw3dxzxyktxjq2y0ma3tnd6ufwzszm25spg45my74fqn3qmeq9laj3cz3pr7eqym6f4gldsngjrwm22gf4damepgkqegk +50_000,gn,penumbra1u3x4wdz7j8qfx7q5hte40u9gq788qz5zn4aqlr5kfzw3dxzxyktxjq2y0ma3tnd6ufwzszm25spg45my74fqn3qmeq9laj3cz3pr7eqym6f4gldsngjrwm22gf4damepgkqegk +25_000,pizza,penumbra1u3x4wdz7j8qfx7q5hte40u9gq788qz5zn4aqlr5kfzw3dxzxyktxjq2y0ma3tnd6ufwzszm25spg45my74fqn3qmeq9laj3cz3pr7eqym6f4gldsngjrwm22gf4damepgkqegk +250,cube,penumbra1u3x4wdz7j8qfx7q5hte40u9gq788qz5zn4aqlr5kfzw3dxzxyktxjq2y0ma3tnd6ufwzszm25spg45my74fqn3qmeq9laj3cz3pr7eqym6f4gldsngjrwm22gf4damepgkqegk +1_000_000,test_usd,penumbra1u3x4wdz7j8qfx7q5hte40u9gq788qz5zn4aqlr5kfzw3dxzxyktxjq2y0ma3tnd6ufwzszm25spg45my74fqn3qmeq9laj3cz3pr7eqym6f4gldsngjrwm22gf4damepgkqegk +10_000,nala,penumbra1u3x4wdz7j8qfx7q5hte40u9gq788qz5zn4aqlr5kfzw3dxzxyktxjq2y0ma3tnd6ufwzszm25spg45my74fqn3qmeq9laj3cz3pr7eqym6f4gldsngjrwm22gf4damepgkqegk +5_000_000__000_000,upenumbra,penumbra1l6kpj6e5d7ph0nnggxwgwhk5wumm7k2vjulq0jysdvh7y2p0r0qe5dr7jntl8wz6xjt08dqvu8dnn49fnxhta5mfcdl0kjpruhj76umulw2dssslansy7qv6k3ajeh72qz2all +50_000,gm,penumbra1l6kpj6e5d7ph0nnggxwgwhk5wumm7k2vjulq0jysdvh7y2p0r0qe5dr7jntl8wz6xjt08dqvu8dnn49fnxhta5mfcdl0kjpruhj76umulw2dssslansy7qv6k3ajeh72qz2all +50_000,gn,penumbra1l6kpj6e5d7ph0nnggxwgwhk5wumm7k2vjulq0jysdvh7y2p0r0qe5dr7jntl8wz6xjt08dqvu8dnn49fnxhta5mfcdl0kjpruhj76umulw2dssslansy7qv6k3ajeh72qz2all +25_000,pizza,penumbra1l6kpj6e5d7ph0nnggxwgwhk5wumm7k2vjulq0jysdvh7y2p0r0qe5dr7jntl8wz6xjt08dqvu8dnn49fnxhta5mfcdl0kjpruhj76umulw2dssslansy7qv6k3ajeh72qz2all +250,cube,penumbra1l6kpj6e5d7ph0nnggxwgwhk5wumm7k2vjulq0jysdvh7y2p0r0qe5dr7jntl8wz6xjt08dqvu8dnn49fnxhta5mfcdl0kjpruhj76umulw2dssslansy7qv6k3ajeh72qz2all +1_000_000,test_usd,penumbra1l6kpj6e5d7ph0nnggxwgwhk5wumm7k2vjulq0jysdvh7y2p0r0qe5dr7jntl8wz6xjt08dqvu8dnn49fnxhta5mfcdl0kjpruhj76umulw2dssslansy7qv6k3ajeh72qz2all +10_000,nala,penumbra1l6kpj6e5d7ph0nnggxwgwhk5wumm7k2vjulq0jysdvh7y2p0r0qe5dr7jntl8wz6xjt08dqvu8dnn49fnxhta5mfcdl0kjpruhj76umulw2dssslansy7qv6k3ajeh72qz2all +5_000_000__000_000,upenumbra,penumbra12hcj6z3xxk4an08msjf2fu0qk90nv6582lqzlmjwnnd75xz6u928wrcw8vpqxd489d6nqyvf7raq7jv75hg3qsa0ut9j2sxhfqfwrh56v064xh7hemdp898mls38v8ca76et3x +50_000,gm,penumbra12hcj6z3xxk4an08msjf2fu0qk90nv6582lqzlmjwnnd75xz6u928wrcw8vpqxd489d6nqyvf7raq7jv75hg3qsa0ut9j2sxhfqfwrh56v064xh7hemdp898mls38v8ca76et3x +50_000,gn,penumbra12hcj6z3xxk4an08msjf2fu0qk90nv6582lqzlmjwnnd75xz6u928wrcw8vpqxd489d6nqyvf7raq7jv75hg3qsa0ut9j2sxhfqfwrh56v064xh7hemdp898mls38v8ca76et3x +25_000,pizza,penumbra12hcj6z3xxk4an08msjf2fu0qk90nv6582lqzlmjwnnd75xz6u928wrcw8vpqxd489d6nqyvf7raq7jv75hg3qsa0ut9j2sxhfqfwrh56v064xh7hemdp898mls38v8ca76et3x +250,cube,penumbra12hcj6z3xxk4an08msjf2fu0qk90nv6582lqzlmjwnnd75xz6u928wrcw8vpqxd489d6nqyvf7raq7jv75hg3qsa0ut9j2sxhfqfwrh56v064xh7hemdp898mls38v8ca76et3x +1_000_000,test_usd,penumbra12hcj6z3xxk4an08msjf2fu0qk90nv6582lqzlmjwnnd75xz6u928wrcw8vpqxd489d6nqyvf7raq7jv75hg3qsa0ut9j2sxhfqfwrh56v064xh7hemdp898mls38v8ca76et3x +10_000,nala,penumbra12hcj6z3xxk4an08msjf2fu0qk90nv6582lqzlmjwnnd75xz6u928wrcw8vpqxd489d6nqyvf7raq7jv75hg3qsa0ut9j2sxhfqfwrh56v064xh7hemdp898mls38v8ca76et3x +5_000_000__000_000,upenumbra,penumbra1nzyf0qh28727tv56wcyj4v5c8ur9vfel52uxmpmypzs7dyn5986ng3j9l3lnuyj73cls5dgrhn7exe7j9cp2kx6rnf6ggus6s3w2kkd8kf6ydr5wfplw34vzxrk9e8n20ckm70 +50_000,gm,penumbra1nzyf0qh28727tv56wcyj4v5c8ur9vfel52uxmpmypzs7dyn5986ng3j9l3lnuyj73cls5dgrhn7exe7j9cp2kx6rnf6ggus6s3w2kkd8kf6ydr5wfplw34vzxrk9e8n20ckm70 +50_000,gn,penumbra1nzyf0qh28727tv56wcyj4v5c8ur9vfel52uxmpmypzs7dyn5986ng3j9l3lnuyj73cls5dgrhn7exe7j9cp2kx6rnf6ggus6s3w2kkd8kf6ydr5wfplw34vzxrk9e8n20ckm70 +25_000,pizza,penumbra1nzyf0qh28727tv56wcyj4v5c8ur9vfel52uxmpmypzs7dyn5986ng3j9l3lnuyj73cls5dgrhn7exe7j9cp2kx6rnf6ggus6s3w2kkd8kf6ydr5wfplw34vzxrk9e8n20ckm70 +250,cube,penumbra1nzyf0qh28727tv56wcyj4v5c8ur9vfel52uxmpmypzs7dyn5986ng3j9l3lnuyj73cls5dgrhn7exe7j9cp2kx6rnf6ggus6s3w2kkd8kf6ydr5wfplw34vzxrk9e8n20ckm70 +1_000_000,test_usd,penumbra1nzyf0qh28727tv56wcyj4v5c8ur9vfel52uxmpmypzs7dyn5986ng3j9l3lnuyj73cls5dgrhn7exe7j9cp2kx6rnf6ggus6s3w2kkd8kf6ydr5wfplw34vzxrk9e8n20ckm70 +10_000,nala,penumbra1nzyf0qh28727tv56wcyj4v5c8ur9vfel52uxmpmypzs7dyn5986ng3j9l3lnuyj73cls5dgrhn7exe7j9cp2kx6rnf6ggus6s3w2kkd8kf6ydr5wfplw34vzxrk9e8n20ckm70 +5_000_000__000_000,upenumbra,penumbra1kllhj0jprucna84r8pnwsngccr0dl2erdra3sa75mhvprr688e98j2cl9j7ls9njvufcwhg03jzm8zea3rmgaevk2y42yy2gzxq4qgpm4cnx5xe4wz2qj4f3ramhxrpqspju04 +50_000,gm,penumbra1kllhj0jprucna84r8pnwsngccr0dl2erdra3sa75mhvprr688e98j2cl9j7ls9njvufcwhg03jzm8zea3rmgaevk2y42yy2gzxq4qgpm4cnx5xe4wz2qj4f3ramhxrpqspju04 +50_000,gn,penumbra1kllhj0jprucna84r8pnwsngccr0dl2erdra3sa75mhvprr688e98j2cl9j7ls9njvufcwhg03jzm8zea3rmgaevk2y42yy2gzxq4qgpm4cnx5xe4wz2qj4f3ramhxrpqspju04 +25_000,pizza,penumbra1kllhj0jprucna84r8pnwsngccr0dl2erdra3sa75mhvprr688e98j2cl9j7ls9njvufcwhg03jzm8zea3rmgaevk2y42yy2gzxq4qgpm4cnx5xe4wz2qj4f3ramhxrpqspju04 +250,cube,penumbra1kllhj0jprucna84r8pnwsngccr0dl2erdra3sa75mhvprr688e98j2cl9j7ls9njvufcwhg03jzm8zea3rmgaevk2y42yy2gzxq4qgpm4cnx5xe4wz2qj4f3ramhxrpqspju04 +1_000_000,test_usd,penumbra1kllhj0jprucna84r8pnwsngccr0dl2erdra3sa75mhvprr688e98j2cl9j7ls9njvufcwhg03jzm8zea3rmgaevk2y42yy2gzxq4qgpm4cnx5xe4wz2qj4f3ramhxrpqspju04 +10_000,nala,penumbra1kllhj0jprucna84r8pnwsngccr0dl2erdra3sa75mhvprr688e98j2cl9j7ls9njvufcwhg03jzm8zea3rmgaevk2y42yy2gzxq4qgpm4cnx5xe4wz2qj4f3ramhxrpqspju04 +10_000_000__000_000,upenumbra,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,gm,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,gn,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,pizza,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,cube,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,test_usd,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,test_btc,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,test_eth,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,test_atom,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,test_osmo,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000__000_000,upenumbra,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,gm,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,gn,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,pizza,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,cube,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,test_usd,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,test_btc,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,test_eth,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,test_atom,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,test_osmo,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +100,gm,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +5001,test_usd,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +1,cube,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +2_000__000_000,upenumbra,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +1_000,test_usd,penumbra1vmmz304hjlkjq6xv4al5dqumvgk3ek82rneagj07vdqkudjvl6y7zxzr5k6qq24yc7yyyekpu9qm7ef3acg2u8p950hs6hu3e73guq5pfmmvm63qudfx4qmg8h7fdweyw3ektn +1_000__000_000,upenumbra,penumbra1vmmz304hjlkjq6xv4al5dqumvgk3ek82rneagj07vdqkudjvl6y7zxzr5k6qq24yc7yyyekpu9qm7ef3acg2u8p950hs6hu3e73guq5pfmmvm63qudfx4qmg8h7fdweyw3ektn +75_000__000_000,upenumbra,penumbra15v8j3duuyy7klsnnw4gjynnz97htazjs049fgdj5h3ynr7kngj7ymk2ql4mv3ts89e6t0fahyt6kn873wun4jsnkeghqjzfrugln03hen8gp50f0l9aeec2dqp4zleq9vak53n diff --git a/crates/test/migration-test/src/main.rs b/crates/test/migration-test/src/main.rs new file mode 100644 index 0000000000..e7a11a969c --- /dev/null +++ b/crates/test/migration-test/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/crates/test/migration-test/tests/network_integration.rs b/crates/test/migration-test/tests/network_integration.rs new file mode 100644 index 0000000000..17d7f1dce9 --- /dev/null +++ b/crates/test/migration-test/tests/network_integration.rs @@ -0,0 +1,404 @@ +#![allow(dead_code, unused_imports)] +//! Migration testing between Penumbra networks, for validating chain upgrades. +//! +//! These tests are marked with `#[migration-test]`, and so can be run with: +//! `cargo test --package migration-test --all-features -- --test-threads 1` +//! +//! Tests against the network in the `PENUMBRA_NODE_PD_URL` environment variable. +//! +//! Tests use the smoke test account. Tries to avoid assumptions about whether +//! or how many times the smoke-test suite has been run. +//! +//! See the latest testnet's `allocations.csv` for the initial allocations to the test validator addresses +//! ([`ADDRESS_0_STR`], [`ADDRESS_1_STR`]). + +use serde::{Deserialize, Serialize}; +use std::path::Path; +use std::thread; +use std::{path::PathBuf, time::Duration}; + +use assert_cmd::Command; +use directories::UserDirs; +use once_cell::sync::Lazy; +use predicates::prelude::*; +use regex::Regex; +use tempfile::{tempdir, NamedTempFile, TempDir}; + +use tracing::instrument; + +use penumbra_keys::test_keys::SEED_PHRASE; + +// The number 50,000 is chosen to be greater than two-third of the default +// genesis stake for a devnet validator, which is 25,000. +const TEST_DELEGATION: &str = "50000penumbra"; + +// Amount to pay as deposit for submitting the halt proposal. Does not take a denom, +// but should, see GH3455. We could technically read this from `pcli q chain info`, +// but we'll need to update it when we have denom parsing anyway. +const TEST_PROPOSAL_DEPOSIT: &str = "10000000"; + +// The maximum amount of time any command is allowed to take before we error. +const TIMEOUT_COMMAND_SECONDS: u64 = 20; + +const PROPOSAL_VOTING_BLOCKS: Lazy = Lazy::new(|| { + std::env::var("PROPOSAL_VOTING_BLOCKS") + .unwrap_or("50".to_string()) + .parse() + .unwrap() +}); + +// The length of wall time that constitutes an epoch. Used to sleep +// so that we're guaranteed to advance to the subsequent epoch. +static EPOCH_DURATION: Lazy = Lazy::new(|| { + let blocks: f64 = std::env::var("EPOCH_DURATION") + .unwrap_or("50".to_string()) + .parse() + .unwrap(); + // 0.5 -> 0.6 for comfort, since 500ms is only an estimate. + Duration::from_secs((0.6 * blocks) as u64) +}); + +// Assume we're running against local devnet. +static PD_NODE_URL: Lazy = Lazy::new(|| { + std::env::var("PENUMBRA_NODE_PD_URL") + .unwrap_or("http://localhost:8080".to_string()) + .parse() + .unwrap() +}); + +/// Build `Command` for `pcli`. By default, uses the `pcli` from the current workspace, +/// but can be overridden via `TEST_PCLI_PATH` env var to use a discrete binary on disk. +/// The latter case is useful for migration testing, running a previously released +/// version of pcli for a pre-upgrade devnet. +/// +/// Important: the `TEST_PCLI_PATH` env var should be *relative to the repo root*. +fn get_pcli_path() -> Command { + match std::env::var("TEST_PCLI_PATH") { + Ok(p) => { + let git_output = Command::new("git") + .args(["rev-parse", "--show-toplevel"]) + .unwrap() + .stdout; + let repo_root = std::str::from_utf8(&git_output).unwrap().trim(); + let fullpath = Path::new(&repo_root).join(&p); + assert!( + fullpath.is_absolute(), + "fullpath to pcli must be absolute: '{}'", + fullpath.display() + ); + assert!( + fullpath.is_file(), + "fullpath to pcli must exist: '{}'", + fullpath.display() + ); + Command::new(fullpath) + } + Err(_) => Command::cargo_bin("pcli").unwrap(), + } +} + +/// Import the wallet from seed phrase into a temporary directory. +fn load_wallet_into_tmpdir() -> TempDir { + let tmpdir = tempdir().unwrap(); + let mut setup_cmd = get_pcli_path(); + setup_cmd + .args([ + "--home", + tmpdir.path().to_str().unwrap(), + "init", + "--grpc-url", + &PD_NODE_URL, + "soft-kms", + "import-phrase", + ]) + .write_stdin(SEED_PHRASE) + .timeout(std::time::Duration::from_secs(TIMEOUT_COMMAND_SECONDS)); + setup_cmd + .assert() + .stdout(predicate::str::contains("Writing generated config")); + tmpdir +} + +/// Sync the wallet. Fallible, so we can use it so confirm network is halted. +fn sync(tmpdir: &TempDir) -> anyhow::Result<()> { + let mut sync_cmd = get_pcli_path(); + sync_cmd + .args(["--home", tmpdir.path().to_str().unwrap(), "view", "sync"]) + .timeout(std::time::Duration::from_secs(TIMEOUT_COMMAND_SECONDS)); + sync_cmd.assert().try_success()?; + Ok(()) +} + +/// Look up a currently active validator on the testnet. +/// Will return the most bonded, which means the Penumbra Labs CI validator. +fn get_validator(tmpdir: &TempDir) -> String { + let mut validator_cmd = get_pcli_path(); + validator_cmd + .args([ + "--home", + tmpdir.path().to_str().unwrap(), + "query", + "validator", + "list", + ]) + .timeout(std::time::Duration::from_secs(TIMEOUT_COMMAND_SECONDS)); + validator_cmd.assert().success(); + + // Pull out one of the validators from stdout. + let stdout_vec = validator_cmd.unwrap().stdout; + let validator_regex = Regex::new(r"penumbravalid1\w{58}").unwrap(); + let captures = validator_regex.captures(std::str::from_utf8(&stdout_vec).unwrap()); + + // We retrieve the first match via index 0, which results in most trusted. + captures.unwrap()[0].to_string() +} + +/// Look up current block height on target network. +fn get_current_height(tmpdir: &TempDir) -> u64 { + let mut info_cmd = get_pcli_path(); + info_cmd + .args([ + "--home", + tmpdir.path().to_str().unwrap(), + "query", + "chain", + "info", + ]) + .timeout(std::time::Duration::from_secs(TIMEOUT_COMMAND_SECONDS)); + info_cmd.assert().success(); + + let stdout_vec = info_cmd.unwrap().stdout; + let height_regex = Regex::new(r"Current Block Height\s+(\d+)").unwrap(); + let captures = height_regex.captures(std::str::from_utf8(&stdout_vec).unwrap()); + + // Reminder: index 0 is entire match, index 1 is first captured group. + captures.unwrap()[1] + .parse() + .expect("block height in pcli output is u64") +} + +// Needed functions: +// +// get_current_height() +// generate_proposal +// submit_proposal +// +// + +/// Look up top validator and delegate `TEST_DELEGATION` to it. +#[cfg_attr(not(feature = "migration-test"), ignore)] +#[test] +fn delegate() { + tracing_subscriber::fmt::try_init().ok(); + tracing::info!("delegate_and_undelegate"); + let tmpdir = load_wallet_into_tmpdir(); + + // Get a validator from the testnet. + let validator = get_validator(&tmpdir); + + // Delegate a tiny bit of penumbra to the validator. + let mut delegate_cmd = get_pcli_path(); + delegate_cmd + .args([ + "--home", + tmpdir.path().to_str().unwrap(), + "tx", + "delegate", + &TEST_DELEGATION, + "--to", + validator.as_str(), + // use dedicated subaccount for smoke delegations + "--source", + "2", + ]) + .timeout(std::time::Duration::from_secs(TIMEOUT_COMMAND_SECONDS)); + tracing::info!(?delegate_cmd, "running delegation command"); + delegate_cmd.assert().success(); + // Wait for bonding, otherwise delegation isn't active. + tracing::info!("waiting for stake to bonding..."); + thread::sleep(*EPOCH_DURATION); +} + +/// Look up any delegation to a validator, and undelegate it. +/// Useful for "undoing" the delegate action, which can help with keeping the +/// test suite somewhat idempotent. +fn undelegate() { + tracing::info!("check that we have some of the delegation token"); + let tmpdir = load_wallet_into_tmpdir(); + let validator = get_validator(&tmpdir); + // Check we have some of the delegation token for that validator now. + let mut balance_cmd = get_pcli_path(); + balance_cmd + .args(["--home", tmpdir.path().to_str().unwrap(), "view", "balance"]) + .timeout(std::time::Duration::from_secs(TIMEOUT_COMMAND_SECONDS)); + + balance_cmd + .assert() + .stdout(predicate::str::is_match(validator.as_str()).unwrap()); + + let balance_output = balance_cmd.output().unwrap().stdout; + let balance_output_string = String::from_utf8_lossy(&balance_output); + + tracing::debug!(?balance_output_string, "balance output string"); + + // We successfully delegated. But since the validator exchange rates are dynamic, we + // need to pull the amount of delegation tokens we obtained so that we can later + // try to execute an undelegation (`tx undelegate `). + // To do this, we use a regex to extract the amount of delegation tokens we obtained: + let delegation_token_pattern = Regex::new(r"(\d+\.?\d?m?delegation_[a-zA-Z0-9]*)").unwrap(); + let (delegation_token_str, [_match]) = delegation_token_pattern + .captures(&balance_output_string) + .expect("can find delegation token in balance output") + .extract(); + + tracing::info!("attempting undelegation"); + let mut undelegate_cmd = get_pcli_path(); + undelegate_cmd + .args([ + "--home", + tmpdir.path().to_str().unwrap(), + "tx", + "undelegate", + delegation_token_str, + ]) + .timeout(std::time::Duration::from_secs(TIMEOUT_COMMAND_SECONDS)); + undelegate_cmd.assert().success(); + + tracing::info!("undelegation succeeded, wait an epoch before claiming."); + // Wait for the epoch duration. + thread::sleep(*EPOCH_DURATION); + tracing::info!("epoch passed, claiming now"); + let mut undelegate_claim_cmd = get_pcli_path(); + undelegate_claim_cmd + .args([ + "--home", + tmpdir.path().to_str().unwrap(), + "tx", + "undelegate-claim", + ]) + .timeout(std::time::Duration::from_secs(TIMEOUT_COMMAND_SECONDS)); + tracing::info!(?undelegate_claim_cmd, "claiming"); + undelegate_claim_cmd.assert().success(); + tracing::info!("success!"); + sync(&tmpdir).expect("sync is successful"); +} + +/// TOML for an "upgrade-plan" governance proposal. +// Intentionally avoiding importing this type to adhere to strict +// CLI interfacts for the pcli binaries. +#[derive(Deserialize, Serialize)] +struct UpgradePlan { + id: u64, + title: String, + description: String, + kind: String, + height: u64, +} + +#[cfg_attr(not(feature = "migration-test"), ignore)] +#[test] +#[instrument] +/// Create, submit, and vote on proposal for halting the chain. +/// Will automatically choose an upgrade height in the next epoch. +fn submit_chain_upgrade_proposal() { + let tmpdir = load_wallet_into_tmpdir(); + // Get template for signaling proposal. + let mut template_cmd = get_pcli_path(); + template_cmd + .args([ + "--home", + tmpdir.path().to_str().unwrap(), + "tx", + "proposal", + "template", + "upgrade-plan", + "--file", + "proposal.toml", + ]) + .timeout(std::time::Duration::from_secs(TIMEOUT_COMMAND_SECONDS)); + tracing::info!("generating upgrade-plan proposal"); + + template_cmd.assert().success(); + + // Look up current height and calculate halt height. + let current_height = get_current_height(&tmpdir); + let upgrade_height = current_height + (*PROPOSAL_VOTING_BLOCKS * 2); + // Wait a bit longer than necessary so we're sure the network will be halted. + let blocks_to_wait: u64 = ((upgrade_height - current_height) as f64 * 1.2) as u64; + + let proposal_contents = std::fs::read_to_string("proposal.toml") + .expect("could not read upgrade-plan proposal toml file"); + let mut proposal: UpgradePlan = toml::from_str(&proposal_contents) + .expect("can parse upgrade-plan proposal toml file to UpgradePlan"); + + proposal.height = upgrade_height; + proposal.title = "migration-test".to_string(); + proposal.description = "automated proposal via migration-test suite".to_string(); + + let proposal_path = Path::new("proposal.toml"); + std::fs::write( + &proposal_path, + toml::to_string_pretty(&proposal).expect("could not marshal upgrade-plan as TOML"), + ) + .expect("can write upgrade-plan proposal to tempfile"); + + // Submit upgrade-plan proposal. + tracing::info!("submitting upgrade-plan proposal"); + let mut submit_cmd = get_pcli_path(); + submit_cmd + .args([ + "--home", + tmpdir.path().to_str().unwrap(), + "tx", + "proposal", + "submit", + "--file", + &proposal_path.to_str().unwrap(), + // use dedicated smoke subaccount for proposal voting + "--source", + "2", + "--deposit-amount", + TEST_PROPOSAL_DEPOSIT, + ]) + .timeout(std::time::Duration::from_secs(TIMEOUT_COMMAND_SECONDS)); + submit_cmd.assert().success(); + + // Vote on proposal. + tracing::info!("voting yes on proposal {}", &proposal.id); + let mut vote_cmd = get_pcli_path(); + vote_cmd + .args([ + "--home", + tmpdir.path().to_str().unwrap(), + "tx", + "vote", + "yes", + "--on", + &proposal.id.to_string(), + // use dedicated subaccount for smoke delegations + "--source", + "2", + ]) + .timeout(std::time::Duration::from_secs(TIMEOUT_COMMAND_SECONDS)); + vote_cmd.assert().success(); + + // Wait for it to pass, after which chain should be halted + tracing::warn!("waiting {} blocks for chain to halt...", blocks_to_wait); + wait_n_blocks(blocks_to_wait); + + // Assert that a sync fails + match sync(&tmpdir) { + // OK is bad, since we expected the chain to be halted. + Ok(_) => { + assert!(false, "chain is still running, not halted"); + } + // Error is expected and good, as it indicates chain has halted. + Err(_) => {} + } +} + +fn wait_n_blocks(blocks: u64) { + // 0.5 -> 0.6 for comfort, since 500ms is only an estimate. + let d = Duration::from_secs((0.6 * blocks as f64) as u64); + thread::sleep(d); +} diff --git a/deployments/compose/process-compose-migration-test-1.yml b/deployments/compose/process-compose-migration-test-1.yml new file mode 100644 index 0000000000..33040008b5 --- /dev/null +++ b/deployments/compose/process-compose-migration-test-1.yml @@ -0,0 +1,62 @@ +--- +# A process-compose configuration for running penumbra migration-tests. + +# Interleave logs from all services in single file, so it's greppable. +log_location: deployments/logs/migration-test-1-combined.log +is_strict: true + +processes: + build-code: + working_dir: deployments/worktrees/v0.73.1 + + # Create network configuration, for running a pd validator locally. + # We override the allocations bump up staking tokens for the smoke-test account, + # so it can delegate enough wait to vote for a halt. + network-generate: + working_dir: deployments/worktrees/v0.73.1 + command: > + cargo run --quiet --release --bin pd -- testnet generate + --unbonding-delay 50 + --epoch-duration 50 + --proposal-voting-blocks 50 + --timeout-commit 500ms + --allocations-input-file ../../../crates/test/migration-test/files/migration-allocations.csv + + # Run pd validator based on generated network. + pd: + working_dir: deployments/worktrees/v0.73.1 + + # Run `pclientd` integration tests. + test-pclientd: + working_dir: deployments/worktrees/v0.73.1 + log_location: deployments/logs/migration-test-1-pclientd.log + + # Run `pcli` integration tests. + test-pcli: + working_dir: deployments/worktrees/v0.73.1 + log_location: deployments/logs/migration-test-1-pcli.log + # We add `--skip delegate_and_undelegate` because the old smoke-test has an unreliable + # regex, that's since been fixed. + command: >- + cargo test --release --features sct-divergence-check,download-proving-keys --package pcli -- + --ignored --test-threads 1 --nocapture + --skip delegate_and_undelegate + depends_on: + pd: + condition: process_healthy + cometbft: + condition: process_started + test-pclientd: + condition: process_completed + availability: + restart: exit_on_failure + + test-pd: + working_dir: deployments/worktrees/v0.73.1 + + # Finalizer task, which will wait until all test suites have finished. + # This allows us to ensure that. + summary: + # The `command` only runs if all tests were succesful, + # otherwise the process exits due to dep failure. + command: echo "migration tests phase 1 finished" diff --git a/deployments/compose/process-compose-migration-test-2.yml b/deployments/compose/process-compose-migration-test-2.yml new file mode 100644 index 0000000000..1c2d4eb9e7 --- /dev/null +++ b/deployments/compose/process-compose-migration-test-2.yml @@ -0,0 +1,49 @@ +--- +# A process-compose configuration for running penumbra migration-tests. +# This series of commands handles voting for an upgrade-plan and halting +# the network, in preparation for the actual migration. + +# Interleave logs from all services in single file, so it's greppable. +log_location: deployments/logs/migration-test-2-combined.log +is_strict: true + +processes: + # Don't generate, since we already did that on the old tag. + network-generate: + command: echo "skipping network generation, deferring to migration..." + working_dir: deployments/worktrees/v0.73.1 + + pd: + working_dir: deployments/worktrees/v0.73.1 + + test-pclientd: + command: echo "skipping pclientd tests, preparing migration..." + test-pcli: + command: echo "skipping pcli tests, preparing migration..." + test-pd: + command: echo "skipping pd tests, preparing migration..." + + vote-for-halt: + command: >- + cargo test --release --package migration-test --features migration-test -- --test-threads 1 --nocapture + environment: + - "TEST_PCLI_PATH=deployments/worktrees/v0.73.1/target/release/pcli" + log_location: deployments/logs/migration-test-2-vote.log + depends_on: + pd: + condition: process_healthy + cometbft: + condition: process_started + test-pcli: + condition: process_completed_successfully + availability: + restart: exit_on_failure + + summary: + command: echo "migration tests phase 2 finished" + depends_on: + # The vote-for-halt suite will check that network is halted, so OK to exit after. + vote-for-halt: + condition: process_completed_successfully + availability: + exit_on_end: false diff --git a/deployments/compose/process-compose-smoke-test.yml b/deployments/compose/process-compose-smoke-test.yml index c4594fe403..23b39d1682 100644 --- a/deployments/compose/process-compose-smoke-test.yml +++ b/deployments/compose/process-compose-smoke-test.yml @@ -35,11 +35,16 @@ processes: --ignored --test-threads 1 --nocapture # Create network configuration, for running a pd validator locally. + # We override the allocations bump up staking tokens for the smoke-test account, + # so it can delegate enough wait to vote for a halt. network-generate: command: > - cargo run --quiet --release --bin pd -- - testnet generate --unbonding-delay 50 - --epoch-duration 50 --timeout-commit 500ms --gas-price-simple 1000 + cargo run --quiet --release --bin pd -- testnet generate + --unbonding-delay 50 + --epoch-duration 50 + --proposal-voting-blocks 50 + --timeout-commit 500ms + --allocations-input-file crates/test/migration-test/files/migration-allocations.csv depends_on: build-code: condition: process_completed_successfully diff --git a/deployments/compose/process-compose.yml b/deployments/compose/process-compose.yml new file mode 100644 index 0000000000..640ec70573 --- /dev/null +++ b/deployments/compose/process-compose.yml @@ -0,0 +1,70 @@ +--- +# A process-compose configuration for running a local Penumbra devnet. +# This isn't used in scripts anywhere (yet?) but serves as a reference point. +# Potentially could be integrated with e.g. https://www.jetify.com/devbox later on. +# +version: "0.5" + +# Env vars set here will be accessible to all processes. +environment: + - "RUST_LOG=info,network_integration=debug,pclientd=debug,pcli=info,pd=info,penumbra=info" + +log_level: info +is_strict: true +# Interleave logs from all services in single file, so it's greppable. +log_location: deployments/logs/dev-env-combined.log + +# By default, build pd from the workspace. Support overriding via a deeper git-worktree, +# so that an older version of pd can be built and run. This helps when running older +# networks locally, to debug migrations. +vars: + WORKING_DIR: . + # WORKING_DIR: deployments/worktrees/v0.73.1 + +processes: + # Build latest version of local code. We do this once, up front, + # so that each test suite runs immediately when ready, without iterative building. + build-code: + working_dir: "{{ .WORKING_DIR }}" + command: |- + echo "Building source code..." + cargo --quiet build --release --all-targets + + # Generate network from latest code, only if network does not already exist. + generate-network-nice: + working_dir: "{{ .WORKING_DIR }}" + command: |- + if [[ -d ~/.penumbra/testnet_data/node0 ]] ; then + >&2 echo "Testnet data exists locally, reusing it" + else + cargo run --quiet --release --bin pd -- testnet generate \ + --unbonding-delay 50 \ + --epoch-duration 50 \ + --proposal-voting-blocks 50 \ + --timeout-commit 500ms + fi + depends_on: + build-code: + condition: process_completed_successfully + + # Run pd validator based on generated network. + pd: + command: "cargo run --release --bin pd -- start" + readiness_probe: + http_get: + host: 127.0.0.1 + scheme: http + path: "/" + port: 8080 + period_seconds: 5 + working_dir: "{{ .WORKING_DIR }}" + depends_on: + generate-network-nice: + condition: process_completed_successfully + + # Run CometBFT for pd p2p. + cometbft: + command: "cometbft --home ~/.penumbra/testnet_data/node0/cometbft start" + depends_on: + pd: + condition: process_healthy diff --git a/deployments/scripts/migration-test b/deployments/scripts/migration-test new file mode 100755 index 0000000000..e8e57f481c --- /dev/null +++ b/deployments/scripts/migration-test @@ -0,0 +1,165 @@ +#!/usr/bin/env bash +# CI script to test migration compatibility. Orchestrates the following: +# +# * [x] checks out prior tag and builds its binaries and tests +# * [x] creates local devnet via that target version +# * [x] make sure devnet has very fast voting +# * [x] runs smoke tests against devnet, to generate txs +# * [x] initialize smoke-test pcli wallet locally +# * [x] submit governance proposal for chain halt +# * [x] vote for proposal to pass +# * [x] wait for halt +# * [x] stops devnet ~ ends phase 1 +# * [x] migrates devnet via latest (i.e. HEAD) pd version ~ begins phase 2 +# * [x] restarts devnet +# * [ ] re-runs smoke tests, from latest version, to validate +# * [x] prepares migration archive for joiners +# * [ ] validates that new nodes can join post-upgrade, via archive +# +# After all that's done, we only know that the migration didn't badly +# break things. We should also have dedicated integration tests +# for pre- and post-migration checks. + +set -euo pipefail + +# Ideally we'd look up the most recently released version of `pd` and use that to test against. +# The current test framework has a lot of `v0.73.1` hardcoded throughout, though, so let's +# mandate explicit versions for now. +target_version="${1:-}" +if [[ -z "$target_version" ]] ; then + >&2 echo "ERROR: no version specified for initial network" + >&2 echo "Usage: $0 " + +fi +shift 1 +>&2 echo "Beginning migration test from '$target_version' -> '$(git rev-parse HEAD) (HEAD)'" + +# Check for interactive terminal session, enable TUI if yes. +if [[ -t 1 ]] ; then + use_tui="true" +else + use_tui="false" +fi + +# Look up some git facts for logging and preparing work trees. +repo_root="$(git rev-parse --show-toplevel)" +worktree_dir="${repo_root}/deployments/worktrees/${target_version}" +logs_dir="${repo_root}/deployments/logs" +mkdir -p "$logs_dir" +rm -f "${logs_dir}/"*".log" + +# Create a local git-worktree so that we can check out a prior +# tag and build its version of tests and suchwhat. +prepare_local_worktree() { + if [[ ! -d "$worktree_dir" ]] ; then + >&2 echo "Creating new git worktree: $worktree_dir" + git worktree add "$worktree_dir" "$target_version" + fi + git -C "$worktree_dir" checkout "$target_version" +} + +# Run phase 1 of the migration test: create devnet on target version tag, +# run smoke tests against it from that checkout, then exit. +function run_migration_test_phase_1() { + >&2 echo "Running smoke-tests against pre-migration devnet, phase 1..." + # Override the pc API port 8080 -> 9191, to avoid conflict with pd. + if ! process-compose \ + --config deployments/compose/process-compose-smoke-test.yml \ + --config deployments/compose/process-compose-migration-test-1.yml \ + --port 9191 \ + -t="$use_tui" \ + ; then + >&2 echo "ERROR: migration tests phase 1 failed" + >&2 echo "Review logs in: deployments/logs/migration-test-1*.log" + find "${repo_root}/deployments/logs/migration-test-1"*".log" | sort >&2 + exit 1 + else + echo "SUCCESS! Migration test phase 1 complete." + fi +} + +# Propose upgrade plan, vote, halt. +function run_migration_test_phase_2() { + >&2 echo "Running smoke-tests against post-migration devnet, phase 2..." + if ! process-compose \ + --config deployments/compose/process-compose-smoke-test.yml \ + --config deployments/compose/process-compose-migration-test-2.yml \ + --port 9191 \ + -t="$use_tui" \ + ; then + >&2 echo "ERROR: migration tests phase 2 failed" + >&2 echo "Review logs in: deployments/logs/migration-test-2*.log" + find "${repo_root}/deployments/logs/migration-test-2"*".log" | sort >&2 + exit 1 + else + echo "SUCCESS! Migration test phase 2 complete." + fi +} + +# Perform most recent migration against local state, according to steps in +# https://guide.penumbra.zone/main/node/pd/chain-upgrade.html +function perform_migration() { + node0_dir="${HOME}/.penumbra/testnet_data/node0" + + # TEMPORARY: backup entire state during development so it's easy to recover + tarball_backup="${node0_dir}/../node0-state-backup.tar" + if [[ ! -e "$tarball_backup" ]] ; then + tar -cf "$tarball_backup" "$node0_dir" + fi + # Ensure tar changes are synced to disk. This shouldn't be necessary, + # but this script will run in a lot of contexts, so better to be sure. + sync + RUST_LOG="info,pd=debug,penumbra=debug" \ + cargo run --quiet --release --bin pd -- migrate +} + +# Create a post-migration tarball of the migrated state, entailing: +# +# * rocksdb dir +# * genesis.json +# * priv_validator_state.json +# +# Crucially, these files must reside in the top-level of the archive, +# for compatibility with `pd testnet join --archive-url`. Thus the gnarly +# sed transform to strip parent directories. +function create_migration_archive() { + pd_version="$(cargo run --quiet --release --bin pd -- --version | perl -nE '/^pd\s+(.+)$/ and say $1')" + testnet_dir="${HOME}/.penumbra/testnet_data" + migration_archive="${testnet_dir}/node0-migration-archive-${pd_version}.tar.gz" + tar -C "$testnet_dir" \ + --transform='s#node0/pd/##;s#node0/cometbft/config/##;s#node0/cometbft/data/##' \ + -czf "$migration_archive" \ + node0/pd/rocksdb \ + node0/cometbft/config/genesis.json \ + node0/cometbft/data/priv_validator_state.json + >&2 echo "Created migration archive: $migration_archive" +} + +# The whole shebang, soup to nuts. +function main() { + prepare_local_worktree + run_migration_test_phase_1 + run_migration_test_phase_2 + + >&2 echo '====================' + >&2 echo 'PERFORMING MIGRATION' + >&2 echo '====================' + perform_migration + >&2 echo '====================' + >&2 echo 'MIGRATION COMPLETE' + >&2 echo '====================' + + create_migration_archive + + >&2 echo "Consider running 'just dev' to rerun the network" + >&2 cat <&2 echo "ERROR: testnet data directory exists at ~/.penumbra/testnet_data" + >&2 echo "Not removing this directory automatically; to remove, run: pd testnet unsafe-reset-all" + exit 1 +fi diff --git a/justfile b/justfile index e63d30dea8..e5ae9c0486 100644 --- a/justfile +++ b/justfile @@ -1,4 +1,10 @@ +dev: + process-compose up --port 9191 --config ./deployments/compose/process-compose.yml --keep-tui + +migration-test: + ./deployments/scripts/warn-about-pd-state + ./deployments/scripts/migration-test v0.73.1 + smoke: - # resetting network state - cargo run --release --bin pd -- testnet unsafe-reset-all || true + ./deployments/scripts/warn-about-pd-state ./deployments/scripts/smoke-test.sh