diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e5c1b19..f60891b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,9 @@ name: CI on: push: - branches: [main] + # `main` is the 1.x/preview line; `ledger-v9` is the long-lived Midnight 2.x port + # (see README "Two lines"). Both get full CI on every push. + branches: [main, ledger-v9] pull_request: workflow_dispatch: @@ -11,7 +13,12 @@ concurrency: cancel-in-progress: true env: - COMPACT_VERSION: '0.31.1' + # ledger-v9 line: toolchain 0.34.0 = compactc 0.34.0, language 0.26.0, + # compact-runtime 0.19.0, ledger 9. MUST equal the `pragma language_version` + # in src/shielded-night.compact and the `+version` in package.json's compact + # scripts, or the byte-exact rebuild job below is meaningless. + # (`main` pins 0.31.1 / language 0.23.) + COMPACT_VERSION: '0.34.0' jobs: unit: @@ -85,8 +92,8 @@ jobs: reproducible-build: name: Byte-exact contract rebuild runs-on: ubuntu-latest - # Full ZK key generation for all 11 circuits measures ~15s; the headroom is - # for a cold compiler install. + # Full ZK key generation for all 11 circuits measures ~14s on 0.34.0; the + # headroom is for a cold compiler install. timeout-minutes: 20 steps: - uses: actions/checkout@v4 @@ -126,7 +133,23 @@ jobs: integration: name: Integration tests (docker stack) runs-on: ubuntu-latest - timeout-minutes: 60 + # 150, not the 60 `main` uses. MEASURED, not guessed: the suite is 1.2-1.6x + # slower per file on the 2.x triple than on 1.x, and 60 was already thin on + # `main` (its last green run spent 50.3 min of its 60 inside vitest). + # + # file main (1.x) ledger-v9 (2.x) + # security.test.ts (5) 1078.7 s 1373.4 s 1.27x + # shielded-night.test.ts (8) 885.7 s 1101.2 s 1.24x + # multiparty.test.ts (1) 471.8 s 753.9 s 1.60x + # maintenance-authority (1) 153.8 s 153.8 s 1.00x (fixed waits) + # transient.test.ts (1) 249.8 s -- + # combined.test.ts (1) 180.2 s -- + # + # The first run on this branch (33693462975) was PASSING every test and was + # killed by the 60-minute cap partway through transient.test.ts, having + # finished 15 of the 17 tests. Projected total here is ~66 min of test time, + # so 150 leaves room for the `retry: 2` tail without hiding a real hang. + timeout-minutes: 150 steps: - uses: actions/checkout@v4 diff --git a/README.md b/README.md index c8dc524..1dbad4c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,23 @@ # Shielded NIGHT +> **You are on the `ledger-v9` branch — the Midnight 2.x line.** +> +> | Branch | Midnight line | Toolchain | Stack | Status | +> |---|---|---|---|---| +> | `main` | **1.x** (preview / preprod / mainnet) | compactc 0.31.1, language 0.23, compact-runtime 0.16.0, `@midnight-ntwrk/ledger-v8` 8.1.0, midnight-js 4.1.1 | node 1.0.0 / indexer-standalone 4.3.3 / proof-server 8.1.0 | what https://shielded-night.pages.dev runs | +> | **`ledger-v9`** (here) | **2.x** | compactc **0.34.0**, language **0.26.0**, compact-runtime **0.19.0**, `@midnightntwrk/ledger-v9` 1.0.0-rc.3, midnight-js 5.0.0-beta.7 | node **2.0.0-rc.4** / indexer-standalone **4.4.0-rc.1** / proof-server **9.0.0-rc.5** | long-lived branch; **merged into `main` when the Midnight network moves to 2.x** | +> +> The two lines are kept separate on purpose: one dependency tree cannot hold both ledger +> wasm modules (two copies give two class identities and every cross-copy `instanceof` +> fails — the reason both `package.json`s carry an `overrides` block). Nothing in this +> branch is deployed to a public network; it targets a local `undeployed` devnet and the +> `midnight-2-offers` demo stack. +> +> **The contract source is unchanged apart from its `pragma language_version`, and all 33 +> ZK artifacts (11 circuits × prover/verifier/bzkir) are byte-identical to the `main` +> build** — so the deployed preview contract's verifier keys remain valid; only the +> generated TypeScript bindings differ. + Convert native **unshielded NIGHT** into **shielded sNight** (a contract-minted wrapper token) and back, on Midnight. Live (preview): https://shielded-night.pages.dev @@ -151,11 +169,11 @@ Anyone can check, without trusting us, that (1) the deployed contract is exactly ### 1. Reproduce the compiled artifacts byte-for-byte -The compiler output is deterministic and the contract pins its language version (`pragma language_version 0.23`), so compiling [src/shielded-night.compact](src/shielded-night.compact) with the pinned toolchain reproduces [src/managed/](src/managed/) exactly: +The compiler output is deterministic and the contract pins its language version (`pragma language_version 0.26` on this branch; `0.23` on `main`), so compiling [src/shielded-night.compact](src/shielded-night.compact) with the pinned toolchain reproduces [src/managed/](src/managed/) exactly: ```bash # Install the Compact toolchain (once): https://docs.midnight.network/relnotes/compact-tools -compact update 0.31.1 # toolchain 0.31.1 = compactc 0.31.101, language 0.23.101 +compact update 0.34.0 # toolchain 0.34.0 = compactc 0.34.0, language 0.26.0, runtime 0.19.0, ledger 9 bun install bun run compact # recompiles src/shielded-night.compact -> src/managed/ diff --git a/TESTING.md b/TESTING.md index 5f5ea52..3e6b525 100644 --- a/TESTING.md +++ b/TESTING.md @@ -12,7 +12,7 @@ reference suites: - Node 22+ (vitest runs under Node; bun is the package manager) - `bun install` -- The `compact` CLI (the scripts pin compiler `0.31.1`) +- The `compact` CLI (this branch's scripts pin compiler `0.34.0`; `main` pins `0.31.1`) - Docker running (integration tier only) ## Unit tests @@ -41,8 +41,9 @@ bun run test:integration ``` `test/integration/global-setup.ts` boots the docker stack -(`envs/docker-compose-dynamic.yml`: midnight-node 1.0.0, indexer-standalone -4.3.3, proof-server 8.1.0) via testcontainers, then the suite deploys the +(`envs/docker-compose-dynamic.yml`: on this `ledger-v9` branch midnight-node +2.0.0-rc.4, indexer-standalone 4.4.0-rc.1, proof-server 9.0.0-rc.5 — the Midnight +2.x triple; `main` runs 1.0.0 / 4.3.3 / 8.1.0) via testcontainers, then the suite deploys the contract with the genesis wallet and runs the full README round trip (depositUnshielded → withdrawShielded → depositShielded → withdrawUnshielded), the negative paths, and a two-wallet independence test. @@ -197,8 +198,8 @@ locked (this guard was added by this suite; see git history). via `sendImmediateShielded` in the same transaction (a transient), so the wrapper supply is elastic both ways: minted on withdraw, burnt on deposit. [test/integration/shielded-night.transient.test.ts](test/integration/shielded-night.transient.test.ts) -pins the fixed behavior on the current stack (toolchain 0.31.101 / ledger-v8 -8.1.0): the transaction applies, the credit equals the coin value, the **wallet +pins the fixed behavior on the current stack (on `main`, toolchain 0.31.101 / +ledger-v8 8.1.0; on `ledger-v9`, toolchain 0.34.0 / ledger-v9 1.0.0-rc.3): the transaction applies, the credit equals the coin value, the **wallet sees the coin as spent** (the historical bug left the spent UTXO listed as spendable, corrupting wallet state), and the credit withdraws again cleanly. diff --git a/bun.lock b/bun.lock index 0306d99..7976c0b 100644 --- a/bun.lock +++ b/bun.lock @@ -5,15 +5,15 @@ "": { "name": "@zswap-da/contract-shielded-night", "dependencies": { - "@midnight-ntwrk/compact-js": "^2.5.1", - "@midnight-ntwrk/compact-runtime": "0.16.0", - "@midnight-ntwrk/ledger-v8": "^8.1.0", - "@midnight-ntwrk/midnight-js": "^4.1.1", - "@midnight-ntwrk/midnight-js-http-client-proof-provider": "^4.1.1", - "@midnight-ntwrk/midnight-js-indexer-public-data-provider": "^4.1.1", - "@midnight-ntwrk/midnight-js-level-private-state-provider": "^4.1.1", - "@midnight-ntwrk/midnight-js-node-zk-config-provider": "^4.1.1", - "@midnightntwrk/wallet-sdk": "^1.2.0", + "@midnight-ntwrk/compact-js": "2.5.5-rc.8", + "@midnight-ntwrk/compact-runtime": "0.19.0", + "@midnight-ntwrk/midnight-js": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-http-client-proof-provider": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-indexer-public-data-provider": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-level-private-state-provider": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-node-zk-config-provider": "5.0.0-beta.7", + "@midnightntwrk/ledger-v9": "1.0.0-rc.3", + "@midnightntwrk/wallet-sdk": "2.0.0-beta.2", "buffer": "^6.0.3", "rxjs": "^7.8.1", "ws": "^8.19.0", @@ -29,16 +29,16 @@ }, }, "overrides": { - "@midnight-ntwrk/compact-js": "2.5.1", - "@midnight-ntwrk/ledger-v8": "8.1.0", - "@midnight-ntwrk/onchain-runtime-v3": "3.0.0", + "@midnight-ntwrk/compact-runtime": "0.19.0", + "@midnightntwrk/ledger-v9": "1.0.0-rc.3", + "@midnightntwrk/onchain-runtime-v4": "4.0.0-rc.3", }, "packages": { "@apollo/client": ["@apollo/client@4.2.12", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", "@wry/equality": "^0.5.6", "@wry/trie": "^0.5.0", "graphql-tag": "^2.12.6", "optimism": "^0.18.0", "tslib": "^2.3.0" }, "peerDependencies": { "graphql": "^16.0.0 || ^17.0.0", "graphql-ws": "^5.5.5 || ^6.0.3", "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc", "react-dom": "^17.0.0 || ^18.0.0 || >=19.0.0-rc", "rxjs": "^7.3.0", "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" }, "optionalPeers": ["graphql-ws", "react", "react-dom", "subscriptions-transport-ws"] }, "sha512-+KS+LM/gZ58z92p9owZZpI54yCc27KfUi1HOtLrxmxz9kDIqUcp/zh+mNjCWCbNZkWGzWslvbbmXGGtTWT8nkw=="], "@balena/dockerignore": ["@balena/dockerignore@1.0.2", "", {}, "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q=="], - "@effect/platform": ["@effect/platform@0.95.0", "", { "dependencies": { "find-my-way-ts": "^0.1.6", "msgpackr": "^1.11.4", "multipasta": "^0.2.7" }, "peerDependencies": { "effect": "^3.20.0" } }, "sha512-WDlRiWRSWlmhCPq09bvAofK0qr5vM4yNklXjoJdZHmugKRRTpN/Okn3ODnjgM/Kb/4hjMrRyrsUeH/Brieq7KA=="], + "@effect/platform": ["@effect/platform@0.97.1", "", { "dependencies": { "find-my-way-ts": "^0.1.6", "msgpackr": "^1.11.10", "multipasta": "^0.2.8" }, "peerDependencies": { "effect": "^3.22.1" } }, "sha512-IevWxwmrxCdeXxbXDx/hiOstHtERRigd1nhZSuHgiFEl7NkBmS/5GVWsRacq4NfJN2uCXqggETKNwij15VEpew=="], "@graphql-typed-document-node/core": ["@graphql-typed-document-node/core@3.2.0", "", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="], @@ -54,67 +54,65 @@ "@kwsites/file-exists": ["@kwsites/file-exists@1.1.1", "", { "dependencies": { "debug": "^4.1.1" } }, "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw=="], - "@midnight-ntwrk/compact-js": ["@midnight-ntwrk/compact-js@2.5.1", "", { "dependencies": { "@effect/platform": "^0.95.0", "@midnight-ntwrk/compact-runtime": "0.16.0", "@midnight-ntwrk/ledger-v8": "^8.0.3", "@midnight-ntwrk/platform-js": "^2.2.4", "effect": "^3.20.0", "tslib": "^2.8.1" } }, "sha512-UO0+tDiRadYFO2kaUu9PIhAOISvDKvmiyh9vSOyKEZLj3AUAY1qmmHm/oQrzPqrkiWHO0Rnln/j/zZ5dvc5vxg=="], + "@midnight-ntwrk/compact-js": ["@midnight-ntwrk/compact-js@2.5.5-rc.8", "", { "dependencies": { "@effect/platform": "^0.97.0", "@midnight-ntwrk/compact-runtime": "0.19.0-rc.0", "@midnight-ntwrk/platform-js": "^3.0.0", "@midnightntwrk/ledger-v9": "^1.0.0-rc.3", "@noble/hashes": "^2.3.0", "effect": "^3.22.1", "tslib": "^2.8.1" } }, "sha512-7CGWGCTL+8IvqFUI/srHRwAWxGVLD2ytHLjSyvOcNi6UX1QLeG5vUtGlXQAKSJXvjPwndosqIFdW39OgkNH/Mg=="], - "@midnight-ntwrk/compact-runtime": ["@midnight-ntwrk/compact-runtime@0.16.0", "", { "dependencies": { "@midnight-ntwrk/onchain-runtime-v3": "^3.0.0", "@types/object-inspect": "^1.8.1", "object-inspect": "^1.12.3" } }, "sha512-UR8+MI5zol+gkne17ZZru8xmZNf11xMgQJkiLT9KWsF+QD8Wuz1WONaqQLL0RAZ2aN2XlRsBFd0ViKDVh8prFw=="], + "@midnight-ntwrk/compact-runtime": ["@midnight-ntwrk/compact-runtime@0.19.0", "", { "dependencies": { "@midnightntwrk/onchain-runtime-v4": "^4.0.0-rc.3", "@noble/curves": "^2.2.0", "@noble/hashes": "^2.0.1", "@types/object-inspect": "^1.8.1", "object-inspect": "^1.12.3" } }, "sha512-0q1ZOlyPdCCEasAxlHxagO6Sb+Db5GM6qYPQ+c+cp71NRxQgiY0Wd0/LIoshQTs+OBISb4XTjiNQ1lxcKR79qQ=="], - "@midnight-ntwrk/ledger-v8": ["@midnight-ntwrk/ledger-v8@8.1.0", "", {}, "sha512-rwOVP5kBwACpYmmY6+oLeaiM3e5gHscRMjbZUOntOC5QdtqLdpeep6eQW1OngI+sxjjdVoGg2eE16sLf+DAHmQ=="], + "@midnight-ntwrk/midnight-js": ["@midnight-ntwrk/midnight-js@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/midnight-js-contracts": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-network-id": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-types": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-utils": "5.0.0-beta.7" } }, "sha512-viRsVlcc+pgk7a9RZGXt1NleJsCzYLninrTM6t8T8rcoycE8wvM+TBuI0Tu/AlK4OJE4G384DOHSfIGpR5FQzw=="], - "@midnight-ntwrk/midnight-js": ["@midnight-ntwrk/midnight-js@4.1.1", "", { "dependencies": { "@midnight-ntwrk/midnight-js-contracts": "4.1.1", "@midnight-ntwrk/midnight-js-network-id": "4.1.1", "@midnight-ntwrk/midnight-js-protocol": "4.1.1", "@midnight-ntwrk/midnight-js-types": "4.1.1", "@midnight-ntwrk/midnight-js-utils": "4.1.1" } }, "sha512-n6g3+NA3umlZ0FT/lU7VktKyhaYcJsrh3Jcr50pHkUZw5wMqy0gncWZklQmp8qU8F6/igy5LywKZ30PIL3wOHA=="], + "@midnight-ntwrk/midnight-js-contracts": ["@midnight-ntwrk/midnight-js-contracts@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/midnight-js-network-id": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-types": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-utils": "5.0.0-beta.7", "effect": "^3.22.1" } }, "sha512-dWM+u2SEShctUb6BvR38wiXWPr4JkYAughEM33RpthP+mnqGP+C5oOq9FOPLzdKvlYg6Ne5Fk+OMiJjaG0AZQg=="], - "@midnight-ntwrk/midnight-js-contracts": ["@midnight-ntwrk/midnight-js-contracts@4.1.1", "", { "dependencies": { "@midnight-ntwrk/midnight-js-network-id": "4.1.1", "@midnight-ntwrk/midnight-js-protocol": "4.1.1", "@midnight-ntwrk/midnight-js-types": "4.1.1", "@midnight-ntwrk/midnight-js-utils": "4.1.1" } }, "sha512-vHeKyaj9RXTx+Cep3YpIRgg2EWkzibO4gxI7k/rYpXmGXc3waetrR5sb9FPR7v9SUX00/zf/sYbLp1NZhwZbjg=="], + "@midnight-ntwrk/midnight-js-http-client-proof-provider": ["@midnight-ntwrk/midnight-js-http-client-proof-provider@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/midnight-js-contracts": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-network-id": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-types": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-utils": "5.0.0-beta.7", "cross-fetch": "^4.1.0", "fetch-retry": "^6.0.0" } }, "sha512-mFbSjPJrJ1Ju60lI/Gth497kQy+c+Qa5SxM4jvMLW8pbKg1IHN8KIsQJQfGnw7NyAgqtsY6CfT+UMOmuzr9QMg=="], - "@midnight-ntwrk/midnight-js-http-client-proof-provider": ["@midnight-ntwrk/midnight-js-http-client-proof-provider@4.1.1", "", { "dependencies": { "@midnight-ntwrk/midnight-js-contracts": "4.1.1", "@midnight-ntwrk/midnight-js-network-id": "4.1.1", "@midnight-ntwrk/midnight-js-protocol": "4.1.1", "@midnight-ntwrk/midnight-js-types": "4.1.1", "@midnight-ntwrk/midnight-js-utils": "4.1.1", "cross-fetch": "^4.1.0", "fetch-retry": "^6.0.0" } }, "sha512-Q2VNRTvuWlf3MbjV7C3asuLHeFwtZMdh6t5Z+u8c8RDpejW9GhKaSjlJ2zgJII5ckE8/cocPEDwt3GKBebGHWA=="], + "@midnight-ntwrk/midnight-js-indexer-public-data-provider": ["@midnight-ntwrk/midnight-js-indexer-public-data-provider@5.0.0-beta.7", "", { "dependencies": { "@apollo/client": "^4.2.5", "@graphql-typed-document-node/core": "^3.2.0", "@midnight-ntwrk/midnight-js-network-id": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-types": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-utils": "5.0.0-beta.7", "buffer": "^6.0.3", "cross-fetch": "^4.1.0", "graphql": "^17.0.1", "graphql-ws": "^6.0.8", "isomorphic-ws": "^5.0.0", "rxjs": "^7.8.2", "ws": "^8.20.0" } }, "sha512-rjKG5U1bbjOD4acVia81hrobBVj8xovp1IA++RL4SVE75lveFekqNaZO+Y0Z6RbZwEjVBbmPOAD4jChdFuSFkQ=="], - "@midnight-ntwrk/midnight-js-indexer-public-data-provider": ["@midnight-ntwrk/midnight-js-indexer-public-data-provider@4.1.1", "", { "dependencies": { "@apollo/client": "^4.2.0", "@graphql-typed-document-node/core": "^3.2.0", "@midnight-ntwrk/midnight-js-network-id": "4.1.1", "@midnight-ntwrk/midnight-js-protocol": "4.1.1", "@midnight-ntwrk/midnight-js-types": "4.1.1", "@midnight-ntwrk/midnight-js-utils": "4.1.1", "buffer": "^6.0.3", "cross-fetch": "^4.1.0", "graphql": "^16.14.0", "graphql-ws": "^6.0.8", "isomorphic-ws": "^5.0.0", "rxjs": "^7.8.2", "ws": "^8.20.0" } }, "sha512-50CjiYqw/msRintyfkuNrJl1v4Zj+AaBFmV2uLjY/zpkPop4VBFH4QZSrtKsG1ljT9vzWsxU7Eo4Tn1tgKkPlA=="], + "@midnight-ntwrk/midnight-js-level-private-state-provider": ["@midnight-ntwrk/midnight-js-level-private-state-provider@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-types": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-utils": "5.0.0-beta.7", "@noble/ciphers": "^2.2.0", "@noble/hashes": "^2.2.0", "abstract-level": "^3.1.1", "buffer": "^6.0.3", "level": "^10.0.0", "superjson": "^2.2.6" } }, "sha512-O3eLwjltjAkXVeXiKyot2aiM43POGtiem2DhtAD4gfsGbWVPGQ//yFyMDsS92h2eb4eJma9wpUqdmAXzs5ilxQ=="], - "@midnight-ntwrk/midnight-js-level-private-state-provider": ["@midnight-ntwrk/midnight-js-level-private-state-provider@4.1.1", "", { "dependencies": { "@midnight-ntwrk/midnight-js-protocol": "4.1.1", "@midnight-ntwrk/midnight-js-types": "4.1.1", "@midnight-ntwrk/midnight-js-utils": "4.1.1", "@noble/ciphers": "^2.2.0", "@noble/hashes": "^2.2.0", "abstract-level": "^3.1.1", "buffer": "^6.0.3", "level": "^10.0.0", "superjson": "^2.2.6" } }, "sha512-i+1lXJ4rcRGERnOPXHc3/Oh5ef7X/yb6p51bOAUjITazdPPcuU8qTeTeFgX+lPhWTGxROb9/pgrrVPH9G0FxSw=="], + "@midnight-ntwrk/midnight-js-network-id": ["@midnight-ntwrk/midnight-js-network-id@5.0.0-beta.7", "", {}, "sha512-S51x/aRibCViA+4NdjYImdCHSCltJCCnI0K3K0ZqoAQc6d4b+KfIK1aSvo0cU1k1bdJwQhcgohhWH6Z5GxEHBQ=="], - "@midnight-ntwrk/midnight-js-network-id": ["@midnight-ntwrk/midnight-js-network-id@4.1.1", "", {}, "sha512-g49IBK0In1Jt2wKgi18rUvoy1ShGVrfb/VvgWALkc9Noc6+4MX5NTLVg5zqu+CyO2waIGb5lqDPnAhTD9wPAOQ=="], + "@midnight-ntwrk/midnight-js-node-zk-config-provider": ["@midnight-ntwrk/midnight-js-node-zk-config-provider@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/midnight-js-types": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-utils": "5.0.0-beta.7" } }, "sha512-PkOKC0awUkLzHE9rALoLmEBTdQQflpeCGL2Vu1JpB627sK9vRw8MY7qiZbH8MCp1PQUVMK5VpVGc/awaqQkAnA=="], - "@midnight-ntwrk/midnight-js-node-zk-config-provider": ["@midnight-ntwrk/midnight-js-node-zk-config-provider@4.1.1", "", { "dependencies": { "@midnight-ntwrk/midnight-js-types": "4.1.1", "@midnight-ntwrk/midnight-js-utils": "4.1.1" } }, "sha512-fbBhLBhU/BjrQRnRJCcmKkhYRLlSqJyXEhq72vMS6vlKXprmDmAjlVV62+bn1aiAlNY9FXl1rrrMUFKQUmuZFg=="], + "@midnight-ntwrk/midnight-js-protocol": ["@midnight-ntwrk/midnight-js-protocol@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/compact-js": "2.5.5-rc.8", "@midnight-ntwrk/compact-runtime": "0.19.0-rc.0", "@midnight-ntwrk/platform-js": "3.0.0", "@midnightntwrk/ledger-v9": "1.0.0-rc.3", "@midnightntwrk/onchain-runtime-v4": "4.0.0-rc.3" } }, "sha512-XwcAiVjEvXqpbp58oZnYq3/TCs1lduN8YHxbRKB4EvltxkpptaHr2fE78MMndpvSDGEgernJreAKO0VYDOACCA=="], - "@midnight-ntwrk/midnight-js-protocol": ["@midnight-ntwrk/midnight-js-protocol@4.1.1", "", { "dependencies": { "@midnight-ntwrk/compact-js": "2.5.1", "@midnight-ntwrk/compact-runtime": "0.16.0", "@midnight-ntwrk/ledger-v8": "8.1.0", "@midnight-ntwrk/onchain-runtime-v3": "3.0.0", "@midnight-ntwrk/platform-js": "2.2.4" } }, "sha512-JH1010ir3YrawKsA4C08aIXWpFGHrCrAaBkZFbn+xh+iwOX5Ss0WU4//mDSEnHvQN0wD6GTc2JwUfKYFaS2CcA=="], + "@midnight-ntwrk/midnight-js-types": ["@midnight-ntwrk/midnight-js-types@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.7", "effect": "^3.22.1", "pino": "^10.3.1", "rxjs": "^7.8.2" } }, "sha512-dZMW1DWgvyOPuuSCaEAx6pOYQomT+YYHFrDk9pjPSSRG/3qhe8PKtc2DYFRu9t8E4xy7FkZM8A2EW/S8auf5JQ=="], - "@midnight-ntwrk/midnight-js-types": ["@midnight-ntwrk/midnight-js-types@4.1.1", "", { "dependencies": { "@midnight-ntwrk/midnight-js-protocol": "4.1.1", "effect": "^3.20.0", "pino": "^10.3.1", "rxjs": "^7.8.2" } }, "sha512-MPT7YToXN2EsDtOOVSJonYZSZ4eqmdVgftBfH56w+tmZM0sZt9u+Mq18uuBQl9ebpTXnp8o7WqeISbgPMxTBcQ=="], + "@midnight-ntwrk/midnight-js-utils": ["@midnight-ntwrk/midnight-js-utils@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/midnight-js-network-id": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.7", "@midnightntwrk/wallet-sdk-address-format": "4.0.0-beta.2", "@noble/hashes": "^2.2.0" } }, "sha512-mZwdEL/o38yeFp+ba3Uil6xuxFPAC9bplMVoP6Cs6C5gycVaeWkW1h+7wDEKGDcJ2qImfi7egNDHs+u+PbHWTg=="], - "@midnight-ntwrk/midnight-js-utils": ["@midnight-ntwrk/midnight-js-utils@4.1.1", "", { "dependencies": { "@midnight-ntwrk/midnight-js-network-id": "4.1.1", "@midnight-ntwrk/midnight-js-protocol": "4.1.1", "@midnight-ntwrk/wallet-sdk-address-format": "^3.1.0" } }, "sha512-b65QADd2FaZbWXe9D3fe9mSGmPlP1DTRMGSruJqhl9fOTNxBhQIzIKs0j/eL9Kv77dVeGDYgQdbV+JkDj3j5Qg=="], + "@midnight-ntwrk/platform-js": ["@midnight-ntwrk/platform-js@3.0.0", "", { "dependencies": { "@effect/platform": "^0.96.1", "effect": "^3.21.0", "tslib": "^2.8.1" } }, "sha512-cAOpmWURUELDKmcNf8/mZjDtxkqg6ShjV6v0KY7mmwMWkieDEERq/TRmK5cMJgUqMi6nCWjwLZqOmPB07B8Y4A=="], - "@midnight-ntwrk/onchain-runtime-v3": ["@midnight-ntwrk/onchain-runtime-v3@3.0.0", "", {}, "sha512-HbFbUOsvgpEFy1OT0Ni2LMFk4jnMQS1em+H+Mof/B3DpnNKl0Lkx5QiulKOc6pyU4KPEagOqx4fYNyVXFwgZ7g=="], - - "@midnight-ntwrk/platform-js": ["@midnight-ntwrk/platform-js@2.2.4", "", { "dependencies": { "@effect/platform": "^0.95.0", "effect": "^3.20.0", "tslib": "^2.8.1" } }, "sha512-6mrYKSSE8kPgn/5rQ2xofDJk1yAZZRdLOO6Yelweuh5GOnOGz7Qw4venDG/c4TRqtV9ouFp+F5j7ta8aprMinw=="], + "@midnight-ntwrk/zkir-v2": ["@midnight-ntwrk/zkir-v2@2.1.0", "", {}, "sha512-UDMujjzCt0SA89uqOFWUL4LZTkxVAS8JjvOaYMAgxlSrWfN7m5th1R1qGlpDJuSH39rbWt6WwtuK3k08Mta6LA=="], - "@midnight-ntwrk/wallet-sdk-address-format": ["@midnight-ntwrk/wallet-sdk-address-format@3.1.2", "", { "dependencies": { "@midnight-ntwrk/ledger-v8": "^8.1.0", "@scure/base": "^2.0.0", "@subsquid/scale-codec": "^4.0.1" } }, "sha512-SRkgwmKFOZSUR25iurAB8U7kTKF7AljSl+tMkuuj8Pthc/l0yIg+/q1rFSozJ0Nz9FJRhshazDyrL0l84fOabg=="], + "@midnightntwrk/ledger-v9": ["@midnightntwrk/ledger-v9@1.0.0-rc.3", "", {}, "sha512-i/Cl/d2XQ19gIm5SCruMHr+XiruxIn9Ec3i15DrZ/44Yggzu1u5+dG7QUx7Rw1htkgALXivEt7Kw4NzxPr4pBw=="], - "@midnight-ntwrk/zkir-v2": ["@midnight-ntwrk/zkir-v2@2.1.0", "", {}, "sha512-UDMujjzCt0SA89uqOFWUL4LZTkxVAS8JjvOaYMAgxlSrWfN7m5th1R1qGlpDJuSH39rbWt6WwtuK3k08Mta6LA=="], + "@midnightntwrk/onchain-runtime-v4": ["@midnightntwrk/onchain-runtime-v4@4.0.0-rc.3", "", {}, "sha512-LAf4g3vgwtPqActbi5RAoZcfYduqnFqtsHN+i1s/Mcb5vi2yMbPmpSOJ0YCCIGb2S/qY7G5tQARHVD0PJyHSNA=="], - "@midnightntwrk/wallet-sdk": ["@midnightntwrk/wallet-sdk@1.2.0", "", { "dependencies": { "@midnightntwrk/wallet-sdk-abstractions": "^2.1.0", "@midnightntwrk/wallet-sdk-address-format": "^3.1.2", "@midnightntwrk/wallet-sdk-capabilities": "^3.3.1", "@midnightntwrk/wallet-sdk-dust-wallet": "^4.2.0", "@midnightntwrk/wallet-sdk-facade": "^4.1.0", "@midnightntwrk/wallet-sdk-hd": "^3.0.3", "@midnightntwrk/wallet-sdk-indexer-client": "^1.2.3", "@midnightntwrk/wallet-sdk-node-client": "^1.1.3", "@midnightntwrk/wallet-sdk-prover-client": "^1.2.3", "@midnightntwrk/wallet-sdk-runtime": "^1.0.5", "@midnightntwrk/wallet-sdk-shielded": "^3.0.2", "@midnightntwrk/wallet-sdk-unshielded-wallet": "^3.1.0", "@midnightntwrk/wallet-sdk-utilities": "^1.2.0" } }, "sha512-bG/RuW/pJphSuBN0xqmFcVqiXClXdKbubyRQA0XUPK7InoibMMNzXoAto8T2iRqcpKRzRpffvG5U/s6sij0rEg=="], + "@midnightntwrk/wallet-sdk": ["@midnightntwrk/wallet-sdk@2.0.0-beta.2", "", { "dependencies": { "@midnightntwrk/wallet-sdk-abstractions": "3.0.0-beta.0", "@midnightntwrk/wallet-sdk-address-format": "4.0.0-beta.2", "@midnightntwrk/wallet-sdk-capabilities": "4.0.0-beta.2", "@midnightntwrk/wallet-sdk-dust-wallet": "5.0.0-beta.2", "@midnightntwrk/wallet-sdk-facade": "5.0.0-beta.2", "@midnightntwrk/wallet-sdk-hd": "3.1.0-beta.1", "@midnightntwrk/wallet-sdk-indexer-client": "1.3.0-beta.1", "@midnightntwrk/wallet-sdk-node-client": "2.0.0-beta.2", "@midnightntwrk/wallet-sdk-prover-client": "2.0.0-beta.2", "@midnightntwrk/wallet-sdk-runtime": "1.0.6-beta.0", "@midnightntwrk/wallet-sdk-shielded": "4.0.0-beta.2", "@midnightntwrk/wallet-sdk-unshielded-wallet": "4.0.0-beta.2", "@midnightntwrk/wallet-sdk-utilities": "1.2.0" } }, "sha512-XL0ZG7NuswssFnsJYlJzf7AcBizBF14Da67KhRegLFLuDb0OYj3ZQNNR/c3q+2KXoJ7TJ5s75hhPMsWfBZWakg=="], - "@midnightntwrk/wallet-sdk-abstractions": ["@midnightntwrk/wallet-sdk-abstractions@2.1.0", "", { "dependencies": { "effect": "^3.19.19" } }, "sha512-56ErAc2eoJIICFXCe64x1uM0Xw6xfAoZwDqN1Nks5ZrQQvmPrNArS3s4SOEXhSR9X9TJ66T2KBx6M/jepyesfg=="], + "@midnightntwrk/wallet-sdk-abstractions": ["@midnightntwrk/wallet-sdk-abstractions@3.0.0-beta.0", "", { "dependencies": { "effect": "^3.19.19" } }, "sha512-9gzVaSd9dk1rymqd6CrqSSNGPoMtIbr24wVSwCfuB3L1y9wcNgzCw9l/RH744XJE+4RyDZODEIWo7WU5LCYvNw=="], - "@midnightntwrk/wallet-sdk-address-format": ["@midnightntwrk/wallet-sdk-address-format@3.1.2", "", { "dependencies": { "@midnight-ntwrk/ledger-v8": "^8.1.0", "@scure/base": "^2.0.0", "@subsquid/scale-codec": "^4.0.1" } }, "sha512-1eXt4eazKoT6C88/yy++fpxIBhF0o6iSqplc6DuCzNL0uePn7Opg0hiTIap2oEmC25XVXmzPhUa0xiWJzv3TIw=="], + "@midnightntwrk/wallet-sdk-address-format": ["@midnightntwrk/wallet-sdk-address-format@4.0.0-beta.2", "", { "dependencies": { "@midnightntwrk/ledger-v9": "1.0.0-rc.3", "@scure/base": "^2.0.0", "@subsquid/scale-codec": "^4.0.1" } }, "sha512-yK4jlntQ0Pgks8dKrPx6J7IMdzIznEYZ4yO9/msIJrn2IM4o1d8+MEh07OMFvZ9ui1YNQB272aUv5muopBCrdA=="], - "@midnightntwrk/wallet-sdk-capabilities": ["@midnightntwrk/wallet-sdk-capabilities@3.3.1", "", { "dependencies": { "@midnight-ntwrk/ledger-v8": "^8.1.0", "@midnight-ntwrk/zkir-v2": "^2.1.0", "@midnightntwrk/wallet-sdk-abstractions": "^2.1.0", "@midnightntwrk/wallet-sdk-indexer-client": "^1.2.2", "@midnightntwrk/wallet-sdk-node-client": "^1.1.2", "@midnightntwrk/wallet-sdk-prover-client": "^1.2.2", "@midnightntwrk/wallet-sdk-utilities": "^1.2.0", "effect": "^3.19.19", "rxjs": "^7.8.2" } }, "sha512-DpM9kkwFdAr/0Z0G62qL9U8hG5SOYMtwiPqbStvNhk97E2gGwmu5Yu0Zrdm9PDxCYjWgsudAdnVt0WxE8auUGA=="], + "@midnightntwrk/wallet-sdk-capabilities": ["@midnightntwrk/wallet-sdk-capabilities@4.0.0-beta.2", "", { "dependencies": { "@midnight-ntwrk/zkir-v2": "^2.1.0", "@midnightntwrk/ledger-v9": "1.0.0-rc.3", "@midnightntwrk/wallet-sdk-abstractions": "3.0.0-beta.0", "@midnightntwrk/wallet-sdk-indexer-client": "1.3.0-beta.1", "@midnightntwrk/wallet-sdk-node-client": "2.0.0-beta.2", "@midnightntwrk/wallet-sdk-prover-client": "2.0.0-beta.2", "@midnightntwrk/wallet-sdk-utilities": "1.2.0", "effect": "^3.19.19", "rxjs": "^7.8.2" } }, "sha512-QoeautcgfOgUMzbU5JAqhVP7n8K8fNdpQgoOwDwIdjJGpP+mH0f2/QtGia373OVTt1olf3cQN+7bLL9B0ihvlg=="], - "@midnightntwrk/wallet-sdk-dust-wallet": ["@midnightntwrk/wallet-sdk-dust-wallet@4.2.0", "", { "dependencies": { "@midnight-ntwrk/ledger-v8": "^8.1.0", "@midnightntwrk/wallet-sdk-abstractions": "^2.1.0", "@midnightntwrk/wallet-sdk-address-format": "^3.1.2", "@midnightntwrk/wallet-sdk-capabilities": "^3.3.1", "@midnightntwrk/wallet-sdk-indexer-client": "^1.2.3", "@midnightntwrk/wallet-sdk-runtime": "^1.0.5", "@midnightntwrk/wallet-sdk-utilities": "^1.2.0", "effect": "^3.19.19", "rxjs": "^7.8.2" } }, "sha512-L8BfDPfxh9AG/IPvlfqky8Y81Vg/9jYZ0w4UqYWxH5TNnzq6BwZHVGZTYc/iQLq02NwaGPtbrzePMXpH2gF0CA=="], + "@midnightntwrk/wallet-sdk-dust-wallet": ["@midnightntwrk/wallet-sdk-dust-wallet@5.0.0-beta.2", "", { "dependencies": { "@midnightntwrk/ledger-v9": "1.0.0-rc.3", "@midnightntwrk/wallet-sdk-abstractions": "3.0.0-beta.0", "@midnightntwrk/wallet-sdk-address-format": "4.0.0-beta.2", "@midnightntwrk/wallet-sdk-capabilities": "4.0.0-beta.2", "@midnightntwrk/wallet-sdk-indexer-client": "1.3.0-beta.1", "@midnightntwrk/wallet-sdk-runtime": "1.0.6-beta.0", "@midnightntwrk/wallet-sdk-utilities": "1.2.0", "effect": "^3.19.19", "rxjs": "^7.8.2" } }, "sha512-ILtpnmrx5mkMbDDAt1Az0qAdev3CtbTSsjk0PHh6sIowiaooQBSJ1GH043unYkpUj++OLlTcS2Dwf1VT2ya0oA=="], - "@midnightntwrk/wallet-sdk-facade": ["@midnightntwrk/wallet-sdk-facade@4.1.0", "", { "dependencies": { "@midnight-ntwrk/ledger-v8": "^8.1.0", "@midnightntwrk/wallet-sdk-abstractions": "^2.1.0", "@midnightntwrk/wallet-sdk-address-format": "^3.1.2", "@midnightntwrk/wallet-sdk-capabilities": "^3.3.1", "@midnightntwrk/wallet-sdk-dust-wallet": "^4.2.0", "@midnightntwrk/wallet-sdk-indexer-client": "^1.2.3", "@midnightntwrk/wallet-sdk-shielded": "^3.0.2", "@midnightntwrk/wallet-sdk-unshielded-wallet": "^3.1.0", "rxjs": "^7.8.2" } }, "sha512-GH/iqokeXgazvyYnxVU6S2EWD/fJRxqkB+MNlsk04siyEKEj+jhFFyTsg+loHqGQ9P+9I9xA5k1+rFpTLhI5VA=="], + "@midnightntwrk/wallet-sdk-facade": ["@midnightntwrk/wallet-sdk-facade@5.0.0-beta.2", "", { "dependencies": { "@midnightntwrk/ledger-v9": "1.0.0-rc.3", "@midnightntwrk/wallet-sdk-abstractions": "3.0.0-beta.0", "@midnightntwrk/wallet-sdk-address-format": "4.0.0-beta.2", "@midnightntwrk/wallet-sdk-capabilities": "4.0.0-beta.2", "@midnightntwrk/wallet-sdk-dust-wallet": "5.0.0-beta.2", "@midnightntwrk/wallet-sdk-indexer-client": "1.3.0-beta.1", "@midnightntwrk/wallet-sdk-shielded": "4.0.0-beta.2", "@midnightntwrk/wallet-sdk-unshielded-wallet": "4.0.0-beta.2", "effect": "^3.19.19", "rxjs": "^7.8.2" } }, "sha512-iDtxlilzBz2oPRJkGaktLS5hUkNXLwAZovYv99XLpoSg/+QYGpX3zWhFW5+OUV3kt9QYFLDSilRKdmtXa+WHJQ=="], - "@midnightntwrk/wallet-sdk-hd": ["@midnightntwrk/wallet-sdk-hd@3.0.3", "", { "dependencies": { "@scure/bip32": "^2.0.1", "@scure/bip39": "^2.0.1" } }, "sha512-HDRKZdLvgNS9UkKw1W9V+XBCMpiwnBQl/4wyhu8KXy5sXgSRgN35qslrnzM9WtAQP6BzKek2vw7Dk/M8EZC5DA=="], + "@midnightntwrk/wallet-sdk-hd": ["@midnightntwrk/wallet-sdk-hd@3.1.0-beta.1", "", { "dependencies": { "@scure/bip32": "^2.0.1", "@scure/bip39": "^2.0.1" } }, "sha512-zQCucKVf7BXmTA6Clf5yHUsNspAiV0q+noEZVvHxd2yQTS6pXBmibUZ0wBWs1KG3V2tCfBllzoil7rS+L82IRQ=="], - "@midnightntwrk/wallet-sdk-indexer-client": ["@midnightntwrk/wallet-sdk-indexer-client@1.2.3", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.2.0", "@midnightntwrk/wallet-sdk-utilities": "^1.2.0", "effect": "^3.19.19", "graphql": "^16.13.0", "graphql-http": "^1.22.4", "graphql-ws": "^6.0.7" } }, "sha512-iJ2FV33XxFqsoEYBICopsVDREoA8LkkTo+UKB1yx1GpAWe4B8I0TT+6Iyj0zX19LyEVm7dP5IpVROlOhWw9L3g=="], + "@midnightntwrk/wallet-sdk-indexer-client": ["@midnightntwrk/wallet-sdk-indexer-client@1.3.0-beta.1", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.2.0", "@midnightntwrk/wallet-sdk-utilities": "1.2.0", "effect": "^3.19.19", "graphql": "^17.0.0", "graphql-http": "^1.22.4", "graphql-ws": "^6.0.7" } }, "sha512-Kn3RT3kpRlyTAmN9xhV98q8k8ZiLE40zOGte/++tHHE2k69jtCFNWHlKlJXTDpmFVBqGmJFb8Ih658n4xGgdJg=="], - "@midnightntwrk/wallet-sdk-node-client": ["@midnightntwrk/wallet-sdk-node-client@1.1.3", "", { "dependencies": { "@midnightntwrk/wallet-sdk-abstractions": "^2.1.0", "@midnightntwrk/wallet-sdk-utilities": "^1.2.0", "@polkadot/api": "^16.5.4", "@polkadot/types": "^16.5.4", "@polkadot/util": "^14.0.1", "@types/bn.js": "^5.2.0", "bn.js": "^5.2.3", "effect": "^3.19.19" }, "peerDependencies": { "@midnight-ntwrk/ledger-v8": "^8.1.0", "@midnightntwrk/wallet-sdk-prover-client": "^1.2.3" }, "optionalPeers": ["@midnight-ntwrk/ledger-v8", "@midnightntwrk/wallet-sdk-prover-client"] }, "sha512-ijf3EjDyuBxla2zl3yp/4CD5hsg10M61K8n033lRi7aC7kvUarbrIxUJQz4dgJQ0J73rGRDLyJi1D0II++FmVg=="], + "@midnightntwrk/wallet-sdk-node-client": ["@midnightntwrk/wallet-sdk-node-client@2.0.0-beta.2", "", { "dependencies": { "@midnightntwrk/wallet-sdk-abstractions": "3.0.0-beta.0", "@midnightntwrk/wallet-sdk-utilities": "1.2.0", "@polkadot/api": "^16.5.4", "@polkadot/types": "^16.5.4", "@polkadot/util": "^14.0.1", "@types/bn.js": "^5.2.0", "bn.js": "^5.2.3", "effect": "^3.19.19" }, "peerDependencies": { "@midnightntwrk/ledger-v9": "1.0.0-rc.3", "@midnightntwrk/wallet-sdk-prover-client": "2.0.0-beta.2" }, "optionalPeers": ["@midnightntwrk/ledger-v9", "@midnightntwrk/wallet-sdk-prover-client"] }, "sha512-jW9Mu37a1B9kpUSVAg0PTu7agPza4ffUCLS8rCAWDbAfa65xoECFXUH2FzWR95uxVPes8XY7+onNeBQN7ffJ3w=="], - "@midnightntwrk/wallet-sdk-prover-client": ["@midnightntwrk/wallet-sdk-prover-client@1.2.3", "", { "dependencies": { "@effect/platform": "^0.96.0", "@midnight-ntwrk/ledger-v8": "^8.1.0", "@midnight-ntwrk/zkir-v2": "^2.1.0", "@midnightntwrk/wallet-sdk-utilities": "^1.2.0", "effect": "^3.19.19", "web-worker": "^1.5.0" } }, "sha512-1gTpxRzFsXyZLcro0sBo7cgLXiHUbIgV/t/tTDDPwGeoPKX4pLP7go39XDxCtKhe1YjmKquVQ/Qtz7djpshgzw=="], + "@midnightntwrk/wallet-sdk-prover-client": ["@midnightntwrk/wallet-sdk-prover-client@2.0.0-beta.2", "", { "dependencies": { "@effect/platform": "^0.96.0", "@midnight-ntwrk/zkir-v2": "^2.1.0", "@midnightntwrk/ledger-v9": "1.0.0-rc.3", "@midnightntwrk/wallet-sdk-utilities": "1.2.0", "effect": "^3.19.19", "web-worker": "^1.5.0" } }, "sha512-hNHwsxRbg6HkkgTG4tE13ycKI1IwzMUVFLBgfLtt2/7TkbymyI9XkgollShNrcIQ5RzAg3WYX7d1sx9XIUxblA=="], - "@midnightntwrk/wallet-sdk-runtime": ["@midnightntwrk/wallet-sdk-runtime@1.0.5", "", { "dependencies": { "@midnightntwrk/wallet-sdk-abstractions": "^2.1.0", "@midnightntwrk/wallet-sdk-utilities": "^1.2.0", "effect": "^3.19.19", "rxjs": "^7.8.2" } }, "sha512-0CHGeenRGcm1SommH/fDIXPU4jdee2giNOTDepyO6l46b3nqemhb/drv8RIrc4UIbxATgPJIcWsLrRX/fEu0mQ=="], + "@midnightntwrk/wallet-sdk-runtime": ["@midnightntwrk/wallet-sdk-runtime@1.0.6-beta.0", "", { "dependencies": { "@midnightntwrk/wallet-sdk-abstractions": "3.0.0-beta.0", "@midnightntwrk/wallet-sdk-utilities": "1.2.0", "effect": "^3.19.19", "rxjs": "^7.8.2" } }, "sha512-4Q/hTopMvLaiyncaIFiWQVPvXBHOg8tgPq4Aqx9ta+smuiPFbCAZRq7ezA7PMmKYAEqWeqaY93oK98NmeKUakg=="], - "@midnightntwrk/wallet-sdk-shielded": ["@midnightntwrk/wallet-sdk-shielded@3.0.2", "", { "dependencies": { "@midnight-ntwrk/ledger-v8": "^8.1.0", "@midnightntwrk/wallet-sdk-abstractions": "^2.1.0", "@midnightntwrk/wallet-sdk-address-format": "^3.1.2", "@midnightntwrk/wallet-sdk-capabilities": "^3.3.1", "@midnightntwrk/wallet-sdk-indexer-client": "^1.2.3", "@midnightntwrk/wallet-sdk-runtime": "^1.0.5", "@midnightntwrk/wallet-sdk-utilities": "^1.2.0", "effect": "^3.19.19", "rxjs": "^7.8.2" } }, "sha512-zzYDKrOXL+igNivpjgJKiHd8USETgAZyOLR2u8nDupHvIsmDlxScxzJO/gULr8Mon3SiCYUkElls5p4aFKz3vg=="], + "@midnightntwrk/wallet-sdk-shielded": ["@midnightntwrk/wallet-sdk-shielded@4.0.0-beta.2", "", { "dependencies": { "@midnightntwrk/ledger-v9": "1.0.0-rc.3", "@midnightntwrk/wallet-sdk-abstractions": "3.0.0-beta.0", "@midnightntwrk/wallet-sdk-address-format": "4.0.0-beta.2", "@midnightntwrk/wallet-sdk-capabilities": "4.0.0-beta.2", "@midnightntwrk/wallet-sdk-indexer-client": "1.3.0-beta.1", "@midnightntwrk/wallet-sdk-runtime": "1.0.6-beta.0", "@midnightntwrk/wallet-sdk-utilities": "1.2.0", "effect": "^3.19.19", "rxjs": "^7.8.2" } }, "sha512-ecxajW6CS4+tNg0nMrofdwXzdhPCbpXADI1saMqP7bP9FJ3+BBIFfZtKIsHL+dN2RySa7+YOlFgeG4kzh/sIYA=="], - "@midnightntwrk/wallet-sdk-unshielded-wallet": ["@midnightntwrk/wallet-sdk-unshielded-wallet@3.1.0", "", { "dependencies": { "@midnight-ntwrk/ledger-v8": "^8.1.0", "@midnightntwrk/wallet-sdk-abstractions": "^2.1.0", "@midnightntwrk/wallet-sdk-address-format": "^3.1.2", "@midnightntwrk/wallet-sdk-capabilities": "^3.3.1", "@midnightntwrk/wallet-sdk-indexer-client": "^1.2.2", "@midnightntwrk/wallet-sdk-runtime": "^1.0.4", "@midnightntwrk/wallet-sdk-utilities": "^1.2.0", "effect": "^3.19.19", "rxjs": "^7.8.2" } }, "sha512-nqeo1W+81n36T2VoF5/TJcaeXYh5+QE716VwMD/DjQ42+xvVLD2XlckRuUWPzYrVcMRvxaB+Up94K5WVCE+E+w=="], + "@midnightntwrk/wallet-sdk-unshielded-wallet": ["@midnightntwrk/wallet-sdk-unshielded-wallet@4.0.0-beta.2", "", { "dependencies": { "@midnightntwrk/ledger-v9": "1.0.0-rc.3", "@midnightntwrk/wallet-sdk-abstractions": "3.0.0-beta.0", "@midnightntwrk/wallet-sdk-address-format": "4.0.0-beta.2", "@midnightntwrk/wallet-sdk-capabilities": "4.0.0-beta.2", "@midnightntwrk/wallet-sdk-indexer-client": "1.3.0-beta.1", "@midnightntwrk/wallet-sdk-runtime": "1.0.6-beta.0", "@midnightntwrk/wallet-sdk-utilities": "1.2.0", "effect": "^3.19.19", "rxjs": "^7.8.2" } }, "sha512-SBhXPqzEWUybgYO5iLdcPwy1jy2gP4viqTiaWHWGwdkr6kTO1nsXLgq2ZCteWuypbRyMnKhP28z+uGzsrtaZcg=="], - "@midnightntwrk/wallet-sdk-utilities": ["@midnightntwrk/wallet-sdk-utilities@1.2.1", "", { "dependencies": { "effect": "^3.19.19", "rxjs": "^7.8.2" } }, "sha512-sQr6mMGMxrjMjVsPZJHkBwjHLavJpqrdmNddUqS8lQcjmrMI8+Npc3eaOu4mRnJF+kZPfxRIiYaGnj5ccuo8Bw=="], + "@midnightntwrk/wallet-sdk-utilities": ["@midnightntwrk/wallet-sdk-utilities@1.2.0", "", { "dependencies": { "effect": "^3.19.19", "rxjs": "^7.8.2" } }, "sha512-Xh5uuCwg4FtAOQCYQ2wkBZtIEt0oCCt1mO3jHLnP+7cyMUQfMNbKwOVi85W3zq+84YFy5DVsN9xifFm75c1MQg=="], "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ=="], @@ -484,7 +482,7 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "graphql": ["graphql@16.14.2", "", {}, "sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA=="], + "graphql": ["graphql@17.0.2", "", {}, "sha512-FRWbddMxfkjiB7z+aQDWIR+E34xo9I8c9mtK2RPv8PmMzKRvrdsreHL/Ui/TmwHJfhHChEtsFPyMHKI+xuarQQ=="], "graphql-http": ["graphql-http@1.23.0", "", { "peerDependencies": { "graphql": ">=0.11 <=17" } }, "sha512-nQbRzoaqyNBVFG6X6r0mXC6S4X9eZOmmGz6t3l9H3MVKc2em3KeQAx+KhZKKFzj56ePDEncMOXeLu/hjO/4LQg=="], @@ -622,7 +620,7 @@ "pino-std-serializers": ["pino-std-serializers@7.1.0", "", {}, "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw=="], - "postcss": ["postcss@8.5.27", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-79Iho8QeYyooJ8e9lCRyTVlyTAkS/kXBYKff6TMzS3kEWGQ8Ds5UEtXpGrSUDLUWok6QTvxeYy0GO8fopHnaSA=="], + "postcss": ["postcss@8.5.28", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A=="], "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], @@ -786,6 +784,8 @@ "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + "@midnight-ntwrk/platform-js/@effect/platform": ["@effect/platform@0.96.3", "", { "dependencies": { "find-my-way-ts": "^0.1.6", "msgpackr": "^1.11.10", "multipasta": "^0.2.7" }, "peerDependencies": { "effect": "^3.21.5" } }, "sha512-LzvIj4HYE++TcTv/cVTCI/GRvQTV0ymwRmgjZMzNB5dU4OS05pTN36RKN0npiOm5orLJgw4yjIv1dNZoYGh/vg=="], + "@midnightntwrk/wallet-sdk-prover-client/@effect/platform": ["@effect/platform@0.96.3", "", { "dependencies": { "find-my-way-ts": "^0.1.6", "msgpackr": "^1.11.10", "multipasta": "^0.2.7" }, "peerDependencies": { "effect": "^3.21.5" } }, "sha512-LzvIj4HYE++TcTv/cVTCI/GRvQTV0ymwRmgjZMzNB5dU4OS05pTN36RKN0npiOm5orLJgw4yjIv1dNZoYGh/vg=="], "@polkadot-api/substrate-bindings/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], diff --git a/envs/docker-compose-dynamic.yml b/envs/docker-compose-dynamic.yml index 706efe7..006950f 100644 --- a/envs/docker-compose-dynamic.yml +++ b/envs/docker-compose-dynamic.yml @@ -1,6 +1,17 @@ +# Local `undeployed` devnet — the Midnight 2.x triple (ledger-v9 line). +# +# This is the `ledger-v9` branch's stack: node 2.0.0-rc.4 / indexer-standalone 4.4.0-rc.1 / +# proof-server 9.0.0-rc.5. (`main` runs the 1.x triple: 1.0.0 / 4.3.3 / 8.1.0.) Mirrors +# midnight-2-offers' `compose/core.yml`, so a contract proven here proves there too. +# +# Host ports stay ephemeral (`127.0.0.1::`) because testcontainers maps and reads +# them; nothing addresses another service by a host port. services: proof-server: - image: 'midnightntwrk/proof-server:${PROOF_TAG:-8.1.0}' + # PLAIN, not `_experimental`: this contract is compiled without `--feature-zkir-v3`, so + # its keys are tagged `midnight:verifier-key[v6]` = ProofVersioned::V2, which the plain + # image proves. The `_experimental` build is only needed for the zkir-v3 lane. + image: 'midnightntwrk/proof-server:${PROOF_TAG:-9.0.0-rc.5}' cap_drop: - ALL security_opt: @@ -14,37 +25,54 @@ services: # checks always fail. The helper waits on the listening port instead. indexer: - image: 'midnightntwrk/indexer-standalone:${INDEXER_TAG:-4.3.3}' + image: 'midnightntwrk/indexer-standalone:${INDEXER_TAG:-4.4.0-rc.1}' + # 4.4.0-rc.1 is published for linux/amd64 ONLY (no arm64 manifest entry), so on Apple + # Silicon this one service runs emulated while node and proof-server run native. + # Expect it to be the slowest service to come up. + platform: '${INDEXER_PLATFORM:-linux/amd64}' cap_drop: - ALL security_opt: - 'no-new-privileges:true' ports: - '127.0.0.1::8088' + volumes: + # config.yaml puts both sqlite files under /data (storage.cnn_url = /data/indexer.sqlite, + # ledger_db.cnn_url = /data/ledger-db.sqlite). + - indexer-data:/data environment: RUST_LOG: 'indexer=info,chain_indexer=info,indexer_api=info,wallet_indexer=info,indexer_common=info,fastrace_opentelemetry=off,info' APP__APPLICATION__NETWORK_ID: 'undeployed' APP__INFRA__NODE__URL: 'ws://node:9944' - APP__INFRA__STORAGE__PASSWORD: 'indexer' - APP__INFRA__PUB_SUB__PASSWORD: 'indexer' - APP__INFRA__LEDGER_STATE_STORAGE__PASSWORD: 'indexer' + # NOTE vs the 4.3.x stack on `main`: APP__INFRA__STORAGE__PASSWORD, + # APP__INFRA__PUB_SUB__PASSWORD and APP__INFRA__LEDGER_STATE_STORAGE__PASSWORD are GONE + # in 4.4 — standalone now uses embedded sqlite for all three, and supplying the old keys + # is at best inert. APP__INFRA__SECRET: '303132333435363738393031323334353637383930313233343536373839303132' + # indexer >=4.3 opens a SECOND (SPO) connection with its own URL. Left at the config + # default it dials ws://localhost:9944 inside this container, never connects, burns its + # reconnect budget and the WHOLE indexer exits after ~5 minutes. APP__INFRA__SPO_NODE__URL: 'ws://node:9944' + # Must be a non-empty string or startup fails outright. SPO features are unused here. APP__INFRA__SPO_NODE__BLOCKFROST_ID: 'e2e-test-dummy-id' + # Belt and braces for the same failure mode: cap the backoff so high that the reconnect + # budget (reconnect_max_attempts: 30) can never be exhausted during a test run. + APP__INFRA__SPO_NODE__RECONNECT_MAX_DELAY: '24h' healthcheck: # NOTE: the indexer-standalone image has neither curl nor wget, so an HTTP `/ready` probe can never pass and the # container stays "unhealthy" → testcontainers aborts startup. Use the file the indexer writes when running. test: ['CMD-SHELL', 'cat /var/run/indexer-standalone/running'] interval: 5s timeout: 5s - retries: 36 - start_period: 60s + # Emulated on arm64, so give it more room than the 4.3.3 stack needed. + retries: 60 + start_period: 30s depends_on: node: condition: service_healthy node: - image: 'midnightntwrk/midnight-node:${NODE_TAG:-1.0.0}' + image: 'midnightntwrk/midnight-node:${NODE_TAG:-2.0.0-rc.4}' cap_drop: - ALL cap_add: @@ -56,7 +84,9 @@ services: ports: - '127.0.0.1::9944' volumes: - - node-data:/data + # MUST be /node, not /data: the 2.x image sets BASE_PATH=/node/chain, so a volume at + # /data would leave the chain db on the container's writable layer. + - node-data:/node healthcheck: test: - 'CMD-SHELL' @@ -66,10 +96,16 @@ services: '"result":"0x' interval: 2s timeout: 5s - retries: 30 + retries: 45 start_period: 5s environment: CFG_PRESET: 'dev' SIDECHAIN_BLOCK_BENEFICIARY: '04bcf7ad3be7a5c790460be82a713af570f22e0f801f6659ab8e84a52be6969e' + # The node gracefully terminates when free space on the db volume drops below + # `threshold` MiB (default 512); 0 disables the monitor. + THRESHOLD: '0' + RUST_BACKTRACE: '1' volumes: node-data: + # A ledger v8→v9 chain cannot be upgraded in place, so these are wiped together. + indexer-data: diff --git a/frontend/bun.lock b/frontend/bun.lock index 2add18e..fea552a 100644 --- a/frontend/bun.lock +++ b/frontend/bun.lock @@ -5,16 +5,16 @@ "": { "name": "@zswap-da/shielded-night-frontend", "dependencies": { - "@midnight-ntwrk/compact-js": "2.5.1", - "@midnight-ntwrk/compact-runtime": "0.16.0", + "@midnight-ntwrk/compact-js": "2.5.5-rc.8", + "@midnight-ntwrk/compact-runtime": "0.19.0", "@midnight-ntwrk/dapp-connector-api": "4.0.1", - "@midnight-ntwrk/ledger-v8": "8.1.0", - "@midnight-ntwrk/midnight-js": "4.1.1", - "@midnight-ntwrk/midnight-js-fetch-zk-config-provider": "4.1.1", - "@midnight-ntwrk/midnight-js-http-client-proof-provider": "4.1.1", - "@midnight-ntwrk/midnight-js-indexer-public-data-provider": "4.1.1", - "@midnight-ntwrk/midnight-js-level-private-state-provider": "4.1.1", - "@midnight-ntwrk/wallet-sdk-address-format": "3.1.0", + "@midnight-ntwrk/midnight-js": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-fetch-zk-config-provider": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-http-client-proof-provider": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-indexer-public-data-provider": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-level-private-state-provider": "5.0.0-beta.7", + "@midnightntwrk/ledger-v9": "1.0.0-rc.3", + "@midnightntwrk/wallet-sdk-address-format": "4.0.0-beta.2", "bech32": "^2.0.0", "buffer": "^6.0.3", "effect": "^3.21.4", @@ -40,10 +40,10 @@ }, }, "overrides": { - "@midnight-ntwrk/compact-js": "2.5.1", - "@midnight-ntwrk/compact-runtime": "0.16.0", - "@midnight-ntwrk/ledger-v8": "8.1.0", - "@midnight-ntwrk/onchain-runtime-v3": "3.0.0", + "@midnight-ntwrk/compact-js": "2.5.5-rc.8", + "@midnight-ntwrk/compact-runtime": "0.19.0", + "@midnightntwrk/ledger-v9": "1.0.0-rc.3", + "@midnightntwrk/onchain-runtime-v4": "4.0.0-rc.3", }, "packages": { "@apollo/client": ["@apollo/client@4.2.12", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", "@wry/equality": "^0.5.6", "@wry/trie": "^0.5.0", "graphql-tag": "^2.12.6", "optimism": "^0.18.0", "tslib": "^2.3.0" }, "peerDependencies": { "graphql": "^16.0.0 || ^17.0.0", "graphql-ws": "^5.5.5 || ^6.0.3", "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc", "react-dom": "^17.0.0 || ^18.0.0 || >=19.0.0-rc", "rxjs": "^7.3.0", "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" }, "optionalPeers": ["graphql-ws", "react", "react-dom", "subscriptions-transport-ws"] }, "sha512-+KS+LM/gZ58z92p9owZZpI54yCc27KfUi1HOtLrxmxz9kDIqUcp/zh+mNjCWCbNZkWGzWslvbbmXGGtTWT8nkw=="], @@ -86,7 +86,7 @@ "@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], - "@effect/platform": ["@effect/platform@0.95.0", "", { "dependencies": { "find-my-way-ts": "^0.1.6", "msgpackr": "^1.11.4", "multipasta": "^0.2.7" }, "peerDependencies": { "effect": "^3.20.0" } }, "sha512-WDlRiWRSWlmhCPq09bvAofK0qr5vM4yNklXjoJdZHmugKRRTpN/Okn3ODnjgM/Kb/4hjMrRyrsUeH/Brieq7KA=="], + "@effect/platform": ["@effect/platform@0.97.1", "", { "dependencies": { "find-my-way-ts": "^0.1.6", "msgpackr": "^1.11.10", "multipasta": "^0.2.8" }, "peerDependencies": { "effect": "^3.22.1" } }, "sha512-IevWxwmrxCdeXxbXDx/hiOstHtERRigd1nhZSuHgiFEl7NkBmS/5GVWsRacq4NfJN2uCXqggETKNwij15VEpew=="], "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], @@ -146,39 +146,39 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@midnight-ntwrk/compact-js": ["@midnight-ntwrk/compact-js@2.5.1", "", { "dependencies": { "@effect/platform": "^0.95.0", "@midnight-ntwrk/compact-runtime": "0.16.0", "@midnight-ntwrk/ledger-v8": "^8.0.3", "@midnight-ntwrk/platform-js": "^2.2.4", "effect": "^3.20.0", "tslib": "^2.8.1" } }, "sha512-UO0+tDiRadYFO2kaUu9PIhAOISvDKvmiyh9vSOyKEZLj3AUAY1qmmHm/oQrzPqrkiWHO0Rnln/j/zZ5dvc5vxg=="], + "@midnight-ntwrk/compact-js": ["@midnight-ntwrk/compact-js@2.5.5-rc.8", "", { "dependencies": { "@effect/platform": "^0.97.0", "@midnight-ntwrk/compact-runtime": "0.19.0-rc.0", "@midnight-ntwrk/platform-js": "^3.0.0", "@midnightntwrk/ledger-v9": "^1.0.0-rc.3", "@noble/hashes": "^2.3.0", "effect": "^3.22.1", "tslib": "^2.8.1" } }, "sha512-7CGWGCTL+8IvqFUI/srHRwAWxGVLD2ytHLjSyvOcNi6UX1QLeG5vUtGlXQAKSJXvjPwndosqIFdW39OgkNH/Mg=="], - "@midnight-ntwrk/compact-runtime": ["@midnight-ntwrk/compact-runtime@0.16.0", "", { "dependencies": { "@midnight-ntwrk/onchain-runtime-v3": "^3.0.0", "@types/object-inspect": "^1.8.1", "object-inspect": "^1.12.3" } }, "sha512-UR8+MI5zol+gkne17ZZru8xmZNf11xMgQJkiLT9KWsF+QD8Wuz1WONaqQLL0RAZ2aN2XlRsBFd0ViKDVh8prFw=="], + "@midnight-ntwrk/compact-runtime": ["@midnight-ntwrk/compact-runtime@0.19.0", "", { "dependencies": { "@midnightntwrk/onchain-runtime-v4": "^4.0.0-rc.3", "@noble/curves": "^2.2.0", "@noble/hashes": "^2.0.1", "@types/object-inspect": "^1.8.1", "object-inspect": "^1.12.3" } }, "sha512-0q1ZOlyPdCCEasAxlHxagO6Sb+Db5GM6qYPQ+c+cp71NRxQgiY0Wd0/LIoshQTs+OBISb4XTjiNQ1lxcKR79qQ=="], "@midnight-ntwrk/dapp-connector-api": ["@midnight-ntwrk/dapp-connector-api@4.0.1", "", {}, "sha512-IstRo8xfmlJlGgUcAJeRzPUmGCp0/xZR3/bfTOk33MHrzbGmB79r/zYziGavcclo1pkkoBHAodX4vz3xgFxczw=="], - "@midnight-ntwrk/ledger-v8": ["@midnight-ntwrk/ledger-v8@8.1.0", "", {}, "sha512-rwOVP5kBwACpYmmY6+oLeaiM3e5gHscRMjbZUOntOC5QdtqLdpeep6eQW1OngI+sxjjdVoGg2eE16sLf+DAHmQ=="], + "@midnight-ntwrk/midnight-js": ["@midnight-ntwrk/midnight-js@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/midnight-js-contracts": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-network-id": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-types": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-utils": "5.0.0-beta.7" } }, "sha512-viRsVlcc+pgk7a9RZGXt1NleJsCzYLninrTM6t8T8rcoycE8wvM+TBuI0Tu/AlK4OJE4G384DOHSfIGpR5FQzw=="], - "@midnight-ntwrk/midnight-js": ["@midnight-ntwrk/midnight-js@4.1.1", "", { "dependencies": { "@midnight-ntwrk/midnight-js-contracts": "4.1.1", "@midnight-ntwrk/midnight-js-network-id": "4.1.1", "@midnight-ntwrk/midnight-js-protocol": "4.1.1", "@midnight-ntwrk/midnight-js-types": "4.1.1", "@midnight-ntwrk/midnight-js-utils": "4.1.1" } }, "sha512-n6g3+NA3umlZ0FT/lU7VktKyhaYcJsrh3Jcr50pHkUZw5wMqy0gncWZklQmp8qU8F6/igy5LywKZ30PIL3wOHA=="], + "@midnight-ntwrk/midnight-js-contracts": ["@midnight-ntwrk/midnight-js-contracts@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/midnight-js-network-id": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-types": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-utils": "5.0.0-beta.7", "effect": "^3.22.1" } }, "sha512-dWM+u2SEShctUb6BvR38wiXWPr4JkYAughEM33RpthP+mnqGP+C5oOq9FOPLzdKvlYg6Ne5Fk+OMiJjaG0AZQg=="], - "@midnight-ntwrk/midnight-js-contracts": ["@midnight-ntwrk/midnight-js-contracts@4.1.1", "", { "dependencies": { "@midnight-ntwrk/midnight-js-network-id": "4.1.1", "@midnight-ntwrk/midnight-js-protocol": "4.1.1", "@midnight-ntwrk/midnight-js-types": "4.1.1", "@midnight-ntwrk/midnight-js-utils": "4.1.1" } }, "sha512-vHeKyaj9RXTx+Cep3YpIRgg2EWkzibO4gxI7k/rYpXmGXc3waetrR5sb9FPR7v9SUX00/zf/sYbLp1NZhwZbjg=="], + "@midnight-ntwrk/midnight-js-fetch-zk-config-provider": ["@midnight-ntwrk/midnight-js-fetch-zk-config-provider@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/midnight-js-types": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-utils": "5.0.0-beta.7", "cross-fetch": "^4.1.0" } }, "sha512-/NgVAV8Zt7AO/fTZ4cxXfeprjkMPh9r4YfzO7Yve8M5p88Z/BBGwji8R0sXwPe251PiMWxtxaekeg5rygb27oQ=="], - "@midnight-ntwrk/midnight-js-fetch-zk-config-provider": ["@midnight-ntwrk/midnight-js-fetch-zk-config-provider@4.1.1", "", { "dependencies": { "@midnight-ntwrk/midnight-js-types": "4.1.1", "@midnight-ntwrk/midnight-js-utils": "4.1.1", "cross-fetch": "^4.1.0" } }, "sha512-d9vPAXjCvbe3KdPDBwp8Cp4HXwdo9jfCjeyJjJPfIDHCctXrIQ7btu+CqY1+bgV05FHVMOBLjJ9TS2tc2xdwrw=="], + "@midnight-ntwrk/midnight-js-http-client-proof-provider": ["@midnight-ntwrk/midnight-js-http-client-proof-provider@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/midnight-js-contracts": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-network-id": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-types": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-utils": "5.0.0-beta.7", "cross-fetch": "^4.1.0", "fetch-retry": "^6.0.0" } }, "sha512-mFbSjPJrJ1Ju60lI/Gth497kQy+c+Qa5SxM4jvMLW8pbKg1IHN8KIsQJQfGnw7NyAgqtsY6CfT+UMOmuzr9QMg=="], - "@midnight-ntwrk/midnight-js-http-client-proof-provider": ["@midnight-ntwrk/midnight-js-http-client-proof-provider@4.1.1", "", { "dependencies": { "@midnight-ntwrk/midnight-js-contracts": "4.1.1", "@midnight-ntwrk/midnight-js-network-id": "4.1.1", "@midnight-ntwrk/midnight-js-protocol": "4.1.1", "@midnight-ntwrk/midnight-js-types": "4.1.1", "@midnight-ntwrk/midnight-js-utils": "4.1.1", "cross-fetch": "^4.1.0", "fetch-retry": "^6.0.0" } }, "sha512-Q2VNRTvuWlf3MbjV7C3asuLHeFwtZMdh6t5Z+u8c8RDpejW9GhKaSjlJ2zgJII5ckE8/cocPEDwt3GKBebGHWA=="], + "@midnight-ntwrk/midnight-js-indexer-public-data-provider": ["@midnight-ntwrk/midnight-js-indexer-public-data-provider@5.0.0-beta.7", "", { "dependencies": { "@apollo/client": "^4.2.5", "@graphql-typed-document-node/core": "^3.2.0", "@midnight-ntwrk/midnight-js-network-id": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-types": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-utils": "5.0.0-beta.7", "buffer": "^6.0.3", "cross-fetch": "^4.1.0", "graphql": "^17.0.1", "graphql-ws": "^6.0.8", "isomorphic-ws": "^5.0.0", "rxjs": "^7.8.2", "ws": "^8.20.0" } }, "sha512-rjKG5U1bbjOD4acVia81hrobBVj8xovp1IA++RL4SVE75lveFekqNaZO+Y0Z6RbZwEjVBbmPOAD4jChdFuSFkQ=="], - "@midnight-ntwrk/midnight-js-indexer-public-data-provider": ["@midnight-ntwrk/midnight-js-indexer-public-data-provider@4.1.1", "", { "dependencies": { "@apollo/client": "^4.2.0", "@graphql-typed-document-node/core": "^3.2.0", "@midnight-ntwrk/midnight-js-network-id": "4.1.1", "@midnight-ntwrk/midnight-js-protocol": "4.1.1", "@midnight-ntwrk/midnight-js-types": "4.1.1", "@midnight-ntwrk/midnight-js-utils": "4.1.1", "buffer": "^6.0.3", "cross-fetch": "^4.1.0", "graphql": "^16.14.0", "graphql-ws": "^6.0.8", "isomorphic-ws": "^5.0.0", "rxjs": "^7.8.2", "ws": "^8.20.0" } }, "sha512-50CjiYqw/msRintyfkuNrJl1v4Zj+AaBFmV2uLjY/zpkPop4VBFH4QZSrtKsG1ljT9vzWsxU7Eo4Tn1tgKkPlA=="], + "@midnight-ntwrk/midnight-js-level-private-state-provider": ["@midnight-ntwrk/midnight-js-level-private-state-provider@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-types": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-utils": "5.0.0-beta.7", "@noble/ciphers": "^2.2.0", "@noble/hashes": "^2.2.0", "abstract-level": "^3.1.1", "buffer": "^6.0.3", "level": "^10.0.0", "superjson": "^2.2.6" } }, "sha512-O3eLwjltjAkXVeXiKyot2aiM43POGtiem2DhtAD4gfsGbWVPGQ//yFyMDsS92h2eb4eJma9wpUqdmAXzs5ilxQ=="], - "@midnight-ntwrk/midnight-js-level-private-state-provider": ["@midnight-ntwrk/midnight-js-level-private-state-provider@4.1.1", "", { "dependencies": { "@midnight-ntwrk/midnight-js-protocol": "4.1.1", "@midnight-ntwrk/midnight-js-types": "4.1.1", "@midnight-ntwrk/midnight-js-utils": "4.1.1", "@noble/ciphers": "^2.2.0", "@noble/hashes": "^2.2.0", "abstract-level": "^3.1.1", "buffer": "^6.0.3", "level": "^10.0.0", "superjson": "^2.2.6" } }, "sha512-i+1lXJ4rcRGERnOPXHc3/Oh5ef7X/yb6p51bOAUjITazdPPcuU8qTeTeFgX+lPhWTGxROb9/pgrrVPH9G0FxSw=="], + "@midnight-ntwrk/midnight-js-network-id": ["@midnight-ntwrk/midnight-js-network-id@5.0.0-beta.7", "", {}, "sha512-S51x/aRibCViA+4NdjYImdCHSCltJCCnI0K3K0ZqoAQc6d4b+KfIK1aSvo0cU1k1bdJwQhcgohhWH6Z5GxEHBQ=="], - "@midnight-ntwrk/midnight-js-network-id": ["@midnight-ntwrk/midnight-js-network-id@4.1.1", "", {}, "sha512-g49IBK0In1Jt2wKgi18rUvoy1ShGVrfb/VvgWALkc9Noc6+4MX5NTLVg5zqu+CyO2waIGb5lqDPnAhTD9wPAOQ=="], + "@midnight-ntwrk/midnight-js-protocol": ["@midnight-ntwrk/midnight-js-protocol@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/compact-js": "2.5.5-rc.8", "@midnight-ntwrk/compact-runtime": "0.19.0-rc.0", "@midnight-ntwrk/platform-js": "3.0.0", "@midnightntwrk/ledger-v9": "1.0.0-rc.3", "@midnightntwrk/onchain-runtime-v4": "4.0.0-rc.3" } }, "sha512-XwcAiVjEvXqpbp58oZnYq3/TCs1lduN8YHxbRKB4EvltxkpptaHr2fE78MMndpvSDGEgernJreAKO0VYDOACCA=="], - "@midnight-ntwrk/midnight-js-protocol": ["@midnight-ntwrk/midnight-js-protocol@4.1.1", "", { "dependencies": { "@midnight-ntwrk/compact-js": "2.5.1", "@midnight-ntwrk/compact-runtime": "0.16.0", "@midnight-ntwrk/ledger-v8": "8.1.0", "@midnight-ntwrk/onchain-runtime-v3": "3.0.0", "@midnight-ntwrk/platform-js": "2.2.4" } }, "sha512-JH1010ir3YrawKsA4C08aIXWpFGHrCrAaBkZFbn+xh+iwOX5Ss0WU4//mDSEnHvQN0wD6GTc2JwUfKYFaS2CcA=="], + "@midnight-ntwrk/midnight-js-types": ["@midnight-ntwrk/midnight-js-types@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.7", "effect": "^3.22.1", "pino": "^10.3.1", "rxjs": "^7.8.2" } }, "sha512-dZMW1DWgvyOPuuSCaEAx6pOYQomT+YYHFrDk9pjPSSRG/3qhe8PKtc2DYFRu9t8E4xy7FkZM8A2EW/S8auf5JQ=="], - "@midnight-ntwrk/midnight-js-types": ["@midnight-ntwrk/midnight-js-types@4.1.1", "", { "dependencies": { "@midnight-ntwrk/midnight-js-protocol": "4.1.1", "effect": "^3.20.0", "pino": "^10.3.1", "rxjs": "^7.8.2" } }, "sha512-MPT7YToXN2EsDtOOVSJonYZSZ4eqmdVgftBfH56w+tmZM0sZt9u+Mq18uuBQl9ebpTXnp8o7WqeISbgPMxTBcQ=="], + "@midnight-ntwrk/midnight-js-utils": ["@midnight-ntwrk/midnight-js-utils@5.0.0-beta.7", "", { "dependencies": { "@midnight-ntwrk/midnight-js-network-id": "5.0.0-beta.7", "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.7", "@midnightntwrk/wallet-sdk-address-format": "4.0.0-beta.2", "@noble/hashes": "^2.2.0" } }, "sha512-mZwdEL/o38yeFp+ba3Uil6xuxFPAC9bplMVoP6Cs6C5gycVaeWkW1h+7wDEKGDcJ2qImfi7egNDHs+u+PbHWTg=="], - "@midnight-ntwrk/midnight-js-utils": ["@midnight-ntwrk/midnight-js-utils@4.1.1", "", { "dependencies": { "@midnight-ntwrk/midnight-js-network-id": "4.1.1", "@midnight-ntwrk/midnight-js-protocol": "4.1.1", "@midnight-ntwrk/wallet-sdk-address-format": "^3.1.0" } }, "sha512-b65QADd2FaZbWXe9D3fe9mSGmPlP1DTRMGSruJqhl9fOTNxBhQIzIKs0j/eL9Kv77dVeGDYgQdbV+JkDj3j5Qg=="], + "@midnight-ntwrk/platform-js": ["@midnight-ntwrk/platform-js@3.0.0", "", { "dependencies": { "@effect/platform": "^0.96.1", "effect": "^3.21.0", "tslib": "^2.8.1" } }, "sha512-cAOpmWURUELDKmcNf8/mZjDtxkqg6ShjV6v0KY7mmwMWkieDEERq/TRmK5cMJgUqMi6nCWjwLZqOmPB07B8Y4A=="], - "@midnight-ntwrk/onchain-runtime-v3": ["@midnight-ntwrk/onchain-runtime-v3@3.0.0", "", {}, "sha512-HbFbUOsvgpEFy1OT0Ni2LMFk4jnMQS1em+H+Mof/B3DpnNKl0Lkx5QiulKOc6pyU4KPEagOqx4fYNyVXFwgZ7g=="], + "@midnightntwrk/ledger-v9": ["@midnightntwrk/ledger-v9@1.0.0-rc.3", "", {}, "sha512-i/Cl/d2XQ19gIm5SCruMHr+XiruxIn9Ec3i15DrZ/44Yggzu1u5+dG7QUx7Rw1htkgALXivEt7Kw4NzxPr4pBw=="], - "@midnight-ntwrk/platform-js": ["@midnight-ntwrk/platform-js@2.2.4", "", { "dependencies": { "@effect/platform": "^0.95.0", "effect": "^3.20.0", "tslib": "^2.8.1" } }, "sha512-6mrYKSSE8kPgn/5rQ2xofDJk1yAZZRdLOO6Yelweuh5GOnOGz7Qw4venDG/c4TRqtV9ouFp+F5j7ta8aprMinw=="], + "@midnightntwrk/onchain-runtime-v4": ["@midnightntwrk/onchain-runtime-v4@4.0.0-rc.3", "", {}, "sha512-LAf4g3vgwtPqActbi5RAoZcfYduqnFqtsHN+i1s/Mcb5vi2yMbPmpSOJ0YCCIGb2S/qY7G5tQARHVD0PJyHSNA=="], - "@midnight-ntwrk/wallet-sdk-address-format": ["@midnight-ntwrk/wallet-sdk-address-format@3.1.0", "", { "dependencies": { "@midnight-ntwrk/ledger-v8": "^8.0.2", "@scure/base": "^2.0.0", "@subsquid/scale-codec": "^4.0.1" } }, "sha512-X/MQnbyQQ1SoFVJrxhczkHza1SMJghp3Eo49nXXnHZw2qKUUmpiNa8Hx3MYFq36NXi3m3gsMH7rW0bilMFvdhw=="], + "@midnightntwrk/wallet-sdk-address-format": ["@midnightntwrk/wallet-sdk-address-format@4.0.0-beta.2", "", { "dependencies": { "@midnightntwrk/ledger-v9": "1.0.0-rc.3", "@scure/base": "^2.0.0", "@subsquid/scale-codec": "^4.0.1" } }, "sha512-yK4jlntQ0Pgks8dKrPx6J7IMdzIznEYZ4yO9/msIJrn2IM4o1d8+MEh07OMFvZ9ui1YNQB272aUv5muopBCrdA=="], "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ=="], @@ -196,6 +196,8 @@ "@noble/ciphers": ["@noble/ciphers@2.4.0", "", {}, "sha512-AnjFn0Jv92laAkvMrghlFZq4qQCIN/4DxFV/eooqtC2YTjB7kBeLMS2T9KJX4Dn+ZVXLOwK0lSgqDtx9gvxtiw=="], + "@noble/curves": ["@noble/curves@2.4.0", "", { "dependencies": { "@noble/hashes": "2.4.0" } }, "sha512-P4/62zrgfH33CneE3Dn4WhJVA22YUU0eR51wKIan4NVRvwsA0YnPTwWGpNbpuacSujmSFLvyzpyuR30+fbq2Ew=="], + "@noble/hashes": ["@noble/hashes@2.4.0", "", {}, "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA=="], "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], @@ -438,7 +440,7 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "graphql": ["graphql@16.14.2", "", {}, "sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA=="], + "graphql": ["graphql@17.0.2", "", {}, "sha512-FRWbddMxfkjiB7z+aQDWIR+E34xo9I8c9mtK2RPv8PmMzKRvrdsreHL/Ui/TmwHJfhHChEtsFPyMHKI+xuarQQ=="], "graphql-tag": ["graphql-tag@2.12.7", "", { "dependencies": { "tslib": "^2.1.0" }, "peerDependencies": { "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-xnE/NFzy+0eIesvAsREJZ284zTl/wYuBAvpsFSDhRGRdRHdnE90M21Q3xAWyYInb0J756c6x0pIQ62+vtvOs1Q=="], @@ -568,7 +570,7 @@ "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], - "postcss": ["postcss@8.5.27", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-79Iho8QeYyooJ8e9lCRyTVlyTAkS/kXBYKff6TMzS3kEWGQ8Ds5UEtXpGrSUDLUWok6QTvxeYy0GO8fopHnaSA=="], + "postcss": ["postcss@8.5.28", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A=="], "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], @@ -676,6 +678,8 @@ "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + "@midnight-ntwrk/platform-js/@effect/platform": ["@effect/platform@0.96.3", "", { "dependencies": { "find-my-way-ts": "^0.1.6", "msgpackr": "^1.11.10", "multipasta": "^0.2.7" }, "peerDependencies": { "effect": "^3.21.5" } }, "sha512-LzvIj4HYE++TcTv/cVTCI/GRvQTV0ymwRmgjZMzNB5dU4OS05pTN36RKN0npiOm5orLJgw4yjIv1dNZoYGh/vg=="], + "asn1.js/bn.js": ["bn.js@4.12.5", "", {}, "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ=="], "browserify-sign/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], @@ -686,6 +690,8 @@ "elliptic/bn.js": ["bn.js@4.12.5", "", {}, "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ=="], + "md5.js/hash-base": ["hash-base@3.1.2", "", { "dependencies": { "inherits": "^2.0.4", "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1", "to-buffer": "^1.2.1" } }, "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg=="], + "miller-rabin/bn.js": ["bn.js@4.12.5", "", {}, "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ=="], "public-encrypt/bn.js": ["bn.js@4.12.5", "", {}, "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ=="], @@ -700,8 +706,14 @@ "browserify-sign/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + "md5.js/hash-base/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "ripemd160/hash-base/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "md5.js/hash-base/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "md5.js/hash-base/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + "ripemd160/hash-base/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "ripemd160/hash-base/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], diff --git a/frontend/package.json b/frontend/package.json index 8631c09..9b25994 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,15 +10,15 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@midnight-ntwrk/compact-js": "2.5.1", - "@midnight-ntwrk/compact-runtime": "0.16.0", + "@midnight-ntwrk/compact-js": "2.5.5-rc.8", + "@midnight-ntwrk/compact-runtime": "0.19.0", "@midnight-ntwrk/dapp-connector-api": "4.0.1", - "@midnight-ntwrk/ledger-v8": "8.1.0", - "@midnight-ntwrk/midnight-js": "4.1.1", - "@midnight-ntwrk/midnight-js-fetch-zk-config-provider": "4.1.1", - "@midnight-ntwrk/midnight-js-http-client-proof-provider": "4.1.1", - "@midnight-ntwrk/midnight-js-indexer-public-data-provider": "4.1.1", - "@midnight-ntwrk/midnight-js-level-private-state-provider": "4.1.1", + "@midnightntwrk/ledger-v9": "1.0.0-rc.3", + "@midnight-ntwrk/midnight-js": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-fetch-zk-config-provider": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-http-client-proof-provider": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-indexer-public-data-provider": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-level-private-state-provider": "5.0.0-beta.7", "bech32": "^2.0.0", "buffer": "^6.0.3", "effect": "^3.21.4", @@ -27,7 +27,7 @@ "process": "^0.11.10", "react": "^18.3.1", "react-dom": "^18.3.1", - "@midnight-ntwrk/wallet-sdk-address-format": "3.1.0" + "@midnightntwrk/wallet-sdk-address-format": "4.0.0-beta.2" }, "devDependencies": { "@types/node": "^24.10.0", @@ -43,9 +43,25 @@ "vite-plugin-wasm": "^3.4.1" }, "overrides": { - "@midnight-ntwrk/compact-js": "2.5.1", - "@midnight-ntwrk/compact-runtime": "0.16.0", - "@midnight-ntwrk/ledger-v8": "8.1.0", - "@midnight-ntwrk/onchain-runtime-v3": "3.0.0" - } + "@midnight-ntwrk/compact-js": "2.5.5-rc.8", + "@midnight-ntwrk/compact-runtime": "0.19.0", + "@midnightntwrk/ledger-v9": "1.0.0-rc.3", + "@midnightntwrk/onchain-runtime-v4": "4.0.0-rc.3" + }, + "//overrides": [ + "The ledger-v9 line. Same single-wasm-copy rule as the root package.json:", + "@midnightntwrk/ledger-v9 (NOTE the scope has no hyphen) replaces", + "@midnight-ntwrk/ledger-v8, and compact-runtime is forced to 0.19.0 because", + "midnight-js 5.0.0-beta.7 pins the byte-identical 0.19.0-rc.0 while compactc", + "0.34.0 emits checkRuntimeVersion('0.19.0'). onchain-runtime-v4 is pinned one", + "level down for the same reason. These MUST agree with resolve.dedupe in", + "vite.config.ts, which collapses the copies the ROOT node_modules would", + "otherwise contribute through ../src/managed.", + "`main` separately pins compact-js 2.5.1, compact-runtime 0.16.0, ledger-v8", + "8.1.0 and onchain-runtime-v3 3.0.0 for the v8/preview line (merged in from", + "main @ f7fcefa on 2026-09-03, project 00007 phase F2). None of those apply", + "here: this tree uses ledger-v9/onchain-runtime-v4 exclusively and compact-js", + "is already exact at 2.5.5-rc.8. Do not copy the v8-line overrides onto", + "this branch." + ] } diff --git a/frontend/src/lib/providers.ts b/frontend/src/lib/providers.ts index 89c23f8..b6e97a6 100644 --- a/frontend/src/lib/providers.ts +++ b/frontend/src/lib/providers.ts @@ -1,10 +1,12 @@ import { levelPrivateStateProvider } from '@midnight-ntwrk/midnight-js-level-private-state-provider'; import { indexerPublicDataProvider } from '@midnight-ntwrk/midnight-js-indexer-public-data-provider'; import { FetchZkConfigProvider } from '@midnight-ntwrk/midnight-js-fetch-zk-config-provider'; -import { createProofProvider } from '@midnight-ntwrk/midnight-js/types'; -import type { ConnectedAPI } from '@midnight-ntwrk/dapp-connector-api'; +import { createProofProvider, zkConfigToProvingKeyMaterial, ZKConfigRegistry } from '@midnight-ntwrk/midnight-js/types'; +import { ZkArtifactIntegrityError } from '@midnight-ntwrk/midnight-js/utils'; +import type { ProvingProvider as LedgerProvingProvider } from '@midnightntwrk/ledger-v9'; +import type { ConnectedAPI, ProvingProvider as ConnectorProvingProvider } from '@midnight-ntwrk/dapp-connector-api'; import type { BlockHashConfig, BlockHeightConfig } from '@midnight-ntwrk/midnight-js/types'; -import type { ContractAddress } from '@midnight-ntwrk/ledger-v8'; +import type { ContractAddress } from '@midnightntwrk/ledger-v9'; import { createWalletProvidersFromConnectedAPI } from './walletAdapter'; import { type ShieldedNightCircuits, type ShieldedNightProviders, ZK_CONFIG_CONTRACT_NAME } from './contract'; @@ -27,7 +29,14 @@ export type ShieldedAddress = { */ export async function buildProviders(connectedAPI: ConnectedAPI): Promise { const zkConfigBase = window.location.origin + '/contract/compiled/' + ZK_CONFIG_CONTRACT_NAME; - const zkConfigProvider = new FetchZkConfigProvider(zkConfigBase, fetch.bind(window)); + // midnight-js 5: the second argument is an options bag, not a bare fetch. Integrity + // verification defaults to 'require' (fail-closed) and checks every artifact against + // compactc's `compiler/contract-manifest.json` — a file compactc only started emitting + // at 0.33, so serving `src/managed/` WHOLE (manifest included) is now load-bearing, + // not merely tidy. + const zkConfigProvider = new FetchZkConfigProvider(zkConfigBase, { + fetchFunc: fetch.bind(window), + }); const config = await connectedAPI.getConfiguration(); @@ -38,7 +47,11 @@ export async function buildProviders(connectedAPI: ConnectedAPI): Promise ProvingKeyMaterial | undefined`, + * which `createProofProvider` requires. `@midnight-ntwrk/dapp-connector-api` has NOT caught up: + * neither 4.0.1 (the pinned version) nor 4.1.0-beta.1 declares it, so a wallet that implements + * it — as a ledger-v9 wallet must — still hands back a value the connector types describe + * without it. + * + * If the wallet supplies `lookupKey`, it is used unchanged. If it does not, we fill it from THIS + * dApp's own `zkConfigProvider` — the identical artifacts the dApp already served and already + * handed the wallet through `asKeyMaterialProvider()` above. Nothing private crosses the + * boundary and nothing moves proving out of the wallet: `check` and `prove` are still the + * wallet's, and they are delegated explicitly rather than spread, so a connector that returns a + * class instance keeps working. Which lane was taken is logged, never silent. + */ +function withLookupKey( + provider: ConnectorProvingProvider, + zkConfigProvider: FetchZkConfigProvider, +): LedgerProvingProvider { + const maybe = provider as Partial; + if (typeof maybe.lookupKey === 'function') { + console.info('[providers] wallet proving provider implements lookupKey (ledger-v9 native)'); + return maybe as LedgerProvingProvider; + } + console.info( + "[providers] wallet proving provider has no lookupKey; serving key material from the dApp's " + + 'own zkConfigProvider (same public artifacts already passed to getProvingProvider)', + ); + const lookupKey = makeKeyMaterialResolver(zkConfigProvider); + return { + check: (preimage, keyLocation) => provider.check(preimage, keyLocation), + prove: (preimage, keyLocation, overwriteBindingInput) => + provider.prove(preimage, keyLocation, overwriteBindingInput), + lookupKey, + }; +} + +/** + * The dApp-side key-material resolver, transcribed from midnight-js 5's own + * `makeKeyMaterialResolver` (`midnight-js-http-client-proof-provider`) so it behaves + * identically at the two edges that matter: + * + * - a CANONICAL contract key location resolves through the registry's verifier-key join, + * not by string-slicing the location; + * - a protocol builtin (`midnight/...`) resolves to `undefined` — the prover supplies those — + * while an integrity violation still THROWS, because "the artifact is present but stale or + * tampered with" must never be masked as "no key material". + */ +function makeKeyMaterialResolver( + zkConfigProvider: FetchZkConfigProvider, +): LedgerProvingProvider['lookupKey'] { + const registry = new ZKConfigRegistry([zkConfigProvider]); + return async (keyLocation: string) => { + const resolved = await registry.resolveKeyLocation(keyLocation); + if (resolved !== undefined) return zkConfigToProvingKeyMaterial(resolved); + try { + return zkConfigToProvingKeyMaterial(await zkConfigProvider.get(keyLocation as ShieldedNightCircuits)); + } catch (error) { + if (error instanceof ZkArtifactIntegrityError) throw error; + return undefined; + } + }; +} diff --git a/frontend/src/lib/swap.ts b/frontend/src/lib/swap.ts index 25a3a17..8594c34 100644 --- a/frontend/src/lib/swap.ts +++ b/frontend/src/lib/swap.ts @@ -1,5 +1,5 @@ import { submitCallTx } from '@midnight-ntwrk/midnight-js/contracts'; -import { MidnightBech32m } from '@midnight-ntwrk/wallet-sdk-address-format'; +import { MidnightBech32m } from '@midnightntwrk/wallet-sdk-address-format'; import { CompiledShieldedNight, type ShieldedNightProviders, diff --git a/frontend/src/lib/tokens.ts b/frontend/src/lib/tokens.ts index 70edd26..8b30312 100644 --- a/frontend/src/lib/tokens.ts +++ b/frontend/src/lib/tokens.ts @@ -1,4 +1,4 @@ -import * as ledger from '@midnight-ntwrk/ledger-v8'; +import * as ledger from '@midnightntwrk/ledger-v9'; export const DECIMALS = 6; const SCALE = 10n ** BigInt(DECIMALS); diff --git a/frontend/src/lib/walletAdapter.ts b/frontend/src/lib/walletAdapter.ts index cc79ee8..bcb6391 100644 --- a/frontend/src/lib/walletAdapter.ts +++ b/frontend/src/lib/walletAdapter.ts @@ -7,7 +7,7 @@ import { type Proof, type SignatureEnabled, Transaction, -} from '@midnight-ntwrk/ledger-v8'; +} from '@midnightntwrk/ledger-v9'; import type { ConnectedAPI } from '@midnight-ntwrk/dapp-connector-api'; import { Cause } from 'effect'; import type { ShieldedAddress } from './providers'; diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 22680dc..25fc205 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -29,8 +29,8 @@ export default defineConfig({ // single instance for every importer, dev and build alike. dedupe: [ '@midnight-ntwrk/compact-runtime', - '@midnight-ntwrk/onchain-runtime-v3', - '@midnight-ntwrk/ledger-v8', + '@midnightntwrk/onchain-runtime-v4', + '@midnightntwrk/ledger-v9', '@midnight-ntwrk/compact-js', ], alias: { diff --git a/package.json b/package.json index d2fd203..8752f4b 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,8 @@ "./contract": "./src/managed/contract/index.js" }, "scripts": { - "compact": "compact compile +0.31.1 src/shielded-night.compact src/managed/", - "compact:fast": "compact compile +0.31.1 --skip-zk src/shielded-night.compact src/managed/", + "compact": "compact compile +0.34.0 src/shielded-night.compact src/managed/", + "compact:fast": "compact compile +0.34.0 --skip-zk src/shielded-night.compact src/managed/", "typecheck": "tsc -p tsconfig.json --noEmit", "test": "bun run test:unit && bun run test:integration", "test:unit": "vitest run --config vitest.unit.config.ts", @@ -19,15 +19,15 @@ "verify:deployment": "bun run scripts/verify-deployment.ts" }, "dependencies": { - "@midnight-ntwrk/compact-js": "^2.5.1", - "@midnight-ntwrk/compact-runtime": "0.16.0", - "@midnight-ntwrk/ledger-v8": "^8.1.0", - "@midnight-ntwrk/midnight-js": "^4.1.1", - "@midnight-ntwrk/midnight-js-http-client-proof-provider": "^4.1.1", - "@midnight-ntwrk/midnight-js-indexer-public-data-provider": "^4.1.1", - "@midnight-ntwrk/midnight-js-level-private-state-provider": "^4.1.1", - "@midnight-ntwrk/midnight-js-node-zk-config-provider": "^4.1.1", - "@midnightntwrk/wallet-sdk": "^1.2.0", + "@midnight-ntwrk/compact-js": "2.5.5-rc.8", + "@midnight-ntwrk/compact-runtime": "0.19.0", + "@midnightntwrk/ledger-v9": "1.0.0-rc.3", + "@midnight-ntwrk/midnight-js": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-http-client-proof-provider": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-indexer-public-data-provider": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-level-private-state-provider": "5.0.0-beta.7", + "@midnight-ntwrk/midnight-js-node-zk-config-provider": "5.0.0-beta.7", + "@midnightntwrk/wallet-sdk": "2.0.0-beta.2", "buffer": "^6.0.3", "rxjs": "^7.8.1", "ws": "^8.19.0", @@ -40,10 +40,33 @@ "typescript": "^5.9.3", "vitest": "^4.1.0" }, - "//overrides": "Every entry forces ONE copy of a WASM-bearing package tree-wide: two copies give two class identities and break `instanceof` checks during proving. ledger-v8 -> two LedgerParameters. onchain-runtime-v3 -> 'expected instance of ChargedState' when reading ledger state; it needs pinning because compact-runtime 0.16.0 asks for ^3.0.0 (which now resolves to 3.1.0) while midnight-js-protocol 4.1.1 pins 3.0.0 exactly, so an unpinned resolve installs both. compact-js is pinned because the direct dependency range ^2.5.1 now resolves to 2.5.3, which depends on an unpublished @midnight-ntwrk/ledger-v9 alpha and cannot be installed at all -- and would also be a second compact-js next to the 2.5.1 midnight-js-protocol pins. frontend/package.json mirrors the compact-js/compact-runtime/ledger-v8/onchain-runtime-v3 pins for its own tree. The note lives OUT here because bun >= 1.4.0 no longer counts a `//` key inside `overrides` as an override, so a lockfile saved with one is rejected by `--frozen-lockfile`.", + "//overrides": [ + "Force a single copy of every wasm-bindgen module tree-wide: two copies give", + "two class identities and break `instanceof` checks during proving. On the v8", + "line this block pinned @midnight-ntwrk/ledger-v8; on the ledger-v9 line the", + "ledger moved to @midnightntwrk/ledger-v9 (NOTE the scope has no hyphen).", + "compact-runtime is pinned too because the versions disagree only in name:", + "compactc 0.34.0 emits `checkRuntimeVersion('0.19.0')` while midnight-js", + "5.0.0-beta.7 pins 0.19.0-rc.0. The two published tarballs differ in three", + "lines (the version string, its source map and package.json) and nothing", + "else, and the runtime guard strips the prerelease suffix — so collapsing", + "them onto 0.19.0 is safe and avoids a second onchain-runtime wasm copy.", + "onchain-runtime-v4 is pinned for the same reason one level down: today", + "compact-runtime's `^4.0.0-rc.3` and midnight-js-protocol's exact", + "`4.0.0-rc.3` agree, but a released 4.0.0 would split them.", + "`main` separately pins @midnight-ntwrk/compact-js at 2.5.1, @midnight-ntwrk/", + "ledger-v8 at 8.1.0 and @midnight-ntwrk/onchain-runtime-v3 at 3.0.0 for the", + "v8/preview line (merged in from main @ f7fcefa on 2026-09-03, project 00007", + "phase F2). None of those three apply to this v9 dependency graph: ledger-v8", + "and onchain-runtime-v3 are not in this tree at all (this line uses ledger-v9", + "and onchain-runtime-v4, both pinned above), and compact-js is already an", + "EXACT direct dependency here (2.5.5-rc.8, not a caret range), so it needs no", + "defensive override -- unlike main's `^2.5.1`, it cannot drift to an", + "unresolvable version. Do not copy the v8-line overrides onto this branch." + ], "overrides": { - "@midnight-ntwrk/compact-js": "2.5.1", - "@midnight-ntwrk/ledger-v8": "8.1.0", - "@midnight-ntwrk/onchain-runtime-v3": "3.0.0" + "@midnightntwrk/ledger-v9": "1.0.0-rc.3", + "@midnight-ntwrk/compact-runtime": "0.19.0", + "@midnightntwrk/onchain-runtime-v4": "4.0.0-rc.3" } } diff --git a/scripts/verify-deployment.ts b/scripts/verify-deployment.ts index 71356ab..e155a7a 100644 --- a/scripts/verify-deployment.ts +++ b/scripts/verify-deployment.ts @@ -25,6 +25,24 @@ * only the CODE check decides the exit code. It never weakens CODE: a key * mismatch or a missing/extra circuit still exits 1. See scripts/verify-args.ts. */ +// Bun-under-ESM interop hazard, not a style choice: graphql@17's package.json +// exports map lists Bun's own "bun" condition before "require" in every +// branch, both pointing at an ESM-only .mjs. When +// @midnight-ntwrk/midnight-js-indexer-public-data-provider (an ESM module) +// is the FIRST thing to resolve "graphql" -- via its own `import ... from +// '@apollo/client/core'`, which internally does a plain CJS +// `require('graphql')` inside graphql-tag's UMD bundle -- Bun refuses to +// require() the async ES module and this script crashes at import time, +// before a single line of its own code runs. Statically importing "graphql" +// first, here, resolves it through Bun's ESM path (which handles an async +// module fine) and caches that resolution, so the later CJS require() inside +// graphql-tag reuses the cached module instead of re-resolving via the +// broken exports-map ordering. Measured: this exact crash reproduces via a +// bare `import { indexerPublicDataProvider } from +// '@midnight-ntwrk/midnight-js-indexer-public-data-provider'` with no other +// code, deterministically, 100% of runs; prepending `import 'graphql'` +// resolves it, also deterministically. Project 00007, question Q15/Q16. +import 'graphql'; import { indexerPublicDataProvider } from '@midnight-ntwrk/midnight-js-indexer-public-data-provider'; import { setNetworkId } from '@midnight-ntwrk/midnight-js/network-id'; import { createHash } from 'node:crypto'; diff --git a/src/managed/compiler/contract-info.json b/src/managed/compiler/contract-info.json index 3bee93e..9a5137f 100644 --- a/src/managed/compiler/contract-info.json +++ b/src/managed/compiler/contract-info.json @@ -1,7 +1,7 @@ { - "compiler-version": "0.31.1", - "language-version": "0.23.0", - "runtime-version": "0.16.0", + "compiler-version": "0.34.0", + "language-version": "0.26.0", + "runtime-version": "0.19.0", "circuits": [ { "name": "name", diff --git a/src/managed/compiler/contract-manifest.json b/src/managed/compiler/contract-manifest.json new file mode 100644 index 0000000..86ca2d8 --- /dev/null +++ b/src/managed/compiler/contract-manifest.json @@ -0,0 +1,258 @@ +{ + "manifest-version": "1", + "compiler-version": "0.34.0", + "language-version": "0.26.0", + "runtime-version": "0.19.0", + "compiler": { + "type": "directory", + "contract-info.json": { + "type": "file", + "size": 10824, + "hash": "4be77d9071bc7df292cd47a8c0b592647164faf581676ea713c82f0f7db33bf0" + } + }, + "contract": { + "type": "directory", + "index.d.ts": { + "type": "file", + "size": 10829, + "hash": "8245a78e2fd8eef31d71263a5e051aabac69e76643aa8b76e59e7ab24a8e9da3" + }, + "index.js": { + "type": "file", + "size": 128904, + "hash": "9676327416b39508f0f8e914fd8005458fe2ada4cc112e1a15ab983d9182d3a7" + }, + "index.js.map": { + "type": "file", + "size": 6134, + "hash": "ce51c8aef4750cc18f1a03b28a3140dce06169a3bf740ad66399081df7e9b662" + } + }, + "zkir": { + "type": "directory", + "convertToShielded.bzkir": { + "type": "file", + "size": 608, + "hash": "d18d0a123c07e091e8399c9038cec0d196ac6d690175b018829483898bb4dc8d" + }, + "convertToShielded.zkir": { + "type": "file", + "size": 8848, + "hash": "46ffbeb4fea6fdb8f62cf3bf3a343fa5efdfdd0b2bb5cc3e6000292d5c57e40b" + }, + "convertToUnshielded.bzkir": { + "type": "file", + "size": 1113, + "hash": "322e44797c423f495d330b495990f7ef1f0aba3a5b970aaebf9c2040261399b4" + }, + "convertToUnshielded.zkir": { + "type": "file", + "size": 16072, + "hash": "510e51237aeef4384631fe03b49c96013b92d120a7e831b0fb6e307a8e209310" + }, + "decimals.bzkir": { + "type": "file", + "size": 71, + "hash": "bcba28c871a59908f3949f670c82ece40b30a8c5405eda14e39ba8636480c71f" + }, + "decimals.zkir": { + "type": "file", + "size": 953, + "hash": "ea3d2d1a65f5388d28645fd4c0fa4a1f9d516e01a164c4e2e7138aa82fb95fb9" + }, + "depositShielded.bzkir": { + "type": "file", + "size": 930, + "hash": "73f91b44a64c982c130a54bb10fbc22da242ca7a9560711729a740be82259ac1" + }, + "depositShielded.zkir": { + "type": "file", + "size": 13821, + "hash": "16e7d5ada1adea0dd09e9203574fe898fa2ae3198272fda84b12cfbc06507558" + }, + "depositUnshielded.bzkir": { + "type": "file", + "size": 576, + "hash": "bbeb4e4e56b498ba769089bd8f8c26e515dee25166831e9a1d44a98594714d58" + }, + "depositUnshielded.zkir": { + "type": "file", + "size": 8859, + "hash": "274f10abffd9ffd00c191b34ec4d658b0eb57336f8e563630bd82a1980b201ee" + }, + "getBalance.bzkir": { + "type": "file", + "size": 131, + "hash": "c9cfcae07512a89916bc6baba36f189ac2927a7007687e0b4232fc6972c6d86e" + }, + "getBalance.zkir": { + "type": "file", + "size": 1694, + "hash": "ce9fea83599adf8ff4e2c66f431f585d5013662a467112fd41d48c0d6ef071de" + }, + "name.bzkir": { + "type": "file", + "size": 103, + "hash": "7663272ca075a1e6d0d0502251cc8224e92a4576eb40ebbebeb14ce5206ffb56" + }, + "name.zkir": { + "type": "file", + "size": 954, + "hash": "8e8597767f0199f401448d572f251356cfb9ae15ecf364430e7c949650c55893" + }, + "symbol.bzkir": { + "type": "file", + "size": 105, + "hash": "0c0165a89e575ffc4e53fc5c04b7ce9496a081a874914af06c89c78d4e20c2fb" + }, + "symbol.zkir": { + "type": "file", + "size": 993, + "hash": "53a787199d7441b40e651f0bf8d5bc7e672d02d34ac8ea1b6d47bf7534694cf3" + }, + "tokenColor.bzkir": { + "type": "file", + "size": 141, + "hash": "a5ca334193560fb755c20a91bd6675e2cf865b5cad480d9e755e257b1d026a86" + }, + "tokenColor.zkir": { + "type": "file", + "size": 1542, + "hash": "60168cbd0bef54494966388e3f672dd108f78a9d4c8aae15522e41f632f26ace" + }, + "withdrawShielded.bzkir": { + "type": "file", + "size": 711, + "hash": "1c7c58003085134023c4002a6beb899dafd6f45986e98ed157fac3cb5d154b3b" + }, + "withdrawShielded.zkir": { + "type": "file", + "size": 10348, + "hash": "5e73ba4f7765db4ac8c5f9758e6d1f56b5bcae0cae073ef051f31a9016571640" + }, + "withdrawUnshielded.bzkir": { + "type": "file", + "size": 1097, + "hash": "96ec6dd5aaa8753a8da11618706166fc7373664ba87fd4169febb9b5d9b10eb8" + }, + "withdrawUnshielded.zkir": { + "type": "file", + "size": 16165, + "hash": "2de2779327d878142f7349bdd4c8ffac20651dd883f42ddce9ff9c18d99de9dc" + } + }, + "keys": { + "type": "directory", + "convertToShielded.prover": { + "type": "file", + "size": 5204863, + "hash": "39732387554c10974a04365dfc5e46f4f024f5f426752d850b0b124b66c77711" + }, + "convertToShielded.verifier": { + "type": "file", + "size": 2119, + "hash": "ceb794f4a07d5d0f4a200a364cc6334f6b3a8f08fa5a37ba3c99edac4da968eb" + }, + "convertToUnshielded.prover": { + "type": "file", + "size": 5206057, + "hash": "fd0790325985b5afed1f88c93a1a864a12b26c6f8e50d5cc89033923b4e15911" + }, + "convertToUnshielded.verifier": { + "type": "file", + "size": 2119, + "hash": "527e93c8b02cc14d86c625834d874556183d5e45ea615338bbe4966fb503eb4d" + }, + "decimals.prover": { + "type": "file", + "size": 22436, + "hash": "4833687440dcc5a3b27e8af9b6442a84decfd62f07f523aef9c450af07f249eb" + }, + "decimals.verifier": { + "type": "file", + "size": 1351, + "hash": "95a209a810ddd347aa984bb6c6a5c57ba66ef29b4221f1fafd3f04e1fa4fdec9" + }, + "depositShielded.prover": { + "type": "file", + "size": 9994806, + "hash": "bf31c7665560f782d7e05e1bed238e91a9bab688c35cb55aa2129faf4f3249d6" + }, + "depositShielded.verifier": { + "type": "file", + "size": 2119, + "hash": "50ec1aa10bc46a20ecfdaae1fb3354cff6c33dc61fa5c97b3e49e87878cba46c" + }, + "depositUnshielded.prover": { + "type": "file", + "size": 2824062, + "hash": "dfb0813bfce8c813d2e288653a39865d1ae07b9492090cbb268d61fe36454940" + }, + "depositUnshielded.verifier": { + "type": "file", + "size": 2119, + "hash": "72e482e604354b866f7cab1852144c091d06bd913e9a5bd8979046275d88fdc2" + }, + "getBalance.prover": { + "type": "file", + "size": 2820035, + "hash": "33b24cefc9a26ed21b4c1f6d8f8b1a87d64a0a6787eef11440f88a26f06a9a26" + }, + "getBalance.verifier": { + "type": "file", + "size": 2119, + "hash": "7981e85490a0d425652636da8c3b5aa9a3d998ce72ef04c16d3524dba08416bf" + }, + "name.prover": { + "type": "file", + "size": 22436, + "hash": "b05b5111aea5700ed9f8074772535b073481137e0206581ad7ba21c2f08b14f0" + }, + "name.verifier": { + "type": "file", + "size": 1351, + "hash": "b36a8137f9cb7bce5546e12d5194c5e72a8caa1b11441c35a0f2379246e04387" + }, + "symbol.prover": { + "type": "file", + "size": 22434, + "hash": "4b84581f1f43f14bbb8eeaba4acb8a65b87e040dcf6939173779ecf78904f295" + }, + "symbol.verifier": { + "type": "file", + "size": 1351, + "hash": "21005ce77566c9a7f5fed12b07c79796abd19b6d6afbc6553ae6aeb9e908b6d9" + }, + "tokenColor.prover": { + "type": "file", + "size": 2814667, + "hash": "17525dbbe8be1e855e12adc581d89745398ef224cd62c8bb12c7fdac5b4ae7a8" + }, + "tokenColor.verifier": { + "type": "file", + "size": 2119, + "hash": "904cecd3fab66d4f598eee1d90709771e735695cff5344c71cf8afc31a319b5d" + }, + "withdrawShielded.prover": { + "type": "file", + "size": 5212557, + "hash": "0787d27d03f1bbe5b3c2f3f8b6a2144756ea52d282f52848605a75cc5b741de4" + }, + "withdrawShielded.verifier": { + "type": "file", + "size": 2119, + "hash": "71019ebd128964628325541c6a14db941c2dbf024689525132a1e13dff457b42" + }, + "withdrawUnshielded.prover": { + "type": "file", + "size": 2821823, + "hash": "8ea30a2e29cd2b72dc3d2bdf7088f88ad24c33c8fd457a2a1d99ad0c7b92168c" + }, + "withdrawUnshielded.verifier": { + "type": "file", + "size": 2119, + "hash": "b04e3748e1b1146648f490531eabf874f6fa8bb1331680c458b234125a590a37" + } + } +} diff --git a/src/managed/contract/index.d.ts b/src/managed/contract/index.d.ts index 132d51d..d4f5d9a 100644 --- a/src/managed/contract/index.d.ts +++ b/src/managed/contract/index.d.ts @@ -4,40 +4,40 @@ export type Witnesses = { } export type ImpureCircuits = { - name(context: __compactRuntime.CircuitContext): __compactRuntime.CircuitResults; - symbol(context: __compactRuntime.CircuitContext): __compactRuntime.CircuitResults; - decimals(context: __compactRuntime.CircuitContext): __compactRuntime.CircuitResults; - tokenColor(context: __compactRuntime.CircuitContext): __compactRuntime.CircuitResults; + name(context: __compactRuntime.CircuitContext): Promise<__compactRuntime.CircuitResults>; + symbol(context: __compactRuntime.CircuitContext): Promise<__compactRuntime.CircuitResults>; + decimals(context: __compactRuntime.CircuitContext): Promise<__compactRuntime.CircuitResults>; + tokenColor(context: __compactRuntime.CircuitContext): Promise<__compactRuntime.CircuitResults>; depositUnshielded(context: __compactRuntime.CircuitContext, secret_0: Uint8Array, - amount_0: bigint): __compactRuntime.CircuitResults; + amount_0: bigint): Promise<__compactRuntime.CircuitResults>; depositShielded(context: __compactRuntime.CircuitContext, secret_0: Uint8Array, coin_0: { nonce: Uint8Array, color: Uint8Array, value: bigint - }): __compactRuntime.CircuitResults; + }): Promise<__compactRuntime.CircuitResults>; withdrawUnshielded(context: __compactRuntime.CircuitContext, secret_0: Uint8Array, amount_0: bigint, recipient_0: { is_left: boolean, left: { bytes: Uint8Array }, right: { bytes: Uint8Array } - }): __compactRuntime.CircuitResults; + }): Promise<__compactRuntime.CircuitResults>; withdrawShielded(context: __compactRuntime.CircuitContext, secret_0: Uint8Array, amount_0: bigint, recipient_0: { bytes: Uint8Array }, - nonce_0: Uint8Array): __compactRuntime.CircuitResults; - getBalance(context: __compactRuntime.CircuitContext, secret_0: Uint8Array): __compactRuntime.CircuitResults; + nonce_0: Uint8Array): Promise<__compactRuntime.CircuitResults>; + getBalance(context: __compactRuntime.CircuitContext, secret_0: Uint8Array): Promise<__compactRuntime.CircuitResults>; convertToShielded(context: __compactRuntime.CircuitContext, amount_0: bigint, recipient_0: { bytes: Uint8Array }, - nonce_0: Uint8Array): __compactRuntime.CircuitResults; + nonce_0: Uint8Array): Promise<__compactRuntime.CircuitResults>; convertToUnshielded(context: __compactRuntime.CircuitContext, coin_0: { nonce: Uint8Array, color: Uint8Array, @@ -46,44 +46,44 @@ export type ImpureCircuits = { recipient_0: { is_left: boolean, left: { bytes: Uint8Array }, right: { bytes: Uint8Array } - }): __compactRuntime.CircuitResults; + }): Promise<__compactRuntime.CircuitResults>; } export type ProvableCircuits = { - name(context: __compactRuntime.CircuitContext): __compactRuntime.CircuitResults; - symbol(context: __compactRuntime.CircuitContext): __compactRuntime.CircuitResults; - decimals(context: __compactRuntime.CircuitContext): __compactRuntime.CircuitResults; - tokenColor(context: __compactRuntime.CircuitContext): __compactRuntime.CircuitResults; + name(context: __compactRuntime.CircuitContext): Promise<__compactRuntime.CircuitResults>; + symbol(context: __compactRuntime.CircuitContext): Promise<__compactRuntime.CircuitResults>; + decimals(context: __compactRuntime.CircuitContext): Promise<__compactRuntime.CircuitResults>; + tokenColor(context: __compactRuntime.CircuitContext): Promise<__compactRuntime.CircuitResults>; depositUnshielded(context: __compactRuntime.CircuitContext, secret_0: Uint8Array, - amount_0: bigint): __compactRuntime.CircuitResults; + amount_0: bigint): Promise<__compactRuntime.CircuitResults>; depositShielded(context: __compactRuntime.CircuitContext, secret_0: Uint8Array, coin_0: { nonce: Uint8Array, color: Uint8Array, value: bigint - }): __compactRuntime.CircuitResults; + }): Promise<__compactRuntime.CircuitResults>; withdrawUnshielded(context: __compactRuntime.CircuitContext, secret_0: Uint8Array, amount_0: bigint, recipient_0: { is_left: boolean, left: { bytes: Uint8Array }, right: { bytes: Uint8Array } - }): __compactRuntime.CircuitResults; + }): Promise<__compactRuntime.CircuitResults>; withdrawShielded(context: __compactRuntime.CircuitContext, secret_0: Uint8Array, amount_0: bigint, recipient_0: { bytes: Uint8Array }, - nonce_0: Uint8Array): __compactRuntime.CircuitResults; - getBalance(context: __compactRuntime.CircuitContext, secret_0: Uint8Array): __compactRuntime.CircuitResults; + nonce_0: Uint8Array): Promise<__compactRuntime.CircuitResults>; + getBalance(context: __compactRuntime.CircuitContext, secret_0: Uint8Array): Promise<__compactRuntime.CircuitResults>; convertToShielded(context: __compactRuntime.CircuitContext, amount_0: bigint, recipient_0: { bytes: Uint8Array }, - nonce_0: Uint8Array): __compactRuntime.CircuitResults; + nonce_0: Uint8Array): Promise<__compactRuntime.CircuitResults>; convertToUnshielded(context: __compactRuntime.CircuitContext, coin_0: { nonce: Uint8Array, color: Uint8Array, @@ -92,47 +92,47 @@ export type ProvableCircuits = { recipient_0: { is_left: boolean, left: { bytes: Uint8Array }, right: { bytes: Uint8Array } - }): __compactRuntime.CircuitResults; + }): Promise<__compactRuntime.CircuitResults>; } export type PureCircuits = { } export type Circuits = { - name(context: __compactRuntime.CircuitContext): __compactRuntime.CircuitResults; - symbol(context: __compactRuntime.CircuitContext): __compactRuntime.CircuitResults; - decimals(context: __compactRuntime.CircuitContext): __compactRuntime.CircuitResults; - tokenColor(context: __compactRuntime.CircuitContext): __compactRuntime.CircuitResults; + name(context: __compactRuntime.CircuitContext): Promise<__compactRuntime.CircuitResults>; + symbol(context: __compactRuntime.CircuitContext): Promise<__compactRuntime.CircuitResults>; + decimals(context: __compactRuntime.CircuitContext): Promise<__compactRuntime.CircuitResults>; + tokenColor(context: __compactRuntime.CircuitContext): Promise<__compactRuntime.CircuitResults>; depositUnshielded(context: __compactRuntime.CircuitContext, secret_0: Uint8Array, - amount_0: bigint): __compactRuntime.CircuitResults; + amount_0: bigint): Promise<__compactRuntime.CircuitResults>; depositShielded(context: __compactRuntime.CircuitContext, secret_0: Uint8Array, coin_0: { nonce: Uint8Array, color: Uint8Array, value: bigint - }): __compactRuntime.CircuitResults; + }): Promise<__compactRuntime.CircuitResults>; withdrawUnshielded(context: __compactRuntime.CircuitContext, secret_0: Uint8Array, amount_0: bigint, recipient_0: { is_left: boolean, left: { bytes: Uint8Array }, right: { bytes: Uint8Array } - }): __compactRuntime.CircuitResults; + }): Promise<__compactRuntime.CircuitResults>; withdrawShielded(context: __compactRuntime.CircuitContext, secret_0: Uint8Array, amount_0: bigint, recipient_0: { bytes: Uint8Array }, - nonce_0: Uint8Array): __compactRuntime.CircuitResults; - getBalance(context: __compactRuntime.CircuitContext, secret_0: Uint8Array): __compactRuntime.CircuitResults; + nonce_0: Uint8Array): Promise<__compactRuntime.CircuitResults>; + getBalance(context: __compactRuntime.CircuitContext, secret_0: Uint8Array): Promise<__compactRuntime.CircuitResults>; convertToShielded(context: __compactRuntime.CircuitContext, amount_0: bigint, recipient_0: { bytes: Uint8Array }, - nonce_0: Uint8Array): __compactRuntime.CircuitResults; + nonce_0: Uint8Array): Promise<__compactRuntime.CircuitResults>; convertToUnshielded(context: __compactRuntime.CircuitContext, coin_0: { nonce: Uint8Array, color: Uint8Array, @@ -141,7 +141,7 @@ export type Circuits = { recipient_0: { is_left: boolean, left: { bytes: Uint8Array }, right: { bytes: Uint8Array } - }): __compactRuntime.CircuitResults; + }): Promise<__compactRuntime.CircuitResults>; } export type Ledger = { @@ -170,8 +170,9 @@ export declare class Contract = Witnesses> initialState(context: __compactRuntime.ConstructorContext, name__0: string, symbol__0: string, - decimals__0: bigint): __compactRuntime.ConstructorResult; + decimals__0: bigint): Promise<__compactRuntime.ConstructorResult>; } export declare function ledger(state: __compactRuntime.StateValue | __compactRuntime.ChargedState): Ledger; export declare const pureCircuits: PureCircuits; +export declare const expectedVk: Record; diff --git a/src/managed/contract/index.js b/src/managed/contract/index.js index 41ddefb..4ad29e6 100644 --- a/src/managed/contract/index.js +++ b/src/managed/contract/index.js @@ -1,5 +1,5 @@ import * as __compactRuntime from '@midnight-ntwrk/compact-runtime'; -__compactRuntime.checkRuntimeVersion('0.16.0'); +__compactRuntime.checkRuntimeVersion('0.19.0'); const _descriptor_0 = new __compactRuntime.CompactTypeUnsignedInteger(18446744073709551615n, 8); @@ -213,6 +213,8 @@ class _ShieldedSendResult_0 { const _descriptor_20 = new _ShieldedSendResult_0(); +const _descriptor_21 = new __compactRuntime.CompactTypeUnsignedInteger(4294967295n, 4); + export class Contract { witnesses; constructor(...args_0) { @@ -225,127 +227,131 @@ export class Contract { } this.witnesses = witnesses_0; this.circuits = { - name: (...args_1) => { + name: async (...args_1) => { if (args_1.length !== 1) { throw new __compactRuntime.CompactError(`name: expected 1 argument (as invoked from Typescript), received ${args_1.length}`); } const contextOrig_0 = args_1[0]; - if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.currentQueryContext != undefined)) { + if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.callContext.currentQueryContext != undefined)) { __compactRuntime.typeError('name', 'argument 1 (as invoked from Typescript)', - 'shielded-night.compact line 121 char 1', + 'shielded-night.compact line 123 char 1', 'CircuitContext', contextOrig_0) } - const context = { ...contextOrig_0, gasCost: __compactRuntime.emptyRunningCost() }; + const context = __compactRuntime.copyCircuitContext(contextOrig_0); const partialProofData = { input: { value: [], alignment: [] }, output: undefined, publicTranscript: [], privateTranscriptOutputs: [] }; - const result_0 = this._name_0(context, partialProofData); + const result_0 = await this._name_0(context, partialProofData); partialProofData.output = { value: _descriptor_10.toValue(result_0), alignment: _descriptor_10.alignment() }; - return { result: result_0, context: context, proofData: partialProofData, gasCost: context.gasCost }; + __compactRuntime.finalizeCallProofData(context, partialProofData); + return { result: result_0, context: context, gasCost: context.callContext.currentGasCost }; }, - symbol: (...args_1) => { + symbol: async (...args_1) => { if (args_1.length !== 1) { throw new __compactRuntime.CompactError(`symbol: expected 1 argument (as invoked from Typescript), received ${args_1.length}`); } const contextOrig_0 = args_1[0]; - if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.currentQueryContext != undefined)) { + if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.callContext.currentQueryContext != undefined)) { __compactRuntime.typeError('symbol', 'argument 1 (as invoked from Typescript)', - 'shielded-night.compact line 127 char 1', + 'shielded-night.compact line 129 char 1', 'CircuitContext', contextOrig_0) } - const context = { ...contextOrig_0, gasCost: __compactRuntime.emptyRunningCost() }; + const context = __compactRuntime.copyCircuitContext(contextOrig_0); const partialProofData = { input: { value: [], alignment: [] }, output: undefined, publicTranscript: [], privateTranscriptOutputs: [] }; - const result_0 = this._symbol_0(context, partialProofData); + const result_0 = await this._symbol_0(context, partialProofData); partialProofData.output = { value: _descriptor_10.toValue(result_0), alignment: _descriptor_10.alignment() }; - return { result: result_0, context: context, proofData: partialProofData, gasCost: context.gasCost }; + __compactRuntime.finalizeCallProofData(context, partialProofData); + return { result: result_0, context: context, gasCost: context.callContext.currentGasCost }; }, - decimals: (...args_1) => { + decimals: async (...args_1) => { if (args_1.length !== 1) { throw new __compactRuntime.CompactError(`decimals: expected 1 argument (as invoked from Typescript), received ${args_1.length}`); } const contextOrig_0 = args_1[0]; - if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.currentQueryContext != undefined)) { + if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.callContext.currentQueryContext != undefined)) { __compactRuntime.typeError('decimals', 'argument 1 (as invoked from Typescript)', - 'shielded-night.compact line 133 char 1', + 'shielded-night.compact line 135 char 1', 'CircuitContext', contextOrig_0) } - const context = { ...contextOrig_0, gasCost: __compactRuntime.emptyRunningCost() }; + const context = __compactRuntime.copyCircuitContext(contextOrig_0); const partialProofData = { input: { value: [], alignment: [] }, output: undefined, publicTranscript: [], privateTranscriptOutputs: [] }; - const result_0 = this._decimals_0(context, partialProofData); + const result_0 = await this._decimals_0(context, partialProofData); partialProofData.output = { value: _descriptor_9.toValue(result_0), alignment: _descriptor_9.alignment() }; - return { result: result_0, context: context, proofData: partialProofData, gasCost: context.gasCost }; + __compactRuntime.finalizeCallProofData(context, partialProofData); + return { result: result_0, context: context, gasCost: context.callContext.currentGasCost }; }, - tokenColor: (...args_1) => { + tokenColor: async (...args_1) => { if (args_1.length !== 1) { throw new __compactRuntime.CompactError(`tokenColor: expected 1 argument (as invoked from Typescript), received ${args_1.length}`); } const contextOrig_0 = args_1[0]; - if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.currentQueryContext != undefined)) { + if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.callContext.currentQueryContext != undefined)) { __compactRuntime.typeError('tokenColor', 'argument 1 (as invoked from Typescript)', - 'shielded-night.compact line 139 char 1', + 'shielded-night.compact line 141 char 1', 'CircuitContext', contextOrig_0) } - const context = { ...contextOrig_0, gasCost: __compactRuntime.emptyRunningCost() }; + const context = __compactRuntime.copyCircuitContext(contextOrig_0); const partialProofData = { input: { value: [], alignment: [] }, output: undefined, publicTranscript: [], privateTranscriptOutputs: [] }; - const result_0 = this._tokenColor_0(context, partialProofData); + const result_0 = await this._tokenColor_0(context, partialProofData); partialProofData.output = { value: _descriptor_1.toValue(result_0), alignment: _descriptor_1.alignment() }; - return { result: result_0, context: context, proofData: partialProofData, gasCost: context.gasCost }; + __compactRuntime.finalizeCallProofData(context, partialProofData); + return { result: result_0, context: context, gasCost: context.callContext.currentGasCost }; }, - depositUnshielded: (...args_1) => { + depositUnshielded: async (...args_1) => { if (args_1.length !== 3) { throw new __compactRuntime.CompactError(`depositUnshielded: expected 3 arguments (as invoked from Typescript), received ${args_1.length}`); } const contextOrig_0 = args_1[0]; const secret_0 = args_1[1]; const amount_0 = args_1[2]; - if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.currentQueryContext != undefined)) { + if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.callContext.currentQueryContext != undefined)) { __compactRuntime.typeError('depositUnshielded', 'argument 1 (as invoked from Typescript)', - 'shielded-night.compact line 207 char 1', + 'shielded-night.compact line 209 char 1', 'CircuitContext', contextOrig_0) } if (!(secret_0.buffer instanceof ArrayBuffer && secret_0.BYTES_PER_ELEMENT === 1 && secret_0.length === 32)) { __compactRuntime.typeError('depositUnshielded', 'argument 1 (argument 2 as invoked from Typescript)', - 'shielded-night.compact line 207 char 1', + 'shielded-night.compact line 209 char 1', 'Bytes<32>', secret_0) } if (!(typeof(amount_0) === 'bigint' && amount_0 >= 0n && amount_0 <= 18446744073709551615n)) { __compactRuntime.typeError('depositUnshielded', 'argument 2 (argument 3 as invoked from Typescript)', - 'shielded-night.compact line 207 char 1', + 'shielded-night.compact line 209 char 1', 'Uint<0..18446744073709551616>', amount_0) } - const context = { ...contextOrig_0, gasCost: __compactRuntime.emptyRunningCost() }; + const context = __compactRuntime.copyCircuitContext(contextOrig_0); const partialProofData = { input: { value: _descriptor_1.toValue(secret_0).concat(_descriptor_0.toValue(amount_0)), @@ -355,42 +361,43 @@ export class Contract { publicTranscript: [], privateTranscriptOutputs: [] }; - const result_0 = this._depositUnshielded_0(context, - partialProofData, - secret_0, - amount_0); + const result_0 = await this._depositUnshielded_0(context, + partialProofData, + secret_0, + amount_0); partialProofData.output = { value: [], alignment: [] }; - return { result: result_0, context: context, proofData: partialProofData, gasCost: context.gasCost }; + __compactRuntime.finalizeCallProofData(context, partialProofData); + return { result: result_0, context: context, gasCost: context.callContext.currentGasCost }; }, - depositShielded: (...args_1) => { + depositShielded: async (...args_1) => { if (args_1.length !== 3) { throw new __compactRuntime.CompactError(`depositShielded: expected 3 arguments (as invoked from Typescript), received ${args_1.length}`); } const contextOrig_0 = args_1[0]; const secret_0 = args_1[1]; const coin_0 = args_1[2]; - if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.currentQueryContext != undefined)) { + if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.callContext.currentQueryContext != undefined)) { __compactRuntime.typeError('depositShielded', 'argument 1 (as invoked from Typescript)', - 'shielded-night.compact line 237 char 1', + 'shielded-night.compact line 240 char 1', 'CircuitContext', contextOrig_0) } if (!(secret_0.buffer instanceof ArrayBuffer && secret_0.BYTES_PER_ELEMENT === 1 && secret_0.length === 32)) { __compactRuntime.typeError('depositShielded', 'argument 1 (argument 2 as invoked from Typescript)', - 'shielded-night.compact line 237 char 1', + 'shielded-night.compact line 240 char 1', 'Bytes<32>', secret_0) } if (!(typeof(coin_0) === 'object' && coin_0.nonce.buffer instanceof ArrayBuffer && coin_0.nonce.BYTES_PER_ELEMENT === 1 && coin_0.nonce.length === 32 && coin_0.color.buffer instanceof ArrayBuffer && coin_0.color.BYTES_PER_ELEMENT === 1 && coin_0.color.length === 32 && typeof(coin_0.value) === 'bigint' && coin_0.value >= 0n && coin_0.value <= 340282366920938463463374607431768211455n)) { __compactRuntime.typeError('depositShielded', 'argument 2 (argument 3 as invoked from Typescript)', - 'shielded-night.compact line 237 char 1', + 'shielded-night.compact line 240 char 1', 'struct ShieldedCoinInfo, color: Bytes<32>, value: Uint<0..340282366920938463463374607431768211456>>', coin_0) } - const context = { ...contextOrig_0, gasCost: __compactRuntime.emptyRunningCost() }; + const context = __compactRuntime.copyCircuitContext(contextOrig_0); const partialProofData = { input: { value: _descriptor_1.toValue(secret_0).concat(_descriptor_4.toValue(coin_0)), @@ -400,14 +407,15 @@ export class Contract { publicTranscript: [], privateTranscriptOutputs: [] }; - const result_0 = this._depositShielded_0(context, - partialProofData, - secret_0, - coin_0); + const result_0 = await this._depositShielded_0(context, + partialProofData, + secret_0, + coin_0); partialProofData.output = { value: [], alignment: [] }; - return { result: result_0, context: context, proofData: partialProofData, gasCost: context.gasCost }; + __compactRuntime.finalizeCallProofData(context, partialProofData); + return { result: result_0, context: context, gasCost: context.callContext.currentGasCost }; }, - withdrawUnshielded: (...args_1) => { + withdrawUnshielded: async (...args_1) => { if (args_1.length !== 4) { throw new __compactRuntime.CompactError(`withdrawUnshielded: expected 4 arguments (as invoked from Typescript), received ${args_1.length}`); } @@ -415,35 +423,35 @@ export class Contract { const secret_0 = args_1[1]; const amount_0 = args_1[2]; const recipient_0 = args_1[3]; - if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.currentQueryContext != undefined)) { + if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.callContext.currentQueryContext != undefined)) { __compactRuntime.typeError('withdrawUnshielded', 'argument 1 (as invoked from Typescript)', - 'shielded-night.compact line 269 char 1', + 'shielded-night.compact line 272 char 1', 'CircuitContext', contextOrig_0) } if (!(secret_0.buffer instanceof ArrayBuffer && secret_0.BYTES_PER_ELEMENT === 1 && secret_0.length === 32)) { __compactRuntime.typeError('withdrawUnshielded', 'argument 1 (argument 2 as invoked from Typescript)', - 'shielded-night.compact line 269 char 1', + 'shielded-night.compact line 272 char 1', 'Bytes<32>', secret_0) } if (!(typeof(amount_0) === 'bigint' && amount_0 >= 0n && amount_0 <= 18446744073709551615n)) { __compactRuntime.typeError('withdrawUnshielded', 'argument 2 (argument 3 as invoked from Typescript)', - 'shielded-night.compact line 269 char 1', + 'shielded-night.compact line 272 char 1', 'Uint<0..18446744073709551616>', amount_0) } if (!(typeof(recipient_0) === 'object' && typeof(recipient_0.is_left) === 'boolean' && typeof(recipient_0.left) === 'object' && recipient_0.left.bytes.buffer instanceof ArrayBuffer && recipient_0.left.bytes.BYTES_PER_ELEMENT === 1 && recipient_0.left.bytes.length === 32 && typeof(recipient_0.right) === 'object' && recipient_0.right.bytes.buffer instanceof ArrayBuffer && recipient_0.right.bytes.BYTES_PER_ELEMENT === 1 && recipient_0.right.bytes.length === 32)) { __compactRuntime.typeError('withdrawUnshielded', 'argument 3 (argument 4 as invoked from Typescript)', - 'shielded-night.compact line 269 char 1', + 'shielded-night.compact line 272 char 1', 'struct Either>, right: struct UserAddress>>', recipient_0) } - const context = { ...contextOrig_0, gasCost: __compactRuntime.emptyRunningCost() }; + const context = __compactRuntime.copyCircuitContext(contextOrig_0); const partialProofData = { input: { value: _descriptor_1.toValue(secret_0).concat(_descriptor_0.toValue(amount_0).concat(_descriptor_8.toValue(recipient_0))), @@ -453,15 +461,16 @@ export class Contract { publicTranscript: [], privateTranscriptOutputs: [] }; - const result_0 = this._withdrawUnshielded_0(context, - partialProofData, - secret_0, - amount_0, - recipient_0); + const result_0 = await this._withdrawUnshielded_0(context, + partialProofData, + secret_0, + amount_0, + recipient_0); partialProofData.output = { value: [], alignment: [] }; - return { result: result_0, context: context, proofData: partialProofData, gasCost: context.gasCost }; + __compactRuntime.finalizeCallProofData(context, partialProofData); + return { result: result_0, context: context, gasCost: context.callContext.currentGasCost }; }, - withdrawShielded: (...args_1) => { + withdrawShielded: async (...args_1) => { if (args_1.length !== 5) { throw new __compactRuntime.CompactError(`withdrawShielded: expected 5 arguments (as invoked from Typescript), received ${args_1.length}`); } @@ -470,42 +479,42 @@ export class Contract { const amount_0 = args_1[2]; const recipient_0 = args_1[3]; const nonce_0 = args_1[4]; - if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.currentQueryContext != undefined)) { + if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.callContext.currentQueryContext != undefined)) { __compactRuntime.typeError('withdrawShielded', 'argument 1 (as invoked from Typescript)', - 'shielded-night.compact line 317 char 1', + 'shielded-night.compact line 320 char 1', 'CircuitContext', contextOrig_0) } if (!(secret_0.buffer instanceof ArrayBuffer && secret_0.BYTES_PER_ELEMENT === 1 && secret_0.length === 32)) { __compactRuntime.typeError('withdrawShielded', 'argument 1 (argument 2 as invoked from Typescript)', - 'shielded-night.compact line 317 char 1', + 'shielded-night.compact line 320 char 1', 'Bytes<32>', secret_0) } if (!(typeof(amount_0) === 'bigint' && amount_0 >= 0n && amount_0 <= 18446744073709551615n)) { __compactRuntime.typeError('withdrawShielded', 'argument 2 (argument 3 as invoked from Typescript)', - 'shielded-night.compact line 317 char 1', + 'shielded-night.compact line 320 char 1', 'Uint<0..18446744073709551616>', amount_0) } if (!(typeof(recipient_0) === 'object' && recipient_0.bytes.buffer instanceof ArrayBuffer && recipient_0.bytes.BYTES_PER_ELEMENT === 1 && recipient_0.bytes.length === 32)) { __compactRuntime.typeError('withdrawShielded', 'argument 3 (argument 4 as invoked from Typescript)', - 'shielded-night.compact line 317 char 1', + 'shielded-night.compact line 320 char 1', 'struct ZswapCoinPublicKey>', recipient_0) } if (!(nonce_0.buffer instanceof ArrayBuffer && nonce_0.BYTES_PER_ELEMENT === 1 && nonce_0.length === 32)) { __compactRuntime.typeError('withdrawShielded', 'argument 4 (argument 5 as invoked from Typescript)', - 'shielded-night.compact line 317 char 1', + 'shielded-night.compact line 320 char 1', 'Bytes<32>', nonce_0) } - const context = { ...contextOrig_0, gasCost: __compactRuntime.emptyRunningCost() }; + const context = __compactRuntime.copyCircuitContext(contextOrig_0); const partialProofData = { input: { value: _descriptor_1.toValue(secret_0).concat(_descriptor_0.toValue(amount_0).concat(_descriptor_2.toValue(recipient_0).concat(_descriptor_1.toValue(nonce_0)))), @@ -515,36 +524,37 @@ export class Contract { publicTranscript: [], privateTranscriptOutputs: [] }; - const result_0 = this._withdrawShielded_0(context, - partialProofData, - secret_0, - amount_0, - recipient_0, - nonce_0); + const result_0 = await this._withdrawShielded_0(context, + partialProofData, + secret_0, + amount_0, + recipient_0, + nonce_0); partialProofData.output = { value: _descriptor_4.toValue(result_0), alignment: _descriptor_4.alignment() }; - return { result: result_0, context: context, proofData: partialProofData, gasCost: context.gasCost }; + __compactRuntime.finalizeCallProofData(context, partialProofData); + return { result: result_0, context: context, gasCost: context.callContext.currentGasCost }; }, - getBalance: (...args_1) => { + getBalance: async (...args_1) => { if (args_1.length !== 2) { throw new __compactRuntime.CompactError(`getBalance: expected 2 arguments (as invoked from Typescript), received ${args_1.length}`); } const contextOrig_0 = args_1[0]; const secret_0 = args_1[1]; - if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.currentQueryContext != undefined)) { + if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.callContext.currentQueryContext != undefined)) { __compactRuntime.typeError('getBalance', 'argument 1 (as invoked from Typescript)', - 'shielded-night.compact line 344 char 1', + 'shielded-night.compact line 347 char 1', 'CircuitContext', contextOrig_0) } if (!(secret_0.buffer instanceof ArrayBuffer && secret_0.BYTES_PER_ELEMENT === 1 && secret_0.length === 32)) { __compactRuntime.typeError('getBalance', 'argument 1 (argument 2 as invoked from Typescript)', - 'shielded-night.compact line 344 char 1', + 'shielded-night.compact line 347 char 1', 'Bytes<32>', secret_0) } - const context = { ...contextOrig_0, gasCost: __compactRuntime.emptyRunningCost() }; + const context = __compactRuntime.copyCircuitContext(contextOrig_0); const partialProofData = { input: { value: _descriptor_1.toValue(secret_0), @@ -554,11 +564,14 @@ export class Contract { publicTranscript: [], privateTranscriptOutputs: [] }; - const result_0 = this._getBalance_0(context, partialProofData, secret_0); + const result_0 = await this._getBalance_0(context, + partialProofData, + secret_0); partialProofData.output = { value: _descriptor_3.toValue(result_0), alignment: _descriptor_3.alignment() }; - return { result: result_0, context: context, proofData: partialProofData, gasCost: context.gasCost }; + __compactRuntime.finalizeCallProofData(context, partialProofData); + return { result: result_0, context: context, gasCost: context.callContext.currentGasCost }; }, - convertToShielded: (...args_1) => { + convertToShielded: async (...args_1) => { if (args_1.length !== 4) { throw new __compactRuntime.CompactError(`convertToShielded: expected 4 arguments (as invoked from Typescript), received ${args_1.length}`); } @@ -566,35 +579,35 @@ export class Contract { const amount_0 = args_1[1]; const recipient_0 = args_1[2]; const nonce_0 = args_1[3]; - if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.currentQueryContext != undefined)) { + if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.callContext.currentQueryContext != undefined)) { __compactRuntime.typeError('convertToShielded', 'argument 1 (as invoked from Typescript)', - 'shielded-night.compact line 370 char 1', + 'shielded-night.compact line 373 char 1', 'CircuitContext', contextOrig_0) } if (!(typeof(amount_0) === 'bigint' && amount_0 >= 0n && amount_0 <= 18446744073709551615n)) { __compactRuntime.typeError('convertToShielded', 'argument 1 (argument 2 as invoked from Typescript)', - 'shielded-night.compact line 370 char 1', + 'shielded-night.compact line 373 char 1', 'Uint<0..18446744073709551616>', amount_0) } if (!(typeof(recipient_0) === 'object' && recipient_0.bytes.buffer instanceof ArrayBuffer && recipient_0.bytes.BYTES_PER_ELEMENT === 1 && recipient_0.bytes.length === 32)) { __compactRuntime.typeError('convertToShielded', 'argument 2 (argument 3 as invoked from Typescript)', - 'shielded-night.compact line 370 char 1', + 'shielded-night.compact line 373 char 1', 'struct ZswapCoinPublicKey>', recipient_0) } if (!(nonce_0.buffer instanceof ArrayBuffer && nonce_0.BYTES_PER_ELEMENT === 1 && nonce_0.length === 32)) { __compactRuntime.typeError('convertToShielded', 'argument 3 (argument 4 as invoked from Typescript)', - 'shielded-night.compact line 370 char 1', + 'shielded-night.compact line 373 char 1', 'Bytes<32>', nonce_0) } - const context = { ...contextOrig_0, gasCost: __compactRuntime.emptyRunningCost() }; + const context = __compactRuntime.copyCircuitContext(contextOrig_0); const partialProofData = { input: { value: _descriptor_0.toValue(amount_0).concat(_descriptor_2.toValue(recipient_0).concat(_descriptor_1.toValue(nonce_0))), @@ -604,43 +617,44 @@ export class Contract { publicTranscript: [], privateTranscriptOutputs: [] }; - const result_0 = this._convertToShielded_0(context, - partialProofData, - amount_0, - recipient_0, - nonce_0); + const result_0 = await this._convertToShielded_0(context, + partialProofData, + amount_0, + recipient_0, + nonce_0); partialProofData.output = { value: _descriptor_4.toValue(result_0), alignment: _descriptor_4.alignment() }; - return { result: result_0, context: context, proofData: partialProofData, gasCost: context.gasCost }; + __compactRuntime.finalizeCallProofData(context, partialProofData); + return { result: result_0, context: context, gasCost: context.callContext.currentGasCost }; }, - convertToUnshielded: (...args_1) => { + convertToUnshielded: async (...args_1) => { if (args_1.length !== 3) { throw new __compactRuntime.CompactError(`convertToUnshielded: expected 3 arguments (as invoked from Typescript), received ${args_1.length}`); } const contextOrig_0 = args_1[0]; const coin_0 = args_1[1]; const recipient_0 = args_1[2]; - if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.currentQueryContext != undefined)) { + if (!(typeof(contextOrig_0) === 'object' && contextOrig_0.callContext.currentQueryContext != undefined)) { __compactRuntime.typeError('convertToUnshielded', 'argument 1 (as invoked from Typescript)', - 'shielded-night.compact line 405 char 1', + 'shielded-night.compact line 408 char 1', 'CircuitContext', contextOrig_0) } if (!(typeof(coin_0) === 'object' && coin_0.nonce.buffer instanceof ArrayBuffer && coin_0.nonce.BYTES_PER_ELEMENT === 1 && coin_0.nonce.length === 32 && coin_0.color.buffer instanceof ArrayBuffer && coin_0.color.BYTES_PER_ELEMENT === 1 && coin_0.color.length === 32 && typeof(coin_0.value) === 'bigint' && coin_0.value >= 0n && coin_0.value <= 340282366920938463463374607431768211455n)) { __compactRuntime.typeError('convertToUnshielded', 'argument 1 (argument 2 as invoked from Typescript)', - 'shielded-night.compact line 405 char 1', + 'shielded-night.compact line 408 char 1', 'struct ShieldedCoinInfo, color: Bytes<32>, value: Uint<0..340282366920938463463374607431768211456>>', coin_0) } if (!(typeof(recipient_0) === 'object' && typeof(recipient_0.is_left) === 'boolean' && typeof(recipient_0.left) === 'object' && recipient_0.left.bytes.buffer instanceof ArrayBuffer && recipient_0.left.bytes.BYTES_PER_ELEMENT === 1 && recipient_0.left.bytes.length === 32 && typeof(recipient_0.right) === 'object' && recipient_0.right.bytes.buffer instanceof ArrayBuffer && recipient_0.right.bytes.BYTES_PER_ELEMENT === 1 && recipient_0.right.bytes.length === 32)) { __compactRuntime.typeError('convertToUnshielded', 'argument 2 (argument 3 as invoked from Typescript)', - 'shielded-night.compact line 405 char 1', + 'shielded-night.compact line 408 char 1', 'struct Either>, right: struct UserAddress>>', recipient_0) } - const context = { ...contextOrig_0, gasCost: __compactRuntime.emptyRunningCost() }; + const context = __compactRuntime.copyCircuitContext(contextOrig_0); const partialProofData = { input: { value: _descriptor_4.toValue(coin_0).concat(_descriptor_8.toValue(recipient_0)), @@ -650,12 +664,13 @@ export class Contract { publicTranscript: [], privateTranscriptOutputs: [] }; - const result_0 = this._convertToUnshielded_0(context, - partialProofData, - coin_0, - recipient_0); + const result_0 = await this._convertToUnshielded_0(context, + partialProofData, + coin_0, + recipient_0); partialProofData.output = { value: [], alignment: [] }; - return { result: result_0, context: context, proofData: partialProofData, gasCost: context.gasCost }; + __compactRuntime.finalizeCallProofData(context, partialProofData); + return { result: result_0, context: context, gasCost: context.callContext.currentGasCost }; } }; this.impureCircuits = { @@ -685,7 +700,7 @@ export class Contract { convertToUnshielded: this.circuits.convertToUnshielded }; } - initialState(...args_0) { + async initialState(...args_0) { if (args_0.length !== 4) { throw new __compactRuntime.CompactError(`Contract state constructor: expected 4 arguments (as invoked from Typescript), received ${args_0.length}`); } @@ -702,10 +717,24 @@ export class Contract { if (typeof(constructorContext_0.initialZswapLocalState) !== 'object') { throw new __compactRuntime.CompactError(`Contract state constructor: expected 'initialZswapLocalState' in argument 1 (as invoked from Typescript) to be an object`); } + if (!(typeof (name__0) === 'string')) { + __compactRuntime.typeError('Contract state constructor', + 'argument 1 (argument 2 as invoked from Typescript)', + 'shielded-night.compact line 113 char 1', + 'Opaque<"string">', + name__0) + } + if (!(typeof (symbol__0) === 'string')) { + __compactRuntime.typeError('Contract state constructor', + 'argument 2 (argument 3 as invoked from Typescript)', + 'shielded-night.compact line 113 char 1', + 'Opaque<"string">', + symbol__0) + } if (!(typeof(decimals__0) === 'bigint' && decimals__0 >= 0n && decimals__0 <= 255n)) { __compactRuntime.typeError('Contract state constructor', 'argument 3 (argument 4 as invoked from Typescript)', - 'shielded-night.compact line 111 char 1', + 'shielded-night.compact line 113 char 1', 'Uint<0..256>', decimals__0) } @@ -727,7 +756,7 @@ export class Contract { state_0.setOperation('getBalance', new __compactRuntime.ContractOperation()); state_0.setOperation('convertToShielded', new __compactRuntime.ContractOperation()); state_0.setOperation('convertToUnshielded', new __compactRuntime.ContractOperation()); - const context = __compactRuntime.createCircuitContext(__compactRuntime.dummyContractAddress(), constructorContext_0.initialZswapLocalState.coinPublicKey, state_0.data, constructorContext_0.initialPrivateState); + const context = __compactRuntime.createCircuitContext('constructor', __compactRuntime.dummyContractAddress(), constructorContext_0.initialZswapLocalState.coinPublicKey, state_0.data, constructorContext_0.initialPrivateState); const partialProofData = { input: { value: [], alignment: [] }, output: undefined, @@ -805,11 +834,11 @@ export class Contract { value: __compactRuntime.StateValue.newCell({ value: _descriptor_9.toValue(decimals__0), alignment: _descriptor_9.alignment() }).encode() } }, { ins: { cached: false, n: 1 } }]); - state_0.data = new __compactRuntime.ChargedState(context.currentQueryContext.state.state); + state_0.data = new __compactRuntime.ChargedState(context.callContext.currentQueryContext.state.state); return { currentContractState: state_0, - currentPrivateState: context.currentPrivateState, - currentZswapLocalState: context.currentZswapLocalState + currentPrivateState: context.callContext.currentPrivateState, + currentZswapLocalState: context.callContext.currentZswapLocalState } } _some_0(value_0) { return { is_some: true, value: value_0 }; } @@ -834,12 +863,12 @@ export class Contract { return this._persistentCommit_0([domain_sep_0, contractAddress_0.bytes], new Uint8Array([109, 105, 100, 110, 105, 103, 104, 116, 58, 100, 101, 114, 105, 118, 101, 95, 116, 111, 107, 101, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])); } - _mintShieldedToken_0(context, - partialProofData, - domain_sep_0, - value_0, - nonce_0, - recipient_0) + async _mintShieldedToken_0(context, + partialProofData, + domain_sep_0, + value_0, + nonce_0, + recipient_0) { const coin_0 = { nonce: nonce_0, color: @@ -945,7 +974,7 @@ export class Contract { _shieldedBurnAddress_0() { return this._left_0({ bytes: new Uint8Array(32) }); } - _receiveShielded_0(context, partialProofData, coin_0) { + async _receiveShielded_0(context, partialProofData, coin_0) { const recipient_0 = this._right_0(_descriptor_6.fromValue(__compactRuntime.queryLedgerState(context, partialProofData, [ @@ -979,7 +1008,8 @@ export class Contract { { swap: { n: 0 } }]); return []; } - _sendShielded_0(context, partialProofData, input_0, recipient_0, value_0) { + async _sendShielded_0(context, partialProofData, input_0, recipient_0, value_0) + { const selfAddr_0 = _descriptor_6.fromValue(__compactRuntime.queryLedgerState(context, partialProofData, [ @@ -1018,9 +1048,11 @@ export class Contract { 'result of subtraction would be negative'), t_0 - value_0)); const output_0 = { nonce: - this._upgradeFromTransient_0(this._transientHash_0([__compactRuntime.convertBytesToField(28, - new Uint8Array([109, 105, 100, 110, 105, 103, 104, 116, 58, 107, 101, 114, 110, 101, 108, 58, 110, 111, 110, 99, 101, 95, 101, 118, 111, 108, 118, 101]), - ''), + this._upgradeFromTransient_0(this._transientHash_0([__compactRuntime.convertBytesToUint(52435875175126190479447740508185965837690552500527637822603658699938581184512n, + 28, + new Uint8Array([109, 105, 100, 110, 105, 103, 104, 116, 58, 107, 101, 114, 110, 101, 108, 58, 110, 111, 110, 99, 101, 95, 101, 118, 111, 108, 118, 101]), + 'Field', + ''), this._degradeToTransient_0(input_0.nonce)])), color: input_0.color, value: value_0 }; @@ -1066,13 +1098,15 @@ export class Contract { { ins: { cached: true, n: 2 } }, { swap: { n: 0 } }]); } - if (this._equal_2(change_0, 0n)) { + if (change_0 === 0n) { return { change: this._none_0(), sent: output_0 }; } else { const changeCoin_0 = { nonce: - this._upgradeFromTransient_0(this._transientHash_0([__compactRuntime.convertBytesToField(30, - new Uint8Array([109, 105, 100, 110, 105, 103, 104, 116, 58, 107, 101, 114, 110, 101, 108, 58, 110, 111, 110, 99, 101, 95, 101, 118, 111, 108, 118, 101, 47, 50]), - ''), + this._upgradeFromTransient_0(this._transientHash_0([__compactRuntime.convertBytesToUint(52435875175126190479447740508185965837690552500527637822603658699938581184512n, + 30, + new Uint8Array([109, 105, 100, 110, 105, 103, 104, 116, 58, 107, 101, 114, 110, 101, 108, 58, 110, 111, 110, 99, 101, 95, 101, 118, 111, 108, 118, 101, 47, 50]), + 'Field', + ''), this._degradeToTransient_0(input_0.nonce)])), color: input_0.color, value: change_0 }; @@ -1119,13 +1153,17 @@ export class Contract { return { change: this._some_0(changeCoin_0), sent: output_0 }; } } - _sendImmediateShielded_0(context, partialProofData, input_0, target_0, value_0) + async _sendImmediateShielded_0(context, + partialProofData, + input_0, + target_0, + value_0) { - return this._sendShielded_0(context, - partialProofData, - this._upcastQualifiedCoin_0(input_0), - target_0, - value_0); + return await this._sendShielded_0(context, + partialProofData, + this._upcastQualifiedCoin_0(input_0), + target_0, + value_0); } _downcastQualifiedCoin_0(coin_0) { return { nonce: coin_0.nonce, color: coin_0.color, value: coin_0.value }; @@ -1153,7 +1191,12 @@ export class Contract { dataType: false, data: addr_0.bytes }); } - _sendUnshielded_0(context, partialProofData, color_0, amount_0, recipient_0) { + async _sendUnshielded_0(context, + partialProofData, + color_0, + amount_0, + recipient_0) + { const tmp_0 = this._left_1(color_0); __compactRuntime.queryLedgerState(context, partialProofData, @@ -1222,7 +1265,7 @@ export class Contract { { swap: { n: 0 } }]); if (recipient_0.is_left && - this._equal_3(recipient_0.left.bytes, + this._equal_2(recipient_0.left.bytes, _descriptor_6.fromValue(__compactRuntime.queryLedgerState(context, partialProofData, [ @@ -1270,7 +1313,7 @@ export class Contract { } return []; } - _receiveUnshielded_0(context, partialProofData, color_0, amount_0) { + async _receiveUnshielded_0(context, partialProofData, color_0, amount_0) { const tmp_0 = this._left_1(color_0); __compactRuntime.queryLedgerState(context, partialProofData, @@ -1351,7 +1394,7 @@ export class Contract { _wrapDomain_0() { return new Uint8Array([115, 104, 105, 101, 108, 100, 101, 100, 45, 110, 105, 103, 104, 116, 58, 119, 114, 97, 112, 112, 101, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); } - _wrapColor_0(context, partialProofData) { + async _wrapColor_0(context, partialProofData) { return this._tokenType_0(this._wrapDomain_0(), _descriptor_6.fromValue(__compactRuntime.queryLedgerState(context, partialProofData, @@ -1366,7 +1409,7 @@ export class Contract { { popeq: { cached: true, result: undefined } }]).value)); } - _name_0(context, partialProofData) { + async _name_0(context, partialProofData) { return _descriptor_10.fromValue(__compactRuntime.queryLedgerState(context, partialProofData, [ @@ -1380,7 +1423,7 @@ export class Contract { { popeq: { cached: false, result: undefined } }]).value); } - _symbol_0(context, partialProofData) { + async _symbol_0(context, partialProofData) { return _descriptor_10.fromValue(__compactRuntime.queryLedgerState(context, partialProofData, [ @@ -1394,7 +1437,7 @@ export class Contract { { popeq: { cached: false, result: undefined } }]).value); } - _decimals_0(context, partialProofData) { + async _decimals_0(context, partialProofData) { return _descriptor_9.fromValue(__compactRuntime.queryLedgerState(context, partialProofData, [ @@ -1408,14 +1451,14 @@ export class Contract { { popeq: { cached: false, result: undefined } }]).value); } - _tokenColor_0(context, partialProofData) { - return this._wrapColor_0(context, partialProofData); + async _tokenColor_0(context, partialProofData) { + return await this._wrapColor_0(context, partialProofData); } _getBalanceKey_0(secret_0) { return this._persistentHash_0([new Uint8Array([115, 104, 105, 101, 108, 100, 101, 100, 45, 110, 105, 103, 104, 116, 58, 98, 97, 108, 97, 110, 99, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), secret_0]); } - _creditKey_0(context, partialProofData, balanceKey_0, amount_0) { + async _creditKey_0(context, partialProofData, balanceKey_0, amount_0) { __compactRuntime.assert(amount_0 > 0n, 'amount must be positive'); if (!_descriptor_5.fromValue(__compactRuntime.queryLedgerState(context, partialProofData, @@ -1455,7 +1498,7 @@ export class Contract { } const tmp_1 = ((t1) => { if (t1 > 340282366920938463463374607431768211455n) { - throw new __compactRuntime.CompactError('shielded-night.compact line 170 char 31: cast from Field or Uint value to smaller Uint value failed: ' + t1 + ' is greater than 340282366920938463463374607431768211455'); + throw new __compactRuntime.CompactError('shielded-night.compact line 172 char 31: cast from Field or Uint value to smaller Uint value failed: ' + t1 + ' is greater than 340282366920938463463374607431768211455'); } return t1; })(_descriptor_3.fromValue(__compactRuntime.queryLedgerState(context, @@ -1497,7 +1540,7 @@ export class Contract { { ins: { cached: true, n: 1 } }]); return []; } - _debitKey_0(context, partialProofData, balanceKey_0, amount_0) { + async _debitKey_0(context, partialProofData, balanceKey_0, amount_0) { __compactRuntime.assert(amount_0 > 0n, 'amount must be positive'); __compactRuntime.assert(_descriptor_5.fromValue(__compactRuntime.queryLedgerState(context, partialProofData, @@ -1557,90 +1600,90 @@ export class Contract { { ins: { cached: true, n: 1 } }]); return []; } - _depositUnshielded_0(context, partialProofData, secret_0, amount_0) { + async _depositUnshielded_0(context, partialProofData, secret_0, amount_0) { __compactRuntime.assert(amount_0 > 0n, 'amount must be positive'); const amt_0 = amount_0; - this._receiveUnshielded_0(context, - partialProofData, - this._nativeToken_0(), - amt_0); - this._creditKey_0(context, - partialProofData, - this._getBalanceKey_0(secret_0), - amt_0); + await this._receiveUnshielded_0(context, + partialProofData, + this._nativeToken_0(), + amt_0); + await this._creditKey_0(context, + partialProofData, + this._getBalanceKey_0(secret_0), + amt_0); return []; } - _depositShielded_0(context, partialProofData, secret_0, coin_0) { + async _depositShielded_0(context, partialProofData, secret_0, coin_0) { const c_0 = coin_0; let t_0; __compactRuntime.assert((t_0 = c_0.value, t_0 > 0n), 'coin value must be positive'); - __compactRuntime.assert(this._equal_4(c_0.color, - this._wrapColor_0(context, - partialProofData)), + __compactRuntime.assert(this._equal_3(c_0.color, + await this._wrapColor_0(context, + partialProofData)), "not this contract's shielded wrapper"); - this._receiveShielded_0(context, partialProofData, c_0); - this._sendImmediateShielded_0(context, - partialProofData, - c_0, - this._shieldedBurnAddress_0(), - c_0.value); - this._creditKey_0(context, - partialProofData, - this._getBalanceKey_0(secret_0), - c_0.value); + await this._receiveShielded_0(context, partialProofData, c_0); + await this._sendImmediateShielded_0(context, + partialProofData, + c_0, + this._shieldedBurnAddress_0(), + c_0.value); + await this._creditKey_0(context, + partialProofData, + this._getBalanceKey_0(secret_0), + c_0.value); return []; } - _withdrawUnshielded_0(context, - partialProofData, - secret_0, - amount_0, - recipient_0) + async _withdrawUnshielded_0(context, + partialProofData, + secret_0, + amount_0, + recipient_0) { __compactRuntime.assert(amount_0 > 0n, 'amount must be positive'); __compactRuntime.assert(recipient_0.is_left ? - !this._equal_5({ bytes: new Uint8Array(32) }, + !this._equal_4({ bytes: new Uint8Array(32) }, recipient_0.left) : - !this._equal_6({ bytes: new Uint8Array(32) }, + !this._equal_5({ bytes: new Uint8Array(32) }, recipient_0.right), 'invalid recipient'); const _amount_0 = amount_0; - this._debitKey_0(context, - partialProofData, - this._getBalanceKey_0(secret_0), - _amount_0); - this._sendUnshielded_0(context, + await this._debitKey_0(context, partialProofData, - this._nativeToken_0(), - _amount_0, - recipient_0); + this._getBalanceKey_0(secret_0), + _amount_0); + await this._sendUnshielded_0(context, + partialProofData, + this._nativeToken_0(), + _amount_0, + recipient_0); return []; } - _withdrawShielded_0(context, - partialProofData, - secret_0, - amount_0, - recipient_0, - nonce_0) + async _withdrawShielded_0(context, + partialProofData, + secret_0, + amount_0, + recipient_0, + nonce_0) { __compactRuntime.assert(amount_0 > 0n, 'amount must be positive'); - __compactRuntime.assert(!this._equal_7({ bytes: new Uint8Array(32) }, + __compactRuntime.assert(!this._equal_6({ bytes: new Uint8Array(32) }, recipient_0), 'invalid recipient'); const _amount_0 = amount_0; - this._debitKey_0(context, - partialProofData, - this._getBalanceKey_0(secret_0), - _amount_0); - return this._mintShieldedToken_0(context, - partialProofData, - this._wrapDomain_0(), - _amount_0, - nonce_0, - this._left_0(recipient_0)); - } - _getBalance_0(context, partialProofData, secret_0) { + await this._debitKey_0(context, + partialProofData, + this._getBalanceKey_0(secret_0), + _amount_0); + return await this._mintShieldedToken_0(context, + partialProofData, + this._wrapDomain_0(), + _amount_0, + nonce_0, + this._left_0(recipient_0)); + } + async _getBalance_0(context, partialProofData, secret_0) { const tmp_0 = this._getBalanceKey_0(secret_0); return _descriptor_3.fromValue(__compactRuntime.queryLedgerState(context, partialProofData, @@ -1661,46 +1704,50 @@ export class Contract { { popeq: { cached: false, result: undefined } }]).value); } - _convertToShielded_0(context, partialProofData, amount_0, recipient_0, nonce_0) + async _convertToShielded_0(context, + partialProofData, + amount_0, + recipient_0, + nonce_0) { __compactRuntime.assert(amount_0 > 0n, 'amount must be positive'); - __compactRuntime.assert(!this._equal_8({ bytes: new Uint8Array(32) }, + __compactRuntime.assert(!this._equal_7({ bytes: new Uint8Array(32) }, recipient_0), 'invalid recipient'); const amt_0 = amount_0; - this._receiveUnshielded_0(context, - partialProofData, - this._nativeToken_0(), - amt_0); - return this._mintShieldedToken_0(context, - partialProofData, - this._wrapDomain_0(), - amt_0, - nonce_0, - this._left_0(recipient_0)); - } - _convertToUnshielded_0(context, partialProofData, coin_0, recipient_0) { + await this._receiveUnshielded_0(context, + partialProofData, + this._nativeToken_0(), + amt_0); + return await this._mintShieldedToken_0(context, + partialProofData, + this._wrapDomain_0(), + amt_0, + nonce_0, + this._left_0(recipient_0)); + } + async _convertToUnshielded_0(context, partialProofData, coin_0, recipient_0) { const c_0 = coin_0; let t_0; __compactRuntime.assert((t_0 = c_0.value, t_0 > 0n), 'coin value must be positive'); - __compactRuntime.assert(this._equal_9(c_0.color, - this._wrapColor_0(context, - partialProofData)), + __compactRuntime.assert(this._equal_8(c_0.color, + await this._wrapColor_0(context, + partialProofData)), "not this contract's shielded wrapper"); __compactRuntime.assert(recipient_0.is_left ? - !this._equal_10({ bytes: new Uint8Array(32) }, - recipient_0.left) + !this._equal_9({ bytes: new Uint8Array(32) }, + recipient_0.left) : - !this._equal_11({ bytes: new Uint8Array(32) }, + !this._equal_10({ bytes: new Uint8Array(32) }, recipient_0.right), 'invalid recipient'); - this._receiveShielded_0(context, partialProofData, c_0); - this._sendUnshielded_0(context, - partialProofData, - this._nativeToken_0(), - c_0.value, - recipient_0); + await this._receiveShielded_0(context, partialProofData, c_0); + await this._sendUnshielded_0(context, + partialProofData, + this._nativeToken_0(), + c_0.value, + recipient_0); return []; } _equal_0(x0, y0) { @@ -1712,7 +1759,7 @@ export class Contract { return true; } _equal_2(x0, y0) { - if (x0 !== y0) { return false; } + if (!x0.every((x, i) => y0[i] === x)) { return false; } return true; } _equal_3(x0, y0) { @@ -1720,10 +1767,6 @@ export class Contract { return true; } _equal_4(x0, y0) { - if (!x0.every((x, i) => y0[i] === x)) { return false; } - return true; - } - _equal_5(x0, y0) { { let x1 = x0.bytes; let y1 = y0.bytes; @@ -1731,7 +1774,7 @@ export class Contract { } return true; } - _equal_6(x0, y0) { + _equal_5(x0, y0) { { let x1 = x0.bytes; let y1 = y0.bytes; @@ -1739,7 +1782,7 @@ export class Contract { } return true; } - _equal_7(x0, y0) { + _equal_6(x0, y0) { { let x1 = x0.bytes; let y1 = y0.bytes; @@ -1747,7 +1790,7 @@ export class Contract { } return true; } - _equal_8(x0, y0) { + _equal_7(x0, y0) { { let x1 = x0.bytes; let y1 = y0.bytes; @@ -1755,11 +1798,11 @@ export class Contract { } return true; } - _equal_9(x0, y0) { + _equal_8(x0, y0) { if (!x0.every((x, i) => y0[i] === x)) { return false; } return true; } - _equal_10(x0, y0) { + _equal_9(x0, y0) { { let x1 = x0.bytes; let y1 = y0.bytes; @@ -1767,7 +1810,7 @@ export class Contract { } return true; } - _equal_11(x0, y0) { + _equal_10(x0, y0) { { let x1 = x0.bytes; let y1 = y0.bytes; @@ -1780,7 +1823,7 @@ export function ledger(stateOrChargedState) { const state = stateOrChargedState instanceof __compactRuntime.StateValue ? stateOrChargedState : stateOrChargedState.state; const chargedState = stateOrChargedState instanceof __compactRuntime.StateValue ? new __compactRuntime.ChargedState(stateOrChargedState) : stateOrChargedState; const context = { - currentQueryContext: new __compactRuntime.QueryContext(chargedState, __compactRuntime.dummyContractAddress()), + callContext: { currentQueryContext: new __compactRuntime.QueryContext(chargedState, __compactRuntime.dummyContractAddress()), currentGasCost: __compactRuntime.emptyRunningCost() }, costModel: __compactRuntime.CostModel.initialCostModel() }; const partialProofData = { @@ -1839,7 +1882,7 @@ export function ledger(stateOrChargedState) { if (!(key_0.buffer instanceof ArrayBuffer && key_0.BYTES_PER_ELEMENT === 1 && key_0.length === 32)) { __compactRuntime.typeError('member', 'argument 1', - 'shielded-night.compact line 53 char 1', + 'shielded-night.compact line 55 char 1', 'Bytes<32>', key_0) } @@ -1868,7 +1911,7 @@ export function ledger(stateOrChargedState) { if (!(key_0.buffer instanceof ArrayBuffer && key_0.BYTES_PER_ELEMENT === 1 && key_0.length === 32)) { __compactRuntime.typeError('lookup', 'argument 1', - 'shielded-night.compact line 53 char 1', + 'shielded-night.compact line 55 char 1', 'Bytes<32>', key_0) } @@ -1944,10 +1987,24 @@ export function ledger(stateOrChargedState) { }; } const _emptyContext = { - currentQueryContext: new __compactRuntime.QueryContext(new __compactRuntime.ContractState().data, __compactRuntime.dummyContractAddress()) + callContext: { currentQueryContext: new __compactRuntime.QueryContext(new __compactRuntime.ContractState().data, __compactRuntime.dummyContractAddress()), currentGasCost: __compactRuntime.emptyRunningCost() } }; const _dummyContract = new Contract({ }); export const pureCircuits = {}; export const contractReferenceLocations = { tag: 'publicLedgerArray', indices: { } }; +export const expectedVk = { + 'convertToShielded': 'ceb794f4a07d5d0f4a200a364cc6334f6b3a8f08fa5a37ba3c99edac4da968eb', + 'convertToUnshielded': '527e93c8b02cc14d86c625834d874556183d5e45ea615338bbe4966fb503eb4d', + 'decimals': '95a209a810ddd347aa984bb6c6a5c57ba66ef29b4221f1fafd3f04e1fa4fdec9', + 'depositShielded': '50ec1aa10bc46a20ecfdaae1fb3354cff6c33dc61fa5c97b3e49e87878cba46c', + 'depositUnshielded': '72e482e604354b866f7cab1852144c091d06bd913e9a5bd8979046275d88fdc2', + 'getBalance': '7981e85490a0d425652636da8c3b5aa9a3d998ce72ef04c16d3524dba08416bf', + 'name': 'b36a8137f9cb7bce5546e12d5194c5e72a8caa1b11441c35a0f2379246e04387', + 'symbol': '21005ce77566c9a7f5fed12b07c79796abd19b6d6afbc6553ae6aeb9e908b6d9', + 'tokenColor': '904cecd3fab66d4f598eee1d90709771e735695cff5344c71cf8afc31a319b5d', + 'withdrawShielded': '71019ebd128964628325541c6a14db941c2dbf024689525132a1e13dff457b42', + 'withdrawUnshielded': 'b04e3748e1b1146648f490531eabf874f6fa8bb1331680c458b234125a590a37', +}; + //# sourceMappingURL=index.js.map diff --git a/src/managed/contract/index.js.map b/src/managed/contract/index.js.map index 6a49d9a..bc4c27b 100644 --- a/src/managed/contract/index.js.map +++ b/src/managed/contract/index.js.map @@ -2,7 +2,7 @@ "version": 3, "file": "index.js", "sourceRoot": "../../../", - "sources": ["src/shielded-night.compact", "compiler/standard-library.compact"], + "sources": ["src/shielded-night.compact", "compiler/standard-library.compact", "compiler/zkir-v3-library.compact"], "names": [], - "mappings": "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" + "mappings": "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" } diff --git a/src/shielded-night.compact b/src/shielded-night.compact index c41e0f2..4210ab1 100644 --- a/src/shielded-night.compact +++ b/src/shielded-night.compact @@ -1,10 +1,12 @@ // SPDX-License-Identifier: Apache-2.0 -// Pinned to the exact language version the deployed build was compiled with -// (toolchain 0.31.1 = compactc 0.31.101, language 0.23.101). An exact pin is -// what makes the byte-exact reproduction in README "Verifying the deployment" -// meaningful: a different language version would refuse to compile rather than -// silently emit different artifacts. -pragma language_version 0.23; +// Pinned to the exact language version the deployed build was compiled with. +// On this branch (`ledger-v9`) that is toolchain 0.34.0 = compactc 0.34.0, +// language 0.26.0, runtime 0.19.0, ledger 9. (`main` stays on toolchain 0.31.1 +// = language 0.23 for the 1.x/preview line.) An exact pin is what makes the +// byte-exact reproduction in README "Verifying the deployment" meaningful: a +// different language version would refuse to compile rather than silently emit +// different artifacts. +pragma language_version 0.26; import CompactStandardLibrary; @@ -224,7 +226,8 @@ export circuit depositUnshielded(secret: Bytes<32>, amount: Uint<64>): [] { * returned. * * @dev The burn transient requires a wallet on toolchain 0.31.101+ / ledger-v8 - * 8.1.0; older wallets failed to mark the spent input UTXO as spent. + * 8.1.0 (or, on this `ledger-v9` branch, toolchain 0.34.0 / ledger-v9 1.0.0-rc.3); + * older wallets failed to mark the spent input UTXO as spent. * * Requirements: * diff --git a/test/integration/shielded-night.combined.test.ts b/test/integration/shielded-night.combined.test.ts index a672706..a3b1def 100644 --- a/test/integration/shielded-night.combined.test.ts +++ b/test/integration/shielded-night.combined.test.ts @@ -1,4 +1,4 @@ -import * as ledgerV8 from '@midnight-ntwrk/ledger-v8'; +import * as ledgerV9 from '@midnightntwrk/ledger-v9'; import { describe, expect } from 'vitest'; import * as contract from '../support/shielded-night.js'; import { describeContract } from '../support/describe-contract.js'; @@ -14,7 +14,7 @@ import { } from '../support/wallet-observations.js'; const N = 1_000_000n; // 1 NIGHT -const NIGHT_HEX = ledgerV8.unshieldedToken().raw; +const NIGHT_HEX = ledgerV9.unshieldedToken().raw; /** * The decisive experiment: can a SINGLE transaction both receive unshielded diff --git a/test/integration/shielded-night.multiparty.test.ts b/test/integration/shielded-night.multiparty.test.ts index 6e84c3b..e1ed97e 100644 --- a/test/integration/shielded-night.multiparty.test.ts +++ b/test/integration/shielded-night.multiparty.test.ts @@ -16,9 +16,9 @@ import { waitForShieldedBalance, waitForUnshieldedBalance, } from '../support/wallet-observations.js'; -import * as ledgerV8 from '@midnight-ntwrk/ledger-v8'; +import * as ledgerV9 from '@midnightntwrk/ledger-v9'; -const NIGHT_HEX = ledgerV8.unshieldedToken().raw; +const NIGHT_HEX = ledgerV9.unshieldedToken().raw; const A_DEPOSIT = 1_000_000n; // A deposits this much native NIGHT const A_MINT = 200_000n; // A withdraws this much as the shielded wrapper diff --git a/test/integration/shielded-night.security.test.ts b/test/integration/shielded-night.security.test.ts index 6958c05..103ead0 100644 --- a/test/integration/shielded-night.security.test.ts +++ b/test/integration/shielded-night.security.test.ts @@ -1,4 +1,4 @@ -import * as ledgerV8 from '@midnight-ntwrk/ledger-v8'; +import * as ledgerV9 from '@midnightntwrk/ledger-v9'; import { describe, expect, test } from 'vitest'; import * as contract from '../support/shielded-night.js'; import { describeContract, describeContractWithWallets } from '../support/describe-contract.js'; @@ -13,7 +13,7 @@ import { waitForUnshieldedBalance, } from '../support/wallet-observations.js'; -const NIGHT_HEX = ledgerV8.unshieldedToken().raw; +const NIGHT_HEX = ledgerV9.unshieldedToken().raw; /** * On-chain attack scenarios. These need a real ledger: the properties under diff --git a/test/integration/shielded-night.test.ts b/test/integration/shielded-night.test.ts index 13c075e..9f1ac15 100644 --- a/test/integration/shielded-night.test.ts +++ b/test/integration/shielded-night.test.ts @@ -1,4 +1,4 @@ -import * as ledgerV8 from '@midnight-ntwrk/ledger-v8'; +import * as ledgerV9 from '@midnightntwrk/ledger-v9'; import { describe, expect, test } from 'vitest'; import * as contract from '../support/shielded-night.js'; import { describeContract, describeContractWithWallets } from '../support/describe-contract.js'; @@ -17,7 +17,7 @@ import { const N = 10_000_000n; // 10 NIGHT at 6 decimals /** Hex key of native NIGHT in the wallet's unshielded balance map. */ -const NIGHT_HEX = ledgerV8.unshieldedToken().raw; +const NIGHT_HEX = ledgerV9.unshieldedToken().raw; /** Flatten an error chain (Effect wrappers, causes) into searchable text. */ const errText = (err: unknown): string => { diff --git a/test/integration/shielded-night.transient.test.ts b/test/integration/shielded-night.transient.test.ts index 2fc7029..248d850 100644 --- a/test/integration/shielded-night.transient.test.ts +++ b/test/integration/shielded-night.transient.test.ts @@ -12,7 +12,7 @@ import { /** * `depositShielded` burns the received coin via `sendImmediateShielded` — a * same-transaction transient. Older wallet stacks mis-listed the result (the - * spent input UTXO still showed as spendable); toolchain 0.31.101 / ledger-v8 + * spent input UTXO still showed as spendable); toolchain 0.31.101 / ledger-v8 (v9 branch: 0.34.0 / ledger-v9) * 8.1.0 fixed that. These tests pin the fix, separating three questions: * * 1. Does the transaction build, balance, and apply on the current stack? diff --git a/test/support/contract-factory.ts b/test/support/contract-factory.ts index c5a0765..1157d84 100644 --- a/test/support/contract-factory.ts +++ b/test/support/contract-factory.ts @@ -1,7 +1,7 @@ import { type ContractAddress } from '@midnight-ntwrk/compact-runtime'; import { CompiledContract, type ProvableCircuitId } from '@midnight-ntwrk/compact-js'; import type { Contract } from '@midnight-ntwrk/compact-js/effect/Contract'; -import type { ChargedState } from '@midnight-ntwrk/ledger-v8'; +import type { ChargedState } from '@midnightntwrk/ledger-v9'; import type { Types } from 'effect'; import { deployContract, diff --git a/test/support/governance.ts b/test/support/governance.ts index facf26d..948a0f4 100644 --- a/test/support/governance.ts +++ b/test/support/governance.ts @@ -6,7 +6,7 @@ import { ReplaceAuthority, signData, Transaction, -} from '@midnight-ntwrk/ledger-v8'; +} from '@midnightntwrk/ledger-v9'; import { submitTx } from '@midnight-ntwrk/midnight-js/contracts'; import { getNetworkId } from '@midnight-ntwrk/midnight-js/network-id'; import { asContractAddress } from '@midnight-ntwrk/midnight-js/types'; diff --git a/test/support/provider-wiring.ts b/test/support/provider-wiring.ts index 7a46ced..4385804 100644 --- a/test/support/provider-wiring.ts +++ b/test/support/provider-wiring.ts @@ -1,4 +1,4 @@ -import { type FinalizedTransaction } from '@midnight-ntwrk/ledger-v8'; +import { type FinalizedTransaction } from '@midnightntwrk/ledger-v9'; import { httpClientProofProvider } from '@midnight-ntwrk/midnight-js-http-client-proof-provider'; import { indexerPublicDataProvider } from '@midnight-ntwrk/midnight-js-indexer-public-data-provider'; import { levelPrivateStateProvider } from '@midnight-ntwrk/midnight-js-level-private-state-provider'; @@ -26,9 +26,9 @@ export const createWalletAndMidnightProvider = async ( { shieldedSecretKeys: ctx.shieldedSecretKeys, dustSecretKey: ctx.dustSecretKey }, { ttl: ttl ?? new Date(Date.now() + 30 * 60 * 1000) }, ); - const signed = await ctx.wallet.signRecipe(recipe, (payload: Uint8Array) => - ctx.unshieldedKeystore.signData(payload), - ); + // ledger-v9: `SignSegment` is `(data) => Promise`; the keystore's own + // `signDataAsync` is the sanctioned adapter over the synchronous `signData`. + const signed = await ctx.wallet.signRecipe(recipe, ctx.unshieldedKeystore.signDataAsync); return ctx.wallet.finalizeRecipe(signed); }, submitTx(tx: FinalizedTransaction) { diff --git a/test/support/wallet-builder.ts b/test/support/wallet-builder.ts index 93f3d1c..7ab0d12 100644 --- a/test/support/wallet-builder.ts +++ b/test/support/wallet-builder.ts @@ -1,5 +1,5 @@ -import * as ledger from '@midnight-ntwrk/ledger-v8'; -import { unshieldedToken } from '@midnight-ntwrk/ledger-v8'; +import * as ledger from '@midnightntwrk/ledger-v9'; +import { unshieldedToken } from '@midnightntwrk/ledger-v9'; import { getNetworkId, setNetworkId } from '@midnight-ntwrk/midnight-js/network-id'; import { toHex } from '@midnight-ntwrk/midnight-js/utils'; // Single coherent wallet SDK via the barrel package — it re-exports the whole version-locked family, so we avoid @@ -21,6 +21,7 @@ import { TransactionHistoryStorage, UnshieldedAddress, type UnshieldedKeystore, + type UnshieldedSecretKey, UnshieldedWallet, WalletFacade, } from '@midnightntwrk/wallet-sdk'; @@ -115,6 +116,17 @@ const deriveKeysFromSeed = (seed: string) => { return result.keys; }; +/** + * Wrap a raw 32-byte NIGHT secret in the `UnshieldedSecretKey` envelope the ledger-v9 keystore takes. + * + * @dev ledger-v9 turned `SigningKey`/`SignatureVerifyingKey`/`Signature` from bare hex strings into + * `{ tag: SignatureKind, value: string }`, so `createKeystore` no longer accepts raw bytes. `schnorr` + * (BIP-340) is the kind ledger-v8 signed with implicitly, so it is what reproduces the SAME addresses + * this repo's `undeployed` seeds derived on the v8 line — anything else would silently derive a + * different, unfunded wallet. + */ +const unshieldedSecretKey = (secret: Uint8Array): UnshieldedSecretKey => ({ kind: 'schnorr', secret }); + const buildShieldedConfig = (cfg: NetworkConfig) => ({ networkId: getNetworkId(), indexerClientConnection: { indexerHttpUrl: cfg.indexer, indexerWsUrl: cfg.indexerWS }, @@ -125,7 +137,7 @@ const buildShieldedConfig = (cfg: NetworkConfig) => ({ const buildUnshieldedConfig = (cfg: NetworkConfig) => ({ networkId: getNetworkId(), indexerClientConnection: { indexerHttpUrl: cfg.indexer, indexerWsUrl: cfg.indexerWS }, - txHistoryStorage: new InMemoryTransactionHistoryStorage(TransactionHistoryStorage.TransactionHistoryCommonSchema), + txHistoryStorage: new InMemoryTransactionHistoryStorage(TransactionHistoryStorage.TransactionHistoryEntryCommonSchema), }); const buildDustConfig = (cfg: NetworkConfig) => ({ @@ -316,7 +328,7 @@ const registerForDustGeneration = async ( const recipe = await wallet.registerNightUtxosForDustGeneration( nightUtxos, unshieldedKeystore.getPublicKey(), - (payload) => unshieldedKeystore.signData(payload), + unshieldedKeystore.signDataAsync, ); const finalized = await wallet.finalizeRecipe(recipe); await wallet.submitTransaction(finalized); @@ -345,7 +357,7 @@ export const buildWallet = async ( const keys = deriveKeysFromSeed(seed); const shieldedSecretKeys = ledger.ZswapSecretKeys.fromSeed(keys[Roles.Zswap]); const dustSecretKey = ledger.DustSecretKey.fromSeed(keys[Roles.Dust]); - const unshieldedKeystore = createKeystore(keys[Roles.NightExternal], getNetworkId()); + const unshieldedKeystore = createKeystore(unshieldedSecretKey(keys[Roles.NightExternal]), getNetworkId()); const walletConfig = { ...buildShieldedConfig(cfg), @@ -564,7 +576,7 @@ export const deriveUnshieldedAddressFromSeed = ( seed: string, ): { readonly encoded: string; readonly bytes: Uint8Array } => { const keys = deriveKeysFromSeed(seed); - const keystore = createKeystore(keys[Roles.NightExternal], getNetworkId()); + const keystore = createKeystore(unshieldedSecretKey(keys[Roles.NightExternal]), getNetworkId()); const bech = keystore.getBech32Address(); return { encoded: bech.asString(), bytes: bech.data }; }; diff --git a/test/support/wallet-observations.ts b/test/support/wallet-observations.ts index cd0511c..01753fb 100644 --- a/test/support/wallet-observations.ts +++ b/test/support/wallet-observations.ts @@ -1,4 +1,4 @@ -import * as ledger from '@midnight-ntwrk/ledger-v8'; +import * as ledger from '@midnightntwrk/ledger-v9'; import { type FacadeState, type WalletFacade } from '@midnightntwrk/wallet-sdk'; import * as Rx from 'rxjs'; import { firstSyncedState, type WalletContext } from './wallet-builder.js'; diff --git a/test/support/wallet-transfer.ts b/test/support/wallet-transfer.ts index b3ab15e..d04320a 100644 --- a/test/support/wallet-transfer.ts +++ b/test/support/wallet-transfer.ts @@ -1,4 +1,4 @@ -import * as ledger from '@midnight-ntwrk/ledger-v8'; +import * as ledger from '@midnightntwrk/ledger-v9'; import { ShieldedAddress, ShieldedCoinPublicKey, @@ -105,7 +105,7 @@ export const transferShielded = async ( { shieldedSecretKeys: from.shieldedSecretKeys, dustSecretKey: from.dustSecretKey }, { ttl: new Date(Date.now() + DEFAULT_TTL_MS) }, ); - const signed = await wallet.signRecipe(recipe, (p: Uint8Array) => from.unshieldedKeystore.signData(p)); + const signed = await wallet.signRecipe(recipe, from.unshieldedKeystore.signDataAsync); const finalized = await wallet.finalizeRecipe(signed); return wallet.submitTransaction(finalized); }; diff --git a/test/unit/shielded-night.combined.unit.test.ts b/test/unit/shielded-night.combined.unit.test.ts index a412c99..36abe41 100644 --- a/test/unit/shielded-night.combined.unit.test.ts +++ b/test/unit/shielded-night.combined.unit.test.ts @@ -26,55 +26,55 @@ const ZERO32 = new Uint8Array(32); describe('ShieldedNight combined circuits (simulator)', () => { let contract: ShieldedNightSimulator; - beforeEach(() => { - contract = new ShieldedNightSimulator('Shielded Night', 'sNight', 6n); + beforeEach(async () => { + contract = await ShieldedNightSimulator.create('Shielded Night', 'sNight', 6n); }); describe('convertToShielded', () => { - it('mints a wrapper coin of the exact amount with the contract color', () => { - const coin = contract.convertToShielded(N, RECIPIENT, b32('n')); + it('mints a wrapper coin of the exact amount with the contract color', async () => { + const coin = await contract.convertToShielded(N, RECIPIENT, b32('n')); expect(coin.value).toBe(N); - expect(coin.color).toEqual(contract.tokenColor()); + expect(coin.color).toEqual(await contract.tokenColor()); expect(coin.nonce).toEqual(b32('n')); }); - it('does not touch the credit map (no secret, atomic)', () => { - contract.convertToShielded(N, RECIPIENT, b32('n')); + it('does not touch the credit map (no secret, atomic)', async () => { + await contract.convertToShielded(N, RECIPIENT, b32('n')); expect(contract.getLedger().balances.isEmpty()).toBe(true); }); - it('rejects a zero amount', () => { - expect(() => contract.convertToShielded(0n, RECIPIENT, b32('n'))).toThrow('amount must be positive'); + it('rejects a zero amount', async () => { + await expect(contract.convertToShielded(0n, RECIPIENT, b32('n'))).rejects.toThrow('amount must be positive'); }); - it('rejects the zero recipient (burn address)', () => { - expect(() => contract.convertToShielded(N, { bytes: ZERO32 }, b32('n'))).toThrow('invalid recipient'); + it('rejects the zero recipient (burn address)', async () => { + await expect(contract.convertToShielded(N, { bytes: ZERO32 }, b32('n'))).rejects.toThrow('invalid recipient'); }); }); describe('convertToUnshielded', () => { let coin: ShieldedCoin; - beforeEach(() => { - coin = contract.convertToShielded(N, RECIPIENT, b32('n')); + beforeEach(async () => { + coin = await contract.convertToShielded(N, RECIPIENT, b32('n')); }); - it('accepts a wrapper coin and releases NIGHT (no throw, no credit touched)', () => { - expect(() => contract.convertToUnshielded(coin, USER)).not.toThrow(); + it('accepts a wrapper coin and releases NIGHT (no throw, no credit touched)', async () => { + await expect(contract.convertToUnshielded(coin, USER)).resolves.not.toThrow(); expect(contract.getLedger().balances.isEmpty()).toBe(true); }); - it('rejects a coin that is not the contract wrapper', () => { + it('rejects a coin that is not the contract wrapper', async () => { const foreign = { ...coin, color: coin.color.slice() }; foreign.color[0] ^= 0xff; - expect(() => contract.convertToUnshielded(foreign, USER)).toThrow("not this contract's shielded wrapper"); + await expect(contract.convertToUnshielded(foreign, USER)).rejects.toThrow("not this contract's shielded wrapper"); }); - it('rejects a zero-value coin', () => { - expect(() => contract.convertToUnshielded({ ...coin, value: 0n }, USER)).toThrow('coin value must be positive'); + it('rejects a zero-value coin', async () => { + await expect(contract.convertToUnshielded({ ...coin, value: 0n }, USER)).rejects.toThrow('coin value must be positive'); }); - it('rejects the zero unshielded recipient', () => { - expect(() => contract.convertToUnshielded(coin, rightUserAddress(ZERO32))).toThrow('invalid recipient'); + it('rejects the zero unshielded recipient', async () => { + await expect(contract.convertToUnshielded(coin, rightUserAddress(ZERO32))).rejects.toThrow('invalid recipient'); }); }); }); diff --git a/test/unit/shielded-night.security.unit.test.ts b/test/unit/shielded-night.security.unit.test.ts index ae25563..13592fc 100644 --- a/test/unit/shielded-night.security.unit.test.ts +++ b/test/unit/shielded-night.security.unit.test.ts @@ -38,154 +38,140 @@ const ZERO32 = new Uint8Array(32); describe('ShieldedNight security / border cases (simulator)', () => { let contract: ShieldedNightSimulator; - beforeEach(() => { - contract = new ShieldedNightSimulator(NAME, SYMBOL, DECIMALS); + beforeEach(async () => { + contract = await ShieldedNightSimulator.create(NAME, SYMBOL, DECIMALS); }); describe('value ranges and overflow', () => { - it('accepts the maximum single unshielded deposit (2^64 - 1)', () => { - contract.depositUnshielded(SECRET, MAX64); - expect(contract.getBalance(SECRET)).toBe(MAX64); + it('accepts the maximum single unshielded deposit (2^64 - 1)', async () => { + await contract.depositUnshielded(SECRET, MAX64); + expect(await contract.getBalance(SECRET)).toBe(MAX64); }); - it('rejects out-of-range circuit arguments at the encoding layer', () => { + it('rejects out-of-range circuit arguments at the encoding layer', async () => { // Uint<64> args: negative and > 2^64-1 never reach the circuit body. - expect(() => contract.depositUnshielded(SECRET, -1n)).toThrow(/expected value of type/); - expect(() => contract.depositUnshielded(SECRET, MAX64 + 1n)).toThrow(/expected value of type/); - expect(() => - contract.withdrawShielded(SECRET, MAX64 + 1n, RECIPIENT, b32('n')), - ).toThrow(/expected value of type/); + await expect(contract.depositUnshielded(SECRET, -1n)).rejects.toThrow(/expected value of type/); + await expect(contract.depositUnshielded(SECRET, MAX64 + 1n)).rejects.toThrow(/expected value of type/); + await expect(contract.withdrawShielded(SECRET, MAX64 + 1n, RECIPIENT, b32('n'))).rejects.toThrow(/expected value of type/); }); - it('caps shielded coin values at 2^64 - 1 (zswap layer), despite the Uint<128> field', () => { - const color = contract.tokenColor(); + it('caps shielded coin values at 2^64 - 1 (zswap layer), despite the Uint<128> field', async () => { + const color = await contract.tokenColor(); // At the cap: accepted and credited in full. - contract.depositShielded(SECRET, { nonce: b32('n1'), color, value: MAX64 }); - expect(contract.getBalance(SECRET)).toBe(MAX64); + await contract.depositShielded(SECRET, { nonce: b32('n1'), color, value: MAX64 }); + expect(await contract.getBalance(SECRET)).toBe(MAX64); // One past the cap: rejected before any state change. - expect(() => - contract.depositShielded(SECRET, { nonce: b32('n2'), color, value: MAX64 + 1n }), - ).toThrow(); - expect(contract.getBalance(SECRET)).toBe(MAX64); + await expect(contract.depositShielded(SECRET, { nonce: b32('n2'), color, value: MAX64 + 1n })).rejects.toThrow(); + expect(await contract.getBalance(SECRET)).toBe(MAX64); }); - it('accumulates a credit balance beyond 2^64 without wrapping', () => { + it('accumulates a credit balance beyond 2^64 without wrapping', async () => { // The Uint<128> balance must keep counting where a 64-bit field would // wrap to zero (which would silently erase deposits). - const color = contract.tokenColor(); - contract.depositShielded(SECRET, { nonce: b32('n1'), color, value: MAX64 }); - contract.depositShielded(SECRET, { nonce: b32('n2'), color, value: MAX64 }); - expect(contract.getBalance(SECRET)).toBe(2n * MAX64); + const color = await contract.tokenColor(); + await contract.depositShielded(SECRET, { nonce: b32('n1'), color, value: MAX64 }); + await contract.depositShielded(SECRET, { nonce: b32('n2'), color, value: MAX64 }); + expect(await contract.getBalance(SECRET)).toBe(2n * MAX64); // Note: overflowing the Uint<128> credit itself would take ~2^64 // max-value operations — unreachable given the zswap 2^64 coin cap. }); }); describe('withdrawal boundaries', () => { - beforeEach(() => { - contract.depositUnshielded(SECRET, 100n); + beforeEach(async () => { + await contract.depositUnshielded(SECRET, 100n); }); - it('allows withdrawing the exact balance, then nothing more', () => { - contract.withdrawUnshielded(SECRET, 100n, USER); - expect(contract.getBalance(SECRET)).toBe(0n); - expect(() => contract.withdrawUnshielded(SECRET, 1n, USER)).toThrow( + it('allows withdrawing the exact balance, then nothing more', async () => { + await contract.withdrawUnshielded(SECRET, 100n, USER); + expect(await contract.getBalance(SECRET)).toBe(0n); + await expect(contract.withdrawUnshielded(SECRET, 1n, USER)).rejects.toThrow( 'insufficient pool balance', ); }); - it('rejects overdrawing by exactly one unit', () => { - expect(() => contract.withdrawUnshielded(SECRET, 101n, USER)).toThrow( + it('rejects overdrawing by exactly one unit', async () => { + await expect(contract.withdrawUnshielded(SECRET, 101n, USER)).rejects.toThrow( 'insufficient pool balance', ); }); - it('keeps a drained key readable as zero (distinct from never-used)', () => { - contract.withdrawUnshielded(SECRET, 100n, USER); - expect(contract.getBalance(SECRET)).toBe(0n); // drained: entry exists at 0 - expect(() => contract.getBalance(b32('never-used'))).toThrow(); // never-used: reverts + it('keeps a drained key readable as zero (distinct from never-used)', async () => { + await contract.withdrawUnshielded(SECRET, 100n, USER); + expect(await contract.getBalance(SECRET)).toBe(0n); // drained: entry exists at 0 + await expect(contract.getBalance(b32('never-used'))).rejects.toThrow(); // never-used: reverts }); - it('leaves the balance untouched after a failed withdrawal', () => { - expect(() => contract.withdrawUnshielded(SECRET, 101n, USER)).toThrow(); - expect(() => - contract.withdrawShielded(SECRET, 101n, RECIPIENT, b32('n')), - ).toThrow(); - expect(contract.getBalance(SECRET)).toBe(100n); + it('leaves the balance untouched after a failed withdrawal', async () => { + await expect(contract.withdrawUnshielded(SECRET, 101n, USER)).rejects.toThrow(); + await expect(contract.withdrawShielded(SECRET, 101n, RECIPIENT, b32('n'))).rejects.toThrow(); + expect(await contract.getBalance(SECRET)).toBe(100n); }); }); describe('balance-key isolation', () => { - it('treats the all-zero secret as a valid, independent key', () => { - contract.depositUnshielded(ZERO32, 7n); - contract.depositUnshielded(SECRET, 9n); - expect(contract.getBalance(ZERO32)).toBe(7n); - expect(contract.getBalance(SECRET)).toBe(9n); + it('treats the all-zero secret as a valid, independent key', async () => { + await contract.depositUnshielded(ZERO32, 7n); + await contract.depositUnshielded(SECRET, 9n); + expect(await contract.getBalance(ZERO32)).toBe(7n); + expect(await contract.getBalance(SECRET)).toBe(9n); }); - it('separates secrets that differ by a single bit', () => { + it('separates secrets that differ by a single bit', async () => { const a = b32('twin'); const b = a.slice(); b[31] ^= 0x01; - contract.depositUnshielded(a, 11n); - expect(contract.getBalance(a)).toBe(11n); - expect(() => contract.getBalance(b)).toThrow(); // sibling key never credited - expect(() => contract.withdrawUnshielded(b, 11n, USER)).toThrow( + await contract.depositUnshielded(a, 11n); + expect(await contract.getBalance(a)).toBe(11n); + await expect(contract.getBalance(b)).rejects.toThrow(); // sibling key never credited + await expect(contract.withdrawUnshielded(b, 11n, USER)).rejects.toThrow( 'no balance for this secret', ); }); }); describe('loss guards: zero recipients (Midnight burn address)', () => { - beforeEach(() => { - contract.depositUnshielded(SECRET, 100n); + beforeEach(async () => { + await contract.depositUnshielded(SECRET, 100n); }); - it('refuses to mint the wrapper to the zero coin public key', () => { - expect(() => - contract.withdrawShielded(SECRET, 50n, { bytes: ZERO32 }, b32('n')), - ).toThrow('invalid recipient'); - expect(contract.getBalance(SECRET)).toBe(100n); + it('refuses to mint the wrapper to the zero coin public key', async () => { + await expect(contract.withdrawShielded(SECRET, 50n, { bytes: ZERO32 }, b32('n'))).rejects.toThrow('invalid recipient'); + expect(await contract.getBalance(SECRET)).toBe(100n); }); - it('refuses to release NIGHT to the zero user address', () => { - expect(() => - contract.withdrawUnshielded(SECRET, 50n, rightUserAddress(ZERO32)), - ).toThrow('invalid recipient'); - expect(contract.getBalance(SECRET)).toBe(100n); + it('refuses to release NIGHT to the zero user address', async () => { + await expect(contract.withdrawUnshielded(SECRET, 50n, rightUserAddress(ZERO32))).rejects.toThrow('invalid recipient'); + expect(await contract.getBalance(SECRET)).toBe(100n); }); - it('refuses to release NIGHT to the zero contract address', () => { - expect(() => - contract.withdrawUnshielded(SECRET, 50n, { + it('refuses to release NIGHT to the zero contract address', async () => { + await expect(contract.withdrawUnshielded(SECRET, 50n, { is_left: true, left: { bytes: ZERO32 }, right: { bytes: ZERO32 }, - }), - ).toThrow('invalid recipient'); + })).rejects.toThrow('invalid recipient'); }); - it('still allows non-zero contract recipients', () => { - contract.withdrawUnshielded(SECRET, 50n, { + it('still allows non-zero contract recipients', async () => { + await contract.withdrawUnshielded(SECRET, 50n, { is_left: true, left: { bytes: b32('some-contract') }, right: { bytes: ZERO32 }, }); - expect(contract.getBalance(SECRET)).toBe(50n); + expect(await contract.getBalance(SECRET)).toBe(50n); }); }); describe('deposit guards', () => { - it('rejects a shielded coin whose color differs from the wrapper in one byte', () => { - const color = contract.tokenColor().slice(); + it('rejects a shielded coin whose color differs from the wrapper in one byte', async () => { + const color = (await contract.tokenColor()).slice(); color[31] ^= 0x01; - expect(() => - contract.depositShielded(SECRET, { nonce: b32('n'), color, value: 5n }), - ).toThrow("not this contract's shielded wrapper"); + await expect(contract.depositShielded(SECRET, { nonce: b32('n'), color, value: 5n })).rejects.toThrow("not this contract's shielded wrapper"); }); - it('keeps metadata immutable across state-changing calls', () => { - contract.depositUnshielded(SECRET, 5n); + it('keeps metadata immutable across state-changing calls', async () => { + await contract.depositUnshielded(SECRET, 5n); const l = contract.getLedger(); expect(l._name).toBe(NAME); expect(l._symbol).toBe(SYMBOL); @@ -194,29 +180,27 @@ describe('ShieldedNight security / border cases (simulator)', () => { }); describe('combined circuits: value ranges', () => { - it('convertToShielded mints the maximum single amount (2^64 - 1)', () => { - const coin = contract.convertToShielded(MAX64, RECIPIENT, b32('n')); + it('convertToShielded mints the maximum single amount (2^64 - 1)', async () => { + const coin = await contract.convertToShielded(MAX64, RECIPIENT, b32('n')); expect(coin.value).toBe(MAX64); - expect(coin.color).toEqual(contract.tokenColor()); + expect(coin.color).toEqual(await contract.tokenColor()); }); - it('convertToShielded rejects out-of-range amounts at the encoding layer', () => { - expect(() => contract.convertToShielded(-1n, RECIPIENT, b32('n'))).toThrow( + it('convertToShielded rejects out-of-range amounts at the encoding layer', async () => { + await expect(contract.convertToShielded(-1n, RECIPIENT, b32('n'))).rejects.toThrow( /expected value of type/, ); - expect(() => contract.convertToShielded(MAX64 + 1n, RECIPIENT, b32('n'))).toThrow( + await expect(contract.convertToShielded(MAX64 + 1n, RECIPIENT, b32('n'))).rejects.toThrow( /expected value of type/, ); }); - it('convertToUnshielded releases the maximum coin value and rejects one past the zswap cap', () => { - const color = contract.tokenColor(); + it('convertToUnshielded releases the maximum coin value and rejects one past the zswap cap', async () => { + const color = await contract.tokenColor(); // At the cap: accepted (the Uint<128> field notwithstanding, zswap coins top out at 2^64-1). - contract.convertToUnshielded({ nonce: b32('n1'), color, value: MAX64 }, USER); + await contract.convertToUnshielded({ nonce: b32('n1'), color, value: MAX64 }, USER); // One past the cap: rejected before any state change. - expect(() => - contract.convertToUnshielded({ nonce: b32('n2'), color, value: MAX64 + 1n }, USER), - ).toThrow(); + await expect(contract.convertToUnshielded({ nonce: b32('n2'), color, value: MAX64 + 1n }, USER)).rejects.toThrow(); }); }); @@ -224,20 +208,18 @@ describe('ShieldedNight security / border cases (simulator)', () => { // The combined suite covers the zero USER address; these pin the other // Either branch — releasing NIGHT to the zero CONTRACT address would // strand it just as irrecoverably. - it('convertToUnshielded refuses the zero contract recipient (left branch)', () => { - const coin = contract.convertToShielded(100n, RECIPIENT, b32('n')); - expect(() => - contract.convertToUnshielded(coin, { + it('convertToUnshielded refuses the zero contract recipient (left branch)', async () => { + const coin = await contract.convertToShielded(100n, RECIPIENT, b32('n')); + await expect(contract.convertToUnshielded(coin, { is_left: true, left: { bytes: ZERO32 }, right: { bytes: ZERO32 }, - }), - ).toThrow('invalid recipient'); + })).rejects.toThrow('invalid recipient'); }); - it('convertToUnshielded still allows non-zero contract recipients', () => { - const coin = contract.convertToShielded(100n, RECIPIENT, b32('n')); - contract.convertToUnshielded(coin, { + it('convertToUnshielded still allows non-zero contract recipients', async () => { + const coin = await contract.convertToShielded(100n, RECIPIENT, b32('n')); + await contract.convertToUnshielded(coin, { is_left: true, left: { bytes: b32('some-contract') }, right: { bytes: ZERO32 }, @@ -249,32 +231,30 @@ describe('ShieldedNight security / border cases (simulator)', () => { // Both models mint the SAME wrapper color, so coins are interchangeable // across them. Users will mix frontends/flows; a color split between the // mint paths would strand one side's coins. - it('redeems a two-step-minted coin through the atomic path', () => { - contract.depositUnshielded(SECRET, 100n); - const twoStep = contract.withdrawShielded(SECRET, 100n, RECIPIENT, b32('n1')); - const atomic = contract.convertToShielded(100n, RECIPIENT, b32('n2')); + it('redeems a two-step-minted coin through the atomic path', async () => { + await contract.depositUnshielded(SECRET, 100n); + const twoStep = await contract.withdrawShielded(SECRET, 100n, RECIPIENT, b32('n1')); + const atomic = await contract.convertToShielded(100n, RECIPIENT, b32('n2')); expect(atomic.color).toEqual(twoStep.color); // one color across both mint paths - contract.convertToUnshielded(twoStep, USER); - expect(contract.getBalance(SECRET)).toBe(0n); // drained credit untouched by the convert + await contract.convertToUnshielded(twoStep, USER); + expect(await contract.getBalance(SECRET)).toBe(0n); // drained credit untouched by the convert }); - it('burns an atomically-minted coin through the two-step credit path', () => { - const coin = contract.convertToShielded(100n, RECIPIENT, b32('n')); - contract.depositShielded(SECRET, coin); - expect(contract.getBalance(SECRET)).toBe(100n); - contract.withdrawUnshielded(SECRET, 100n, USER); - expect(contract.getBalance(SECRET)).toBe(0n); + it('burns an atomically-minted coin through the two-step credit path', async () => { + const coin = await contract.convertToShielded(100n, RECIPIENT, b32('n')); + await contract.depositShielded(SECRET, coin); + expect(await contract.getBalance(SECRET)).toBe(100n); + await contract.withdrawUnshielded(SECRET, 100n, USER); + expect(await contract.getBalance(SECRET)).toBe(0n); }); - it('failed converts leave existing credits untouched', () => { - contract.depositUnshielded(SECRET, 100n); - expect(() => - contract.convertToUnshielded({ nonce: b32('n'), color: b32('foreign'), value: 5n }, USER), - ).toThrow("not this contract's shielded wrapper"); - expect(() => contract.convertToShielded(0n, RECIPIENT, b32('n'))).toThrow( + it('failed converts leave existing credits untouched', async () => { + await contract.depositUnshielded(SECRET, 100n); + await expect(contract.convertToUnshielded({ nonce: b32('n'), color: b32('foreign'), value: 5n }, USER)).rejects.toThrow("not this contract's shielded wrapper"); + await expect(contract.convertToShielded(0n, RECIPIENT, b32('n'))).rejects.toThrow( 'amount must be positive', ); - expect(contract.getBalance(SECRET)).toBe(100n); + expect(await contract.getBalance(SECRET)).toBe(100n); expect(contract.getLedger().balances.size()).toBe(1n); }); }); diff --git a/test/unit/shielded-night.unit.test.ts b/test/unit/shielded-night.unit.test.ts index 1946e04..b32596b 100644 --- a/test/unit/shielded-night.unit.test.ts +++ b/test/unit/shielded-night.unit.test.ts @@ -25,15 +25,15 @@ const USER = rightUserAddress(b32('user-address')); describe('ShieldedNight (simulator)', () => { let contract: ShieldedNightSimulator; - beforeEach(() => { - contract = new ShieldedNightSimulator(NAME, SYMBOL, DECIMALS); + beforeEach(async () => { + contract = await ShieldedNightSimulator.create(NAME, SYMBOL, DECIMALS); }); describe('metadata', () => { - it('echoes constructor args through the metadata circuits', () => { - expect(contract.name()).toBe(NAME); - expect(contract.symbol()).toBe(SYMBOL); - expect(contract.decimals()).toBe(DECIMALS); + it('echoes constructor args through the metadata circuits', async () => { + expect(await contract.name()).toBe(NAME); + expect(await contract.symbol()).toBe(SYMBOL); + expect(await contract.decimals()).toBe(DECIMALS); }); it('exposes the sealed metadata directly on the ledger', () => { @@ -47,9 +47,9 @@ describe('ShieldedNight (simulator)', () => { expect(contract.getLedger().balances.isEmpty()).toBe(true); }); - it('returns a stable 32-byte wrapper color', () => { - const c1 = contract.tokenColor(); - const c2 = contract.tokenColor(); + it('returns a stable 32-byte wrapper color', async () => { + const c1 = await contract.tokenColor(); + const c2 = await contract.tokenColor(); expect(c1).toHaveLength(32); expect(c1).toEqual(c2); expect(c1.some((b) => b !== 0)).toBe(true); @@ -57,152 +57,144 @@ describe('ShieldedNight (simulator)', () => { }); describe('depositUnshielded', () => { - it('credits the balance under hash(secret)', () => { - contract.depositUnshielded(SECRET_A, N); - expect(contract.getBalance(SECRET_A)).toBe(N); + it('credits the balance under hash(secret)', async () => { + await contract.depositUnshielded(SECRET_A, N); + expect(await contract.getBalance(SECRET_A)).toBe(N); }); - it('accumulates across deposits', () => { - contract.depositUnshielded(SECRET_A, N); - contract.depositUnshielded(SECRET_A, 5n); - expect(contract.getBalance(SECRET_A)).toBe(N + 5n); + it('accumulates across deposits', async () => { + await contract.depositUnshielded(SECRET_A, N); + await contract.depositUnshielded(SECRET_A, 5n); + expect(await contract.getBalance(SECRET_A)).toBe(N + 5n); }); - it('keeps balances of distinct secrets independent', () => { - contract.depositUnshielded(SECRET_A, N); - contract.depositUnshielded(SECRET_B, 7n); - expect(contract.getBalance(SECRET_A)).toBe(N); - expect(contract.getBalance(SECRET_B)).toBe(7n); + it('keeps balances of distinct secrets independent', async () => { + await contract.depositUnshielded(SECRET_A, N); + await contract.depositUnshielded(SECRET_B, 7n); + expect(await contract.getBalance(SECRET_A)).toBe(N); + expect(await contract.getBalance(SECRET_B)).toBe(7n); expect(contract.getLedger().balances.size()).toBe(2n); }); - it('rejects a zero amount', () => { - expect(() => contract.depositUnshielded(SECRET_A, 0n)).toThrow( + it('rejects a zero amount', async () => { + await expect(contract.depositUnshielded(SECRET_A, 0n)).rejects.toThrow( 'amount must be positive', ); }); }); describe('withdrawShielded', () => { - beforeEach(() => { - contract.depositUnshielded(SECRET_A, N); + beforeEach(async () => { + await contract.depositUnshielded(SECRET_A, N); }); - it('debits the balance and mints a wrapper coin with the given nonce', () => { + it('debits the balance and mints a wrapper coin with the given nonce', async () => { const nonce = b32('mint-nonce'); - const coin = contract.withdrawShielded(SECRET_A, N, RECIPIENT, nonce); + const coin = await contract.withdrawShielded(SECRET_A, N, RECIPIENT, nonce); expect(coin.value).toBe(N); expect(coin.nonce).toEqual(nonce); - expect(coin.color).toEqual(contract.tokenColor()); - expect(contract.getBalance(SECRET_A)).toBe(0n); + expect(coin.color).toEqual(await contract.tokenColor()); + expect(await contract.getBalance(SECRET_A)).toBe(0n); }); - it('supports partial withdrawal', () => { - contract.withdrawShielded(SECRET_A, N / 2n, RECIPIENT, b32('n1')); - expect(contract.getBalance(SECRET_A)).toBe(N - N / 2n); + it('supports partial withdrawal', async () => { + await contract.withdrawShielded(SECRET_A, N / 2n, RECIPIENT, b32('n1')); + expect(await contract.getBalance(SECRET_A)).toBe(N - N / 2n); }); - it('rejects a zero amount', () => { - expect(() => - contract.withdrawShielded(SECRET_A, 0n, RECIPIENT, b32('n')), - ).toThrow('amount must be positive'); + it('rejects a zero amount', async () => { + await expect(contract.withdrawShielded(SECRET_A, 0n, RECIPIENT, b32('n'))).rejects.toThrow('amount must be positive'); }); - it('rejects an unknown secret', () => { - expect(() => - contract.withdrawShielded(SECRET_B, 1n, RECIPIENT, b32('n')), - ).toThrow('no balance for this secret'); + it('rejects an unknown secret', async () => { + await expect(contract.withdrawShielded(SECRET_B, 1n, RECIPIENT, b32('n'))).rejects.toThrow('no balance for this secret'); }); - it('rejects withdrawing more than the balance', () => { - expect(() => - contract.withdrawShielded(SECRET_A, N + 1n, RECIPIENT, b32('n')), - ).toThrow('insufficient pool balance'); + it('rejects withdrawing more than the balance', async () => { + await expect(contract.withdrawShielded(SECRET_A, N + 1n, RECIPIENT, b32('n'))).rejects.toThrow('insufficient pool balance'); }); }); describe('depositShielded', () => { let coin: ShieldedCoin; - beforeEach(() => { - contract.depositUnshielded(SECRET_A, N); - coin = contract.withdrawShielded(SECRET_A, N, RECIPIENT, b32('n')); + beforeEach(async () => { + await contract.depositUnshielded(SECRET_A, N); + coin = await contract.withdrawShielded(SECRET_A, N, RECIPIENT, b32('n')); }); - it('credits the balance by the full coin value', () => { - contract.depositShielded(SECRET_A, coin); - expect(contract.getBalance(SECRET_A)).toBe(N); + it('credits the balance by the full coin value', async () => { + await contract.depositShielded(SECRET_A, coin); + expect(await contract.getBalance(SECRET_A)).toBe(N); }); - it('credits a different secret than the one that minted', () => { - contract.depositShielded(SECRET_B, coin); - expect(contract.getBalance(SECRET_B)).toBe(N); + it('credits a different secret than the one that minted', async () => { + await contract.depositShielded(SECRET_B, coin); + expect(await contract.getBalance(SECRET_B)).toBe(N); }); - it('rejects a coin that is not the contract wrapper', () => { + it('rejects a coin that is not the contract wrapper', async () => { const foreign = { ...coin, color: coin.color.slice() }; foreign.color[0] ^= 0xff; - expect(() => contract.depositShielded(SECRET_A, foreign)).toThrow( + await expect(contract.depositShielded(SECRET_A, foreign)).rejects.toThrow( "not this contract's shielded wrapper", ); }); - it('rejects a zero-value coin', () => { - expect(() => - contract.depositShielded(SECRET_A, { ...coin, value: 0n }), - ).toThrow('coin value must be positive'); + it('rejects a zero-value coin', async () => { + await expect(contract.depositShielded(SECRET_A, { ...coin, value: 0n })).rejects.toThrow('coin value must be positive'); }); }); describe('withdrawUnshielded', () => { - beforeEach(() => { - contract.depositUnshielded(SECRET_A, N); + beforeEach(async () => { + await contract.depositUnshielded(SECRET_A, N); }); - it('debits the balance', () => { - contract.withdrawUnshielded(SECRET_A, N / 2n, USER); - expect(contract.getBalance(SECRET_A)).toBe(N - N / 2n); + it('debits the balance', async () => { + await contract.withdrawUnshielded(SECRET_A, N / 2n, USER); + expect(await contract.getBalance(SECRET_A)).toBe(N - N / 2n); }); - it('rejects a zero amount', () => { - expect(() => contract.withdrawUnshielded(SECRET_A, 0n, USER)).toThrow( + it('rejects a zero amount', async () => { + await expect(contract.withdrawUnshielded(SECRET_A, 0n, USER)).rejects.toThrow( 'amount must be positive', ); }); - it('rejects an unknown secret', () => { - expect(() => contract.withdrawUnshielded(SECRET_B, 1n, USER)).toThrow( + it('rejects an unknown secret', async () => { + await expect(contract.withdrawUnshielded(SECRET_B, 1n, USER)).rejects.toThrow( 'no balance for this secret', ); }); - it('rejects withdrawing more than the balance', () => { - expect(() => contract.withdrawUnshielded(SECRET_A, N + 1n, USER)).toThrow( + it('rejects withdrawing more than the balance', async () => { + await expect(contract.withdrawUnshielded(SECRET_A, N + 1n, USER)).rejects.toThrow( 'insufficient pool balance', ); }); }); describe('round trip', () => { - it('unshielded -> shielded -> unshielded leaves a zero balance', () => { - contract.depositUnshielded(SECRET_A, N); - const coin = contract.withdrawShielded(SECRET_A, N, RECIPIENT, b32('rt')); - expect(contract.getBalance(SECRET_A)).toBe(0n); + it('unshielded -> shielded -> unshielded leaves a zero balance', async () => { + await contract.depositUnshielded(SECRET_A, N); + const coin = await contract.withdrawShielded(SECRET_A, N, RECIPIENT, b32('rt')); + expect(await contract.getBalance(SECRET_A)).toBe(0n); - contract.depositShielded(SECRET_A, coin); - expect(contract.getBalance(SECRET_A)).toBe(N); + await contract.depositShielded(SECRET_A, coin); + expect(await contract.getBalance(SECRET_A)).toBe(N); - contract.withdrawUnshielded(SECRET_A, N, USER); - expect(contract.getBalance(SECRET_A)).toBe(0n); + await contract.withdrawUnshielded(SECRET_A, N, USER); + expect(await contract.getBalance(SECRET_A)).toBe(0n); expect(contract.getLedger().balances.lookup(contractKeyOf(SECRET_A))).toBe(0n); }); }); describe('getBalance', () => { - it('throws for a never-used secret (lookup without member guard)', () => { + it('throws for a never-used secret (lookup without member guard)', async () => { // Pins current behavior: reads for unknown keys revert instead of // returning 0. Off-chain callers must probe `balances.member` first. - expect(() => contract.getBalance(b32('never-used'))).toThrow(); + await expect(contract.getBalance(b32('never-used'))).rejects.toThrow(); }); }); diff --git a/test/unit/simulators/ShieldedNightSimulator.ts b/test/unit/simulators/ShieldedNightSimulator.ts index 29feb2b..26f163d 100644 --- a/test/unit/simulators/ShieldedNightSimulator.ts +++ b/test/unit/simulators/ShieldedNightSimulator.ts @@ -1,5 +1,6 @@ import { type CircuitContext, + type CircuitId, type CircuitResults, createCircuitContext, createConstructorContext, @@ -41,95 +42,129 @@ export const rightUserAddress = (bytes: Uint8Array): EitherContractOrUser => ({ * OpenZeppelin compact-contracts simulator pattern: the compiled contract's * impure circuits run against a locally held CircuitContext, and each * successful call threads the updated context back so ledger state advances - * across calls. Failed calls throw before the context is replaced, so state + * across calls. Failed calls reject before the context is replaced, so state * is untouched — matching on-chain semantics. + * + * @dev ASYNC ON THE LEDGER-V9 LINE. compact-runtime 0.19 makes every generated + * circuit — and `Contract.initialState` — return a Promise (it has to: a circuit + * may perform a cross-contract call, which fetches state). Construction therefore + * moves to the static `create()` factory and every circuit accessor is async. + * `getLedger()` stays synchronous: it only reads the context this simulator holds. + * + * @dev The runtime-0.19 `CircuitContext` also collapsed `currentQueryContext`, + * `currentPrivateState`, `currentZswapLocalState` and `gasCost` under a single + * `callContext`, and `createCircuitContext` gained the executing circuit's id as + * its first argument — so each call builds its context with its own id. */ export class ShieldedNightSimulator { readonly contract: Contract; readonly contractAddress: string; private ctx: CircuitContext; - constructor(name: string, symbol: string, decimals: bigint) { - this.contract = new Contract({}); - const init = this.contract.initialState( + private constructor( + contract: Contract, + contractAddress: string, + ctx: CircuitContext, + ) { + this.contract = contract; + this.contractAddress = contractAddress; + this.ctx = ctx; + } + + static async create( + name: string, + symbol: string, + decimals: bigint, + ): Promise { + const contract = new Contract({}); + const init = await contract.initialState( createConstructorContext({}, COIN_PK), name, symbol, decimals, ); - this.contractAddress = sampleContractAddress(); - this.ctx = createCircuitContext( - this.contractAddress, + const contractAddress = sampleContractAddress(); + const ctx = createCircuitContext( + 'constructor', + contractAddress, COIN_PK, init.currentContractState, {}, ); + return new ShieldedNightSimulator(contract, contractAddress, ctx); } /** Read the public ledger state (balances map + sealed metadata). */ getLedger(): Ledger { - return ledger(this.ctx.currentQueryContext.state); + return ledger(this.ctx.callContext.currentQueryContext.state); } - private advance(res: CircuitResults): R { - // Each simulator call models its own transaction: keep the updated ledger - // state but discard the accumulated Zswap local state (coin receives/sends - // recorded by the previous call). Without this, successive deposits share - // one transaction-level receive accumulator and large amounts trip its - // Uint<64> overflow instead of exercising the contract's own logic. - this.ctx = createCircuitContext( + /** + * A fresh context for `circuitId` carrying the current ledger and private + * state. Each simulator call models its own transaction: keep the updated + * ledger state but discard the accumulated Zswap local state (coin + * receives/sends recorded by the previous call). Without this, successive + * deposits share one transaction-level receive accumulator and large amounts + * trip its Uint<64> overflow instead of exercising the contract's own logic. + */ + private contextFor(circuitId: CircuitId): CircuitContext { + return createCircuitContext( + circuitId, this.contractAddress, COIN_PK, - res.context.currentQueryContext.state, - res.context.currentPrivateState, + this.ctx.callContext.currentQueryContext.state, + this.ctx.callContext.currentPrivateState ?? ({} as ShieldedNightPrivateState), ); + } + + private async run( + circuitId: CircuitId, + call: (ctx: CircuitContext) => Promise>, + ): Promise { + const res = await call(this.contextFor(circuitId)); + this.ctx = res.context; return res.result; } - name(): string { - return this.advance(this.contract.impureCircuits.name(this.ctx)); + name(): Promise { + return this.run('name', (c) => this.contract.impureCircuits.name(c)); } - symbol(): string { - return this.advance(this.contract.impureCircuits.symbol(this.ctx)); + symbol(): Promise { + return this.run('symbol', (c) => this.contract.impureCircuits.symbol(c)); } - decimals(): bigint { - return this.advance(this.contract.impureCircuits.decimals(this.ctx)); + decimals(): Promise { + return this.run('decimals', (c) => this.contract.impureCircuits.decimals(c)); } - tokenColor(): Uint8Array { - return this.advance(this.contract.impureCircuits.tokenColor(this.ctx)); + tokenColor(): Promise { + return this.run('tokenColor', (c) => this.contract.impureCircuits.tokenColor(c)); } - getBalance(secret: Uint8Array): bigint { - return this.advance(this.contract.impureCircuits.getBalance(this.ctx, secret)); + getBalance(secret: Uint8Array): Promise { + return this.run('getBalance', (c) => this.contract.impureCircuits.getBalance(c, secret)); } - depositUnshielded(secret: Uint8Array, amount: bigint): void { - this.advance( - this.contract.impureCircuits.depositUnshielded(this.ctx, secret, amount), + async depositUnshielded(secret: Uint8Array, amount: bigint): Promise { + await this.run('depositUnshielded', (c) => + this.contract.impureCircuits.depositUnshielded(c, secret, amount), ); } - depositShielded(secret: Uint8Array, coin: ShieldedCoin): void { - this.advance( - this.contract.impureCircuits.depositShielded(this.ctx, secret, coin), + async depositShielded(secret: Uint8Array, coin: ShieldedCoin): Promise { + await this.run('depositShielded', (c) => + this.contract.impureCircuits.depositShielded(c, secret, coin), ); } - withdrawUnshielded( + async withdrawUnshielded( secret: Uint8Array, amount: bigint, recipient: EitherContractOrUser, - ): void { - this.advance( - this.contract.impureCircuits.withdrawUnshielded( - this.ctx, - secret, - amount, - recipient, - ), + ): Promise { + await this.run('withdrawUnshielded', (c) => + this.contract.impureCircuits.withdrawUnshielded(c, secret, amount, recipient), ); } @@ -138,27 +173,27 @@ export class ShieldedNightSimulator { amount: bigint, recipient: { bytes: Uint8Array }, nonce: Uint8Array, - ): ShieldedCoin { - return this.advance( - this.contract.impureCircuits.withdrawShielded( - this.ctx, - secret, - amount, - recipient, - nonce, - ), + ): Promise { + return this.run('withdrawShielded', (c) => + this.contract.impureCircuits.withdrawShielded(c, secret, amount, recipient, nonce), ); } /** Atomic NIGHT -> sNight (no secret): lock NIGHT and mint the wrapper. */ - convertToShielded(amount: bigint, recipient: { bytes: Uint8Array }, nonce: Uint8Array): ShieldedCoin { - return this.advance( - this.contract.impureCircuits.convertToShielded(this.ctx, amount, recipient, nonce), + convertToShielded( + amount: bigint, + recipient: { bytes: Uint8Array }, + nonce: Uint8Array, + ): Promise { + return this.run('convertToShielded', (c) => + this.contract.impureCircuits.convertToShielded(c, amount, recipient, nonce), ); } /** Atomic sNight -> NIGHT (no secret): burn the wrapper coin and release NIGHT. */ - convertToUnshielded(coin: ShieldedCoin, recipient: EitherContractOrUser): void { - this.advance(this.contract.impureCircuits.convertToUnshielded(this.ctx, coin, recipient)); + async convertToUnshielded(coin: ShieldedCoin, recipient: EitherContractOrUser): Promise { + await this.run('convertToUnshielded', (c) => + this.contract.impureCircuits.convertToUnshielded(c, coin, recipient), + ); } } diff --git a/vitest.integration.config.ts b/vitest.integration.config.ts index d38c331..dcd635d 100644 --- a/vitest.integration.config.ts +++ b/vitest.integration.config.ts @@ -22,5 +22,47 @@ export default defineConfig({ ['json', { outputFile: 'reports/vitest-results.json' }], ...(process.env.GITHUB_ACTIONS === 'true' ? (['github-actions'] as const) : []), ], + server: { + deps: { + // graphql@17's package.json `exports` map lists Bun's own "bun" + // condition before "require" in every branch, both pointing at an + // ESM-only .mjs. Bun always activates its "bun" condition, so any + // resolution of the bare specifier `graphql` — including + // graphql-tag's plain CJS `require('graphql')` — lands on the async + // ESM file, and Bun refuses to require() an async ES module. + // + // The chain is test/support/provider-wiring.ts -> + // @midnight-ntwrk/midnight-js-indexer-public-data-provider@5.0.0-beta.7 + // -> graphql-tag -> graphql. Only reachable via MN_EXTERNAL_STACK=1 + // (the normal testcontainers path never imports provider-wiring.ts + // through this loader in a way that triggers it — see below); plain + // `bun run` of the same chain (e.g. scripts/verify-deployment.ts) is + // unaffected because it never goes through vitest's SSR module + // runner at all. + // + // `graphql`/`graphql-tag`/`@apollo/client` alone are NOT enough: + // vitest's `pool: 'forks'` loads an externalized (non-inlined) + // module wholesale via a plain runtime `import()`/`require()`, and + // from that point on ALL of that module's own internal requires are + // native Bun requires with zero further Vite involvement — so + // inlining only the leaf graphql packages does nothing while + // `midnight-js-indexer-public-data-provider` itself stays + // externalized (its own `require('graphql-tag')` still resolves + // natively). Inlining the indexer provider TOO routes its module + // graph through Vite's SSR transform, which resolves the nested + // `graphql`/`graphql-tag` specifiers itself (SSR resolution defaults + // to node-oriented conditions, not Bun's) instead of leaving a raw + // externalized require() for Bun to resolve on its own. Measured: + // with only the three leaf packages inlined, all 6 integration + // files still crash at import under MN_EXTERNAL_STACK=1; adding the + // indexer provider makes all 6 collect cleanly (17 tests). + inline: [ + 'graphql', + 'graphql-tag', + '@apollo/client', + '@midnight-ntwrk/midnight-js-indexer-public-data-provider', + ], + }, + }, }, });