From d9f2be858cc5ac564447c7b8fe8e270bd5d90cf4 Mon Sep 17 00:00:00 2001 From: Michael Moffett Date: Fri, 23 Oct 2026 15:10:53 -0600 Subject: [PATCH 1/8] fix(python): reject x402 exact transactions with extra required signers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `ExactVerifier.verify` refuses a transaction whose required signers include anyone other than the fee payer and the transfer authority. scheme_exact_svm.md §2.1.4: "The transaction MUST NOT require any signatures beyond the client and the sponsor (feePayer)." Rust refuses this transaction and Python accepts it (FINDINGS.md#x402-extra-required-signer-accepted). --- harness/README.md | 6 +++--- harness/expectations/FINDINGS.md | 3 +-- harness/expectations/python.toml | 5 ----- .../protocols/x402/exact/verify.py | 7 +++++++ python/tests/test_pk_x402_verifier.py | 16 ++++++++++++++++ 5 files changed, 27 insertions(+), 10 deletions(-) diff --git a/harness/README.md b/harness/README.md index ddb8064a9..f5406cebe 100644 --- a/harness/README.md +++ b/harness/README.md @@ -261,7 +261,7 @@ regenerated with `pnpm coverage` and CI fails when it is stale. | vector session | 191 | 8 · 183u | 3 · 188u | — | — | 36 · 148u · 7k | — | 191 | 3 · 188u | 36 · 148u · 7k | | vector subscription | 123 | — | — | — | — | — | — | 123 | — | 70 · 15u · 38k | | vector x402-batch-settlement | 165 | — | — | — | — | — | — | 165 | — | 66 · 27u · 72k | -| vector x402-exact | 73 | 47 · 26k | — | 32 · 19u · 22k | 32 · 21u · 20k | 44 · 2u · 27k | 29 · 19u · 25k | 73 | 14 · 52u · 7k | 35 · 29u · 9k | +| vector x402-exact | 73 | 47 · 26k | — | 32 · 19u · 22k | 32 · 21u · 20k | 45 · 2u · 26k | 29 · 19u · 25k | 73 | 14 · 52u · 7k | 35 · 29u · 9k | | vector x402-upto | 124 | — | — | — | — | — | — | 124 | — | 104 · 2u · 18k | Each cell counts the cases that must pass, then `u` unsupported (declared, executed, must report unsupported) and `k` known failing (declared with tracking, executed, must fail). `—` means the SDK does not claim the suite. Source: `harness/expectations/.toml`. @@ -635,8 +635,8 @@ come from the same extraction as `pkc req-lint`. | `X402-6708749c55`* | scheme_exact_svm.md § 2.1.1 Fee Payer Isolation (MUST) | 2 | 2 | — | 1 · 1k | 1 · 1k | 1 · 1k | 2 | 2 | 0 · 2u | 2 | | `X402-ed41478ffe`* | scheme_exact_svm.md § 2.1.1 Fee Payer Isolation (MUST) | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 1 | | `X402-985ecc1ea3`* | scheme_exact_svm.md § 2.1.3 Fee Payer Fund Safety (MUST) | 1 | 1 | — | 0 · 1k | 0 · 1k | 0 · 1k | 1 | 1 | 0 · 1u | 1 | -| `X402-27bff260c3`* | scheme_exact_svm.md § 2.1.4 Signer Set Integrity (MUST) | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 0 · 1k | 0 · 1k | 1 | 0 · 1u | 0 · 1k | -| `X402-9b240d95a0`* | scheme_exact_svm.md § 2.1.4 Signer Set Integrity (MUST) | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 0 · 1k | 0 · 1k | 1 | 0 · 1u | 0 · 1k | +| `X402-27bff260c3`* | scheme_exact_svm.md § 2.1.4 Signer Set Integrity (MUST) | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 1 | 0 · 1k | 1 | 0 · 1u | 0 · 1k | +| `X402-9b240d95a0`* | scheme_exact_svm.md § 2.1.4 Signer Set Integrity (MUST) | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 1 | 0 · 1k | 1 | 0 · 1u | 0 · 1k | | `X402-6b3e9350c8`* | scheme_exact_svm.md § 3.1 Path 1 — Static Layout Verification (standard wallets) | 7 | 5 | — | 0 · 5u | 0 · 5u | 5 | 0 · 5u | 7 | 5 | 5 · 2u | | `X402-a1cf65b0f0`* | scheme_exact_svm.md § 3.1 Path 1 — Static Layout Verification (standard wallets) | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 1 | | `X402-a8bd75d71b`* | scheme_exact_svm.md § 3.1 Path 1 — Static Layout Verification (standard wallets) | 4 | 4 | — | 4 | 4 | 4 | 4 | 4 | 0 · 4u | 4 | diff --git a/harness/expectations/FINDINGS.md b/harness/expectations/FINDINGS.md index bcacb5f3d..5d513da89 100644 --- a/harness/expectations/FINDINGS.md +++ b/harness/expectations/FINDINGS.md @@ -38,7 +38,7 @@ Paths are file:line at the commit that recorded them. ## x402-extra-required-signer-accepted **Case:** `vector/x402-exact-verify-extra-required-signer-reject` -**SDKs:** go, lua, php, python, ruby, typescript +**SDKs:** go, lua, php, ruby, typescript scheme_exact_svm.md §2.1.4: “The transaction MUST NOT require any signatures beyond the client and the sponsor (feePayer).” The vector adds a third key as @@ -49,7 +49,6 @@ x402 verifier accepts, because none compares the header's required signers with {fee payer, transfer authority}: - Go `go/protocols/x402/verify.go:81` (`VerifyExactTransaction`) -- Python `python/src/solana_pay_kit/protocols/x402/exact/verify.py:83` - Ruby `ruby/lib/pay_kit/protocols/x402/protocol/schemes/exact/verify.rb:33`; `verify_client_signatures!` (`:68`) only checks that each extra signer signed - PHP `php/src/Protocols/X402/Exact/Verifier.php:61` diff --git a/harness/expectations/python.toml b/harness/expectations/python.toml index 80cca36aa..21b509e29 100644 --- a/harness/expectations/python.toml +++ b/harness/expectations/python.toml @@ -15,11 +15,6 @@ interop = ["x402:exact:client", "x402:exact:server", "x402:upto:client", "x402:u # Cross-checked against the testee `capabilities` op. honours_clock = true -[[known_failing]] -id = "vector/x402-exact-verify-extra-required-signer-reject" -reason = "the x402 exact verifier accepts a third required signer (scheme_exact_svm.md §2.1.4); python/src/solana_pay_kit/protocols/x402/exact/verify.py:83 never checks the header's signer set" -tracking = "FINDINGS.md#x402-extra-required-signer-accepted" - [[known_failing]] id = "vector/charge-build-sol-token-program-reject" reason = "the client builds a SOL charge whose challenge carries tokenProgram (python/src/solana_pay_kit/protocols/mpp/client/charge.py:208)" diff --git a/python/src/solana_pay_kit/protocols/x402/exact/verify.py b/python/src/solana_pay_kit/protocols/x402/exact/verify.py index 126a557d7..200b4f7c2 100644 --- a/python/src/solana_pay_kit/protocols/x402/exact/verify.py +++ b/python/src/solana_pay_kit/protocols/x402/exact/verify.py @@ -180,6 +180,13 @@ def verify( if expected_memo: ExactVerifier._find_memo_match(account_keys, instructions, expected_memo) + # §2.1.4: only the fee payer and the transfer authority may sign. + allowed_signers = (account_keys[0], transfer["authority"]) + for signer in account_keys[: int(message.header.num_required_signatures)]: + if signer not in allowed_signers: + reason = "invalid_exact_svm_payload_transaction_unexpected_signer" + raise InvalidProofError(reason, code=reason) + # The destination ATA must pre-exist; ATA-create is never accepted. transfer["destinationCreateAta"] = False return transfer diff --git a/python/tests/test_pk_x402_verifier.py b/python/tests/test_pk_x402_verifier.py index 681b47889..908d31b85 100644 --- a/python/tests/test_pk_x402_verifier.py +++ b/python/tests/test_pk_x402_verifier.py @@ -523,6 +523,22 @@ def test_reject_unknown_fourth_instruction(): assert e.value.code == "invalid_exact_svm_payload_unknown_fourth_instruction" +def test_reject_extra_required_signer(): + fee_payer, authority, pay_to, src, dest = _scenario() + extra = Keypair() + memo = Instruction(Pubkey.from_string(MEMO_PROGRAM), b"/pay", [AccountMeta(extra.pubkey(), True, False)]) + ixs = [ + _compute_limit_ix(), + _compute_price_ix(), + _transfer_checked_ix(source=src, mint=MINT, destination=dest, authority=authority.pubkey()), + memo, + ] + tx = _tx_b64(fee_payer, ixs, [fee_payer, authority, extra]) + with pytest.raises(InvalidProofError) as e: + ExactVerifier.verify(tx, _requirement(pay_to), [str(fee_payer.pubkey())]) + assert e.value.code == "invalid_exact_svm_payload_transaction_unexpected_signer" + + # -- rule 10: memo binding --------------------------------------------------- From f2c7b785fbdd1f2cf7982188cee7e2709342dfa1 Mon Sep 17 00:00:00 2001 From: Michael Moffett Date: Fri, 23 Oct 2026 15:10:54 -0600 Subject: [PATCH 2/8] greptile.json: review on request only --- greptile.json | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 greptile.json diff --git a/greptile.json b/greptile.json new file mode 100644 index 000000000..11af4c46b --- /dev/null +++ b/greptile.json @@ -0,0 +1,220 @@ +{ + "autoReview": [], + "strictness": 1, + "customContext": { + "rules": [ + { + "rule": "pay-kit#317 `solana-foundation/pay-kit@a58c78e:go/protocols/mpp/wire/challenge_test.go:56`: `now` was fixed at 1900, so the leap-second cases proved only that parsing succeeded, not the mapping to the last nanosecond of `:59` (https://github.com/solana-foundation/pay-kit/pull/317#discussion_r3982265139).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#13 `caliperforge/pay-kit@efff41c:harness/protocol-runners/kotlin.json:3`: the manifest execs an installed Gradle distribution that no CI job builds, so on a clean checkout the runner cannot start (https://github.com/caliperforge/pay-kit/pull/13#discussion_r4166253848).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#13 `caliperforge/pay-kit@8c59ab9:harness/test/protocol-conformance.test.ts:195`: a spawn failure, a non-zero exit or empty stdout counted as the expected divergence, so a runner that never ran looked green.", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#13 `caliperforge/pay-kit@2291822:harness/kotlin-protocol-runner/src/main/kotlin/com/solana/paykit/protocolrunner/Main.kt:77`: decoding with unknown keys ignored silently dropped the `hash` payload of `credential_with_source` (https://github.com/caliperforge/pay-kit/pull/13#discussion_r4166253870).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#13 `caliperforge/pay-kit@c4341ee:harness/kotlin-protocol-runner/src/main/kotlin/com/solana/paykit/protocolrunner/Main.kt:57-66`: the same lenient decoding dropped the challenge `description` (https://github.com/caliperforge/pay-kit/pull/13#discussion_r4166253852).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#320 `solana-foundation/pay-kit@a55ee48:php/tests/PayCore/Rfc3339Test.php:48`: long-fraction vectors were checked with `format('c')`, which drops microseconds, so a parser that discards the fraction still passed (https://github.com/solana-foundation/pay-kit/pull/320#discussion_r3992887690).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#320 `solana-foundation/pay-kit@a55ee48:php/tests/PayCore/Rfc3339Test.php:88`: no case exercised the last-day-of-month rule for `23:59:60Z`, so deleting the check kept the suite green (https://github.com/solana-foundation/pay-kit/pull/320#discussion_r3992887696).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#340 `solana-foundation/pay-kit@b2638e1:ruby/lib/pay_kit/config.rb:271`: an empty `PAY_KIT_RPC_URL` overrode the network default with `\"\"`, unlike the Python SDK it mirrors (https://github.com/solana-foundation/pay-kit/pull/340#discussion_r4095737040).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#340 `solana-foundation/pay-kit@b2638e1:ruby/lib/pay_kit/config.rb:277`: a zero or negative `PAY_KIT_MPP_EXPIRES_IN` was accepted, issuing already-expired challenges, unlike the Python SDK it mirrors (https://github.com/solana-foundation/pay-kit/pull/340#discussion_r4095737053).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#340 `solana-foundation/pay-kit@b2638e1:ruby/lib/pay_kit/config.rb:308`: `yes`/`no`/`on`/`off` for `PAY_KIT_PREFLIGHT` raised at boot, unlike the Python SDK it mirrors (https://github.com/solana-foundation/pay-kit/pull/340#discussion_r4095737067).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#340 `solana-foundation/pay-kit@b2638e1:ruby/lib/pay_kit/config.rb:268`: lowercase `pay_kit_*` variables were silently ignored, unlike the Python SDK it mirrors (https://github.com/solana-foundation/pay-kit/pull/340#discussion_r4095737071).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#15 `caliperforge/pay-kit@1f02e55:swift/Sources/mpp-protocol-runner/main.swift:74`: `challenge.parse` dropped `description` (https://github.com/caliperforge/pay-kit/pull/15#discussion_r4173474978).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#15 `caliperforge/pay-kit@1f02e55:swift/Sources/mpp-protocol-runner/main.swift:97`: `credential.format` required `transaction` for `type: \"transaction\"`, so the canonical `basic_credential` vector could not be formatted (https://github.com/caliperforge/pay-kit/pull/15#discussion_r4173474983).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#322 `solana-foundation/pay-kit@c35533e:swift/Sources/SolanaPayKit/Protocols/Mpp/Core/Models.swift:125`: a review asked to allow leap seconds only in June and December; RFC 3339 §5.7 and Appendix D do not restrict them, the UTC month-end check matches the Rust reference, and the finding was withdrawn (https://github.com/solana-foundation/pay-kit/pull/322#discussion_r4035505691).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#282 `solana-foundation/pay-kit@e2f2b1d:harness/src/protocol/vectors.ts:436`: `collectExpiresCases()` had no callers, though comments said the per-language tests used it (https://github.com/solana-foundation/pay-kit/pull/282#discussion_r3751682861).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#282 `solana-foundation/pay-kit@faf3250:typescript/packages/mpp/src/__tests__/client-charge-validation.test.ts:449`: the test imported `../shared/rfc3339.js`, which did not exist at that SHA, so the whole file failed to load (https://github.com/solana-foundation/pay-kit/pull/282#discussion_r3960191945).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#282 `solana-foundation/pay-kit@faf3250:typescript/packages/mpp/src/__tests__/client-charge-validation.test.ts:478`: the loop tested only `parseRfc3339` while the production guards still used `new Date(...)` and `Date.parse`, so the tests could pass without exercising the shipped code (https://github.com/solana-foundation/pay-kit/pull/282#discussion_r3960191963).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#313 `solana-foundation/pay-kit@a752d51:typescript/packages/mpp/src/shared/rfc3339.ts:38`: rejected `second = 60`, which RFC 3339 allows for a positive leap second (https://github.com/solana-foundation/pay-kit/pull/313#discussion_r3962113765).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#14 `caliperforge/pay-kit@208fbd7:harness/test/protocol-conformance.test.ts:179`: an expectation checked only that `description` was absent, so `result: {}` would also pass (https://github.com/caliperforge/pay-kit/pull/14#discussion_r4173234527).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#13 `caliperforge/pay-kit@66449a5:harness/kotlin-protocol-runner/src/main/kotlin/com/solana/paykit/protocolrunner/Main.kt:66`: \"P1\" **Challenge description is dropped** When a valid header contains a top-level `description`, such as the canonical `full_challenge`, this response omits it. The parsed challenge no longer matches the expected object, and the basic-only runner test does not catch the difference. (https://github.com/caliperforge/pay-kit/pull/13#discussion_r4166253852).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#13 `caliperforge/pay-kit@66449a5:harness/kotlin-protocol-runner/src/main/kotlin/com/solana/paykit/protocolrunner/Main.kt:65`: \"P1\" **Plain opaque values fail parsing** The SDK treats `opaque` as a pass-through string. When a valid challenge contains a plain value such as `trace-123`, decoding it as base64url JSON throws, so the runner returns `parse_error` instead of the parsed challenge. (https://github.com/caliperforge/pay-kit/pull/13#discussion_r4166253859).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#13 `caliperforge/pay-kit@8c59ab9:harness/kotlin-protocol-runner/src/main/kotlin/com/solana/paykit/protocolrunner/Main.kt:77`: \"P1\" **Hash payload is lost** The canonical `credential_with_source` case contains a valid `hash` payload. This code deserializes it while ignoring unknown fields, but the Kotlin payload type has no `hash` property. Formatting then emits an Authorization header without the hash value. (https://github.com/caliperforge/pay-kit/pull/13#discussion_r4166253870).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#16 `caliperforge/pay-kit@00614e3:harness/kotlin-protocol-runner/src/main/kotlin/com/solana/paykit/protocolrunner/Main.kt:78`: \"P1\" **Opaque values are misparsed** When a valid Payment challenge includes `opaque`, the runner tries to decode it as base64url JSON even though the SDK and protocol adapter treat it as an opaque string. A value that is not JSON becomes a parse error; a JSON-bearing value is returned with the wrong type. (https://github.com/caliperforge/pay-kit/pull/16#discussion_r4186902439).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#16 `caliperforge/pay-kit@00614e3:harness/kotlin-protocol-runner/src/main/kotlin/com/solana/paykit/protocolrunner/Main.kt:85`: \"P2\" **Missing request becomes valid** If a `credential.format` input omits the required `challenge.request`, the runner inserts an empty request and can return a successful Authorization header. This hides an invalid input and produces a header that does not represent the supplied challenge. (https://github.com/caliperforge/pay-kit/pull/16#discussion_r4186902463).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#16 `caliperforge/pay-kit@00614e3:harness/kotlin-protocol-runner/src/main/kotlin/com/solana/paykit/protocolrunner/Main.kt:77`: \"P2\" **Empty optional values disappear** When a parsed challenge contains an explicitly empty `expires` or `digest`, these checks omit the field from the result. The adapter distinguishes a present empty value from an absent field, so the runner returns the wrong object for those headers. (https://github.com/caliperforge/pay-kit/pull/16#discussion_r4186902477).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#16 `caliperforge/pay-kit@00614e3:harness/kotlin-protocol-runner/src/main/kotlin/com/solana/paykit/protocolrunner/Main.kt:33`: \"P2\" **Conformance skips recognized operations** Seven recognized operations always return fixed errors, and the Kotlin divergence tests assert those responses instead of exercising protocol behavior. A green Kotlin protocol job therefore does not verify encoding, challenge generation, or those header operations. Implement them or separate these gap checks from conformance coverage. (https://github.com/caliperforge/pay-kit/pull/16#discussion_r4186902484).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#20 `caliperforge/pay-kit@473293a:php/src/Gate.php:136`: \"P1\" **Inherited protocol limits are ignored** When a gate has no explicit `accept` list, this method returns true for any fee-free protocol without checking `Config`. With a configuration that accepts only MPP, `gate->accepts(Protocol::X402)` therefore returns true even though the middleware excludes X402. Callers of this new public method get an admission decision that contradicts the configured protocol limit. (https://github.com/caliperforge/pay-kit/pull/20#discussion_r4188609106).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#18 `caliperforge/pay-kit@c94203d:php/src/Config.php:113`: \"P2\" **Blank expiry bypasses validation** If `PAY_KIT_MPP_EXPIRES_IN` is set but blank, this helper turns it into `null`. The TTL resolver then uses the 120-second default instead of rejecting the malformed value, so a mistyped setting goes unnoticed. (https://github.com/caliperforge/pay-kit/pull/18#discussion_r4188597519).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#18 `caliperforge/pay-kit@c94203d:php/tests/ConfigTest.php:31`: \"P2\" **Tests clear existing configuration** If the shell already has a production configuration variable set, these tests do not isolate themselves from it and `tearDown()` removes it instead of restoring it. For example, an existing `PAY_KIT_NETWORK=solana_mainnet` makes the defaults test throw because it selects mainnet with a demo signer; after cleanup, subsequent tests see a different environment. (https://github.com/caliperforge/pay-kit/pull/18#discussion_r4188597530).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#22 `caliperforge/pay-kit@3514734:python/tests/allowlist_generator.py:127`: \"P2\" **Token drains go untested** (https://github.com/caliperforge/pay-kit/pull/22#discussion_r4220236268).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#14 `caliperforge/pay-kit@17dd9a2:harness/test/protocol-conformance.test.ts:212`: \"P2\" **Formatter cases are skipped** This filter selects no successful `credential.format` vector and no `receipt.format` vector: neither operation is in `smokeOps`, and the Kotlin map has only a failing credential-format case. The credential formatter could fail every valid request without failing this suite, while the declared receipt-format gap gets no conformance check. Add a successful formatter case and track the receipt-format gap. (https://github.com/caliperforge/pay-kit/pull/14#discussion_r4173234531).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#14 `caliperforge/pay-kit@b976cea:harness/test/protocol-conformance.test.ts:179`: \"P2\" **Challenge fields go unchecked** For challenges with a description, this expectation checks only that `description` is absent. A response with `result: {}` would also pass, so the test would miss regressions in required challenge fields or the decoded request. Check those fields against the vector while allowing the known omission. (https://github.com/caliperforge/pay-kit/pull/14#discussion_r4173234527).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#18 `caliperforge/pay-kit@e227243:harness/src/artifacts.ts:48`: \"P1\" **Swift conformance build fails** The Swift conformance target builds from `swift/`, but its `Package.swift` is at the repository root. The macOS artifact build therefore cannot find the package manifest and fails before the Swift harness legs can run. (https://github.com/caliperforge/pay-kit/pull/18#discussion_r4209441653).", + "scope": [ + "**" + ] + }, + { + "rule": "pay-kit#18 `caliperforge/pay-kit@e227243:typescript/packages/mpp/src/server/Charge.ts:815`: \"P1\" **Failed sends strand payments** If `sendTransaction` fails before accepting a pull-mode payment, the replay reservation remains pending for 21 minutes. A retry of the same signed payment is rejected as already in progress; after the lease expires, recovery only checks for confirmation and never broadcasts it. A transient send failure can therefore leave a valid payment unable to complete. (https://github.com/caliperforge/pay-kit/pull/18#discussion_r4209441678).", + "scope": [ + "**" + ] + } + ], + "files": [ + { + "path": "docs/paykit-interface.md", + "scope": [ + "**" + ] + } + ] + } +} From c0fca9d605f95b418a56d5bc0ed9668a7e108438 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Fri, 23 Oct 2026 18:33:04 -0400 Subject: [PATCH 3/8] fix(rust): additional hardening across sessions, channels and clients (#397) --- harness/README.md | 40 +- harness/expectations/FINDINGS.md | 67 + harness/expectations/RULINGS.md | 16 +- harness/expectations/python.toml | 7 + harness/expectations/typescript.toml | 25 + harness/requirements/x402.toml | 12 + harness/src/conformance/schema.ts | 10 +- harness/vectors/FILL.sha256 | 38 +- ...tch-txv1-top-up-v1-priority-fee-at-cap.txt | 2 +- ...top-up-v1-priority-fee-over-cap-reject.txt | 2 +- ...1-priority-fee-over-sponsor-cap-reject.txt | 51 + ...atch-verify-open-unfunded-payer-reject.txt | 47 + ...ch-verify-top-up-compute-budget-prefix.txt | 2 +- ...cit-limit-priority-fee-over-cap-reject.txt | 47 + ...fy-top-up-priority-fee-over-cap-reject.txt | 47 + ...ch-verify-top-up-unfunded-payer-reject.txt | 47 + ...-voucher-receiver-quotes-a-code-reject.txt | 43 + ...402-upto-verify-compute-at-caps-accept.txt | 2 +- ...erify-implicit-limit-at-fee-cap-accept.txt | 37 + ...cit-limit-priority-fee-over-cap-reject.txt | 37 + ...to-verify-priority-fee-over-cap-reject.txt | 37 + ...o-verify-v1-priority-fee-at-cap-accept.txt | 2 +- ...verify-v1-priority-fee-over-cap-reject.txt | 2 +- ...1-priority-fee-over-sponsor-cap-reject.txt | 41 + harness/vectors/batch-txv1.json | 174 +- harness/vectors/batch-verify-open.json | 145 ++ .../vectors/batch-verify-setup-policy.json | 479 +++++- harness/vectors/batch-verify-voucher.json | 158 ++ harness/vectors/session-build.json | 212 +++ harness/vectors/x402-upto-build.json | 120 ++ harness/vectors/x402-upto-open-policy.json | 542 +++++- harness/vectors/x402-upto-txv1.json | 190 ++- rust/README.md | 22 +- .../conformance/src/cases/session_server.rs | 12 + .../conformance/src/cases/x402_batch.rs | 56 +- .../crates/conformance/src/cases/x402_upto.rs | 67 +- rust/crates/conformance/src/fixture_rpc.rs | 13 +- rust/crates/conformance/src/interop/settle.rs | 14 +- rust/crates/conformance/src/realize.rs | 4 + rust/crates/conformance/src/realize/batch.rs | 16 +- .../crates/conformance/src/realize/session.rs | 86 +- .../conformance/src/realize/session_open.rs | 20 +- .../src/bin/mpp_harness_client.rs | 10 +- rust/crates/kit/examples/vector_runner.rs | 4 + .../kit/examples/vector_runner/session.rs | 42 +- rust/crates/kit/src/client/mod.rs | 145 +- rust/crates/kit/src/core/batch_verify.rs | 126 +- .../kit/src/core/payment_channel/mod.rs | 2 + .../src/core/payment_channel/payer_refund.rs | 334 ++++ .../src/core/payment_channel/token_account.rs | 93 ++ .../crates/kit/src/core/payment_channel/v1.rs | 16 + rust/crates/kit/src/core/settlement/worker.rs | 276 ++- rust/crates/kit/src/core/store.rs | 23 +- rust/crates/kit/src/core/tx_pipeline.rs | 209 ++- rust/crates/kit/src/gate.rs | 439 ++--- rust/crates/kit/src/mpp/client/charge.rs | 81 +- rust/crates/kit/src/mpp/client/http_stream.rs | 211 ++- rust/crates/kit/src/mpp/client/mod.rs | 6 +- rust/crates/kit/src/mpp/client/session.rs | 498 ++++-- .../kit/src/mpp/client/session_consumer.rs | 173 +- rust/crates/kit/src/mpp/server/charge.rs | 97 +- .../crates/kit/src/mpp/server/confidential.rs | 467 +++++- rust/crates/kit/src/mpp/server/mod.rs | 1 + rust/crates/kit/src/mpp/server/session.rs | 1488 ++++++++++++++++- .../kit/src/mpp/server/session_refund.rs | 103 ++ .../kit/src/x402/client/upto/payment.rs | 134 +- .../schemes/batch_settlement/errors.rs | 49 +- .../protocol/schemes/batch_settlement/mod.rs | 2 +- .../schemes/batch_settlement/tx_policy.rs | 83 + .../kit/src/x402/server/batch_settlement.rs | 1118 ++++++++++--- rust/crates/kit/src/x402/server/upto.rs | 763 ++++++++- 71 files changed, 9056 insertions(+), 928 deletions(-) create mode 100644 harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject.txt create mode 100644 harness/vectors/annotated/batch-verify-open-unfunded-payer-reject.txt create mode 100644 harness/vectors/annotated/batch-verify-top-up-implicit-limit-priority-fee-over-cap-reject.txt create mode 100644 harness/vectors/annotated/batch-verify-top-up-priority-fee-over-cap-reject.txt create mode 100644 harness/vectors/annotated/batch-verify-top-up-unfunded-payer-reject.txt create mode 100644 harness/vectors/annotated/batch-verify-voucher-receiver-quotes-a-code-reject.txt create mode 100644 harness/vectors/annotated/x402-upto-verify-implicit-limit-at-fee-cap-accept.txt create mode 100644 harness/vectors/annotated/x402-upto-verify-implicit-limit-priority-fee-over-cap-reject.txt create mode 100644 harness/vectors/annotated/x402-upto-verify-priority-fee-over-cap-reject.txt create mode 100644 harness/vectors/annotated/x402-upto-verify-v1-priority-fee-over-sponsor-cap-reject.txt create mode 100644 rust/crates/kit/src/core/payment_channel/payer_refund.rs create mode 100644 rust/crates/kit/src/core/payment_channel/token_account.rs create mode 100644 rust/crates/kit/src/mpp/server/session_refund.rs diff --git a/harness/README.md b/harness/README.md index ddb8064a9..10838a45a 100644 --- a/harness/README.md +++ b/harness/README.md @@ -258,11 +258,11 @@ regenerated with `pnpm coverage` and CI fails when it is stale. | flow | 34 | — | — | — | — | — | — | — | — | 30 · 4u | | protocol | 91 | 91 | — | 91 | 91 | 91 | 91 | 91 | — | 91 | | vector charge | 117 | 71 · 46k | — | 57 · 29u · 31k | 59 · 29u · 29k | 79 · 38k | 60 · 29u · 28k | 117 | 29 · 72u · 16k | 74 · 2u · 41k | -| vector session | 191 | 8 · 183u | 3 · 188u | — | — | 36 · 148u · 7k | — | 191 | 3 · 188u | 36 · 148u · 7k | +| vector session | 192 | 8 · 184u | 3 · 189u | — | — | 36 · 149u · 7k | — | 192 | 3 · 189u | 36 · 149u · 7k | | vector subscription | 123 | — | — | — | — | — | — | 123 | — | 70 · 15u · 38k | -| vector x402-batch-settlement | 165 | — | — | — | — | — | — | 165 | — | 66 · 27u · 72k | +| vector x402-batch-settlement | 171 | — | — | — | — | — | — | 171 | — | 67 · 27u · 77k | | vector x402-exact | 73 | 47 · 26k | — | 32 · 19u · 22k | 32 · 21u · 20k | 44 · 2u · 27k | 29 · 19u · 25k | 73 | 14 · 52u · 7k | 35 · 29u · 9k | -| vector x402-upto | 124 | — | — | — | — | — | — | 124 | — | 104 · 2u · 18k | +| vector x402-upto | 129 | — | — | — | — | — | — | 129 | — | 105 · 2u · 22k | Each cell counts the cases that must pass, then `u` unsupported (declared, executed, must report unsupported) and `k` known failing (declared with tracking, executed, must fail). `—` means the SDK does not claim the suite. Source: `harness/expectations/.toml`. @@ -314,7 +314,7 @@ files (`pkc report`; `pkc report --check` fails when stale). The counts come from the same extraction as `pkc req-lint`. -1732 normative sentences in the pinned specs: 405 mapped to a requirement, 1307 unmapped. +1732 normative sentences in the pinned specs: 407 mapped to a requirement, 1305 unmapped. | Spec file | Normative | Mapped | Ignored | Unmapped | | --- | ---: | ---: | ---: | ---: | @@ -330,7 +330,7 @@ come from the same extraction as `pkc req-lint`. | `x402/scheme_upto.md` | 13 | 2 | 0 | 11 | | `x402/scheme_upto_svm.md` | 87 | 42 | 0 | 45 | | `x402/scheme_batch_settlement.md` | 2 | 0 | 0 | 2 | -| `x402/scheme_batch_settlement_svm.md` | 200 | 78 | 0 | 122 | +| `x402/scheme_batch_settlement_svm.md` | 200 | 80 | 0 | 120 | | `mpp-specs-solana/draft-solana-subscription-00.md` | 93 | 40 | 0 | 53 | | `mpp-specs-txv1/draft-solana-charge-00.md` | 156 | 18 | 0 | 138 | | `mpp-specs-txv1/draft-solana-session-00.md` | 229 | 12 | 0 | 217 | @@ -449,7 +449,7 @@ come from the same extraction as `pkc req-lint`. | `MPP-69c0a4f95f`* | draft-solana-session-00.md § Method Details | 6 | 0 · 6u | 0 · 6u | — | — | 4 · 2u | — | 6 | 0 · 6u | 4 · 2u | | `MPP-a3d2da92ea`* | draft-solana-session-00.md § Method Details | 1 | 0 · 1u | 0 · 1u | — | — | 0 · 1u | — | 1 | 0 · 1u | 0 · 1u | | `MPP-bb80675c8e`* | draft-solana-session-00.md § Method Details | 1 | 0 · 1u | 0 · 1u | — | — | 1 | — | 1 | 0 · 1u | 1 | -| `MPP-d235eadc2e`* | draft-solana-session-00.md § Method Details | 2 | 0 · 2u | 0 · 2u | — | — | 0 · 2u | — | 2 | 0 · 2u | 0 · 2u | +| `MPP-d235eadc2e`* | draft-solana-session-00.md § Method Details | 3 | 0 · 3u | 0 · 3u | — | — | 0 · 3u | — | 3 | 0 · 3u | 0 · 3u | | `MPP-d5da84fe70`* | draft-solana-session-00.md § Method Details | 3 | 0 · 3u | 0 · 3u | — | — | 1 · 2u | — | 3 | 0 · 3u | 1 · 2u | | `MPP-ecdf5de619`* | draft-solana-session-00.md § Method Details | 2 | 0 · 2u | 0 · 2u | — | — | 1 · 1u | — | 2 | 0 · 2u | 1 · 1u | | `MPP-bf87a688ef`* | draft-solana-session-00.md § Mint Allow-List | 1 | 0 · 1u | 0 · 1u | — | — | 0 · 1u | — | 1 | 0 · 1u | 0 · 1u | @@ -563,7 +563,7 @@ come from the same extraction as `pkc req-lint`. | `X402-23747f44c3`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-2f8ea170e2`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-87c5fe8803`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 5 | — | — | — | — | — | — | 5 | — | 0 · 5k | -| `X402-a2dd2eb911`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 1 | — | — | — | — | — | — | 1 | — | 1 | +| `X402-a2dd2eb911`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-ae5ee4f564`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-d171becfd9`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 2 | — | — | — | — | — | — | 2 | — | 1 · 1k | | `X402-d71a021041`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 2 | — | — | — | — | — | — | 2 | — | 1 · 1u | @@ -582,11 +582,13 @@ come from the same extraction as `pkc req-lint`. | `X402-638126c26b`* | scheme_batch_settlement_svm.md § 4.6 Corrective PaymentRequired | 12 | — | — | — | — | — | — | 12 | — | 0 · 12u | | `X402-84916fe051`* | scheme_batch_settlement_svm.md § 8. Security Properties | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-f882f2074a`* | scheme_batch_settlement_svm.md § 8. Security Properties | 1 | — | — | — | — | — | — | 1 | — | 1 | +| `X402-0ff4cabcb4`* | scheme_batch_settlement_svm.md § Canonical open | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | | `X402-176a26e5b6`* | scheme_batch_settlement_svm.md § Canonical open | 2 | — | — | — | — | — | — | 2 | — | 0 · 2k | | `X402-5276aee847`* | scheme_batch_settlement_svm.md § Canonical refund request_close | 3 | — | — | — | — | — | — | 3 | — | 0 · 3k | | `X402-a6092f0a02`* | scheme_batch_settlement_svm.md § Canonical refund request_close | 4 | — | — | — | — | — | — | 4 | — | 0 · 4k | | `X402-c88cc9c766`* | scheme_batch_settlement_svm.md § Canonical refund request_close | 2 | — | — | — | — | — | — | 2 | — | 0 · 2k | | `X402-d450762477`* | scheme_batch_settlement_svm.md § Canonical refund request_close | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | +| `X402-014270dc81`* | scheme_batch_settlement_svm.md § Canonical top_up | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | | `X402-06bb8f3a9e`* | scheme_batch_settlement_svm.md § Canonical top_up | 3 | — | — | — | — | — | — | 3 | — | 1 · 1u · 1k | | `X402-4cedb5114b`* | scheme_batch_settlement_svm.md § Canonical top_up | 2 | — | — | — | — | — | — | 2 | — | 1 · 1k | | `X402-9ca40ae469`* | scheme_batch_settlement_svm.md § Canonical top_up | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | @@ -619,7 +621,7 @@ come from the same extraction as `pkc req-lint`. | `X402-3ed2ac9962`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | | `X402-536163eb05`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 2 | — | — | — | — | — | — | 2 | — | 0 · 2k | | `X402-897add7b39`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 1 | — | — | — | — | — | — | 1 | — | 1 | -| `X402-a93234f1d7`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 3 | — | — | — | — | — | — | 3 | — | 1 · 2k | +| `X402-a93234f1d7`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 5 | — | — | — | — | — | — | 5 | — | 1 · 4k | | `X402-ae18578132`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 2 | — | — | — | — | — | — | 2 | — | 1 · 1k | | `X402-ebd20058fd`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 3 | — | — | — | — | — | — | 3 | — | 0 · 3k | | `X402-8fcdf05fbf`* | scheme_exact.md § Client-submitted (payment proof) | 2 | 2 | — | 2 | 2 | 2 | 2 | 2 | 0 · 2u | 2 | @@ -658,8 +660,8 @@ come from the same extraction as `pkc req-lint`. | `X402-99f2a389e8`* | scheme_upto_svm.md § 4.2 UptoPayload (in PAYMENT-SIGNATURE.payload) | 3 | — | — | — | — | — | — | 3 | — | 3 | | `X402-cf373442ff`* | scheme_upto_svm.md § 4.2 UptoPayload (in PAYMENT-SIGNATURE.payload) | 3 | — | — | — | — | — | — | 3 | — | 3 | | `X402-d75fb10a6f`* | scheme_upto_svm.md § 4.2 UptoPayload (in PAYMENT-SIGNATURE.payload) | 17 | — | — | — | — | — | — | 17 | — | 16 · 1k | -| `X402-eace5aece9`* | scheme_upto_svm.md § 4.2 UptoPayload (in PAYMENT-SIGNATURE.payload) | 4 | — | — | — | — | — | — | 4 | — | 3 · 1u | -| `X402-3b5914a7c5`* | scheme_upto_svm.md § 8. Security Properties | 1 | — | — | — | — | — | — | 1 | — | 1 | +| `X402-eace5aece9`* | scheme_upto_svm.md § 4.2 UptoPayload (in PAYMENT-SIGNATURE.payload) | 5 | — | — | — | — | — | — | 5 | — | 3 · 1u · 1k | +| `X402-3b5914a7c5`* | scheme_upto_svm.md § 8. Security Properties | 4 | — | — | — | — | — | — | 4 | — | 2 · 2k | | `X402-076bb2bdc3`* | scheme_upto_svm.md § Canonical open instruction | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | | `X402-14b8b2b598`* | scheme_upto_svm.md § Canonical open instruction | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-4c364688fc`* | scheme_upto_svm.md § Canonical open instruction | 1 | — | — | — | — | — | — | 1 | — | 1 | @@ -675,12 +677,12 @@ come from the same extraction as `pkc req-lint`. | `X402-c1174b72d8`* | scheme_upto_svm.md § Message and signer rules | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-f747c74e76`* | scheme_upto_svm.md § Phase 2 - Authorization | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-11bbb0287f`* | scheme_upto_svm.md § Top-level instruction layout | 1 | — | — | — | — | — | — | 1 | — | 1 | -| `X402-233dcf8a3e`* | scheme_upto_svm.md § Top-level instruction layout | 2 | — | — | — | — | — | — | 2 | — | 2 | -| `X402-443a167ea1`* | scheme_upto_svm.md § Top-level instruction layout | 3 | — | — | — | — | — | — | 3 | — | 3 | +| `X402-233dcf8a3e`* | scheme_upto_svm.md § Top-level instruction layout | 5 | — | — | — | — | — | — | 5 | — | 3 · 2k | +| `X402-443a167ea1`* | scheme_upto_svm.md § Top-level instruction layout | 4 | — | — | — | — | — | — | 4 | — | 4 | | `X402-683361bbae`* | scheme_upto_svm.md § Top-level instruction layout | 3 | — | — | — | — | — | — | 3 | — | 2 · 1k | | `X402-7cd3ca69a6`* | scheme_upto_svm.md § Top-level instruction layout | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-b2b604a864`* | scheme_upto_svm.md § Top-level instruction layout | 4 | — | — | — | — | — | — | 4 | — | 4 | -| `X402-b4167aad45`* | scheme_upto_svm.md § Top-level instruction layout | 4 | — | — | — | — | — | — | 4 | — | 3 · 1k | +| `X402-b4167aad45`* | scheme_upto_svm.md § Top-level instruction layout | 6 | — | — | — | — | — | — | 6 | — | 3 · 3k | | `X402-c8544c0fdd`* | scheme_upto_svm.md § Top-level instruction layout | 3 | — | — | — | — | — | — | 3 | — | 3 | | `X402-ce3692afe0`* | scheme_upto_svm.md § Top-level instruction layout | 17 | — | — | — | — | — | — | 17 | — | 12 · 5k | | `X402-d0ce5e5325`* | scheme_upto_svm.md § Top-level instruction layout | 3 | — | — | — | — | — | — | 3 | — | 3 | @@ -706,11 +708,11 @@ come from the same extraction as `pkc req-lint`. | `X402TX-10b3fe2ef3`* | scheme_exact_svm.md § PaymentPayload payload Field | 5 | 2 · 3k | — | 1 · 2u · 2k | 1 · 2u · 2k | 2 · 3k | 1 · 2u · 2k | 5 | 1 · 3u · 1k | 1 · 2u · 2k | | `X402TX-d444d01b9e`* | scheme_upto_svm.md § 4.2 UptoPayload (in PAYMENT-SIGNATURE.payload) | 3 | — | — | — | — | — | — | 3 | — | 0 · 3k | | `X402TX-4de59a1f27`* | scheme_upto_svm.md § Message and signer rules | 6 | — | — | — | — | — | — | 6 | — | 1 · 5k | -| `X402TX-0f874a9c63`* | scheme_upto_svm.md § Top-level instruction layout | 12 | — | — | — | — | — | — | 12 | — | 0 · 12k | +| `X402TX-0f874a9c63`* | scheme_upto_svm.md § Top-level instruction layout | 14 | — | — | — | — | — | — | 14 | — | 0 · 14k | | `X402TX-125d312b26`* | scheme_upto_svm.md § Top-level instruction layout | 2 | — | — | — | — | — | — | 2 | — | 0 · 2k | | `X402TX-5267172b18`* | scheme_upto_svm.md § Transaction versions | 4 | — | — | — | — | — | — | 4 | — | 0 · 4k | -
Unmapped normative sentences by spec file and section (1307) +
Unmapped normative sentences by spec file and section (1305) | Spec file | Section | Normative | Mapped | Unmapped | | --- | --- | ---: | ---: | ---: | @@ -910,8 +912,8 @@ come from the same extraction as `pkc req-lint`. | `scheme_batch_settlement_svm.md` | Phase 1 - Open or Top Up | 5 | 3 | 2 | | `scheme_batch_settlement_svm.md` | Message and signer rules | 9 | 7 | 2 | | `scheme_batch_settlement_svm.md` | Top-level instruction layout | 13 | 10 | 3 | -| `scheme_batch_settlement_svm.md` | Canonical open | 3 | 1 | 2 | -| `scheme_batch_settlement_svm.md` | Canonical top_up | 11 | 4 | 7 | +| `scheme_batch_settlement_svm.md` | Canonical open | 3 | 2 | 1 | +| `scheme_batch_settlement_svm.md` | Canonical top_up | 11 | 5 | 6 | | `scheme_batch_settlement_svm.md` | Canonical refund request_close | 8 | 4 | 4 | | `scheme_batch_settlement_svm.md` | Phase 2 - Steady-State Request | 3 | 0 | 3 | | `scheme_batch_settlement_svm.md` | Phase 3 - Voucher Acceptance (before serving) | 14 | 5 | 9 | @@ -1130,7 +1132,7 @@ case is in no scheduled shard. | --- | ---: | ---: | ---: | | charge | 159 | 136 | 23 | | x402-exact | 75 | 58 | 17 | -| x402-upto | 12 | 9 | 3 | +| x402-upto | 12 | 8 | 4 | **charge**: claimed cases per SDK as client (against the Rust server) and as server (against the Rust client); `k` known failing. @@ -1166,7 +1168,7 @@ case is in no scheduled shard. | --- | :---: | :---: | | go | 2 · 2k | 1 · 1k | | kotlin | 2 | | -| python | 2 | 1 | +| python | 2 | 1 · 1k | | rust | 2 | (control) | | swift | 2 | | diff --git a/harness/expectations/FINDINGS.md b/harness/expectations/FINDINGS.md index bcacb5f3d..04ffd848b 100644 --- a/harness/expectations/FINDINGS.md +++ b/harness/expectations/FINDINGS.md @@ -247,6 +247,73 @@ other x402 verifier caps the unit price alone: (`typescript/external/x402/typescript/packages/mechanisms/svm/src/exact/facilitator/scheme.ts:1246`). SOLA1-340 bounded the product in the TypeScript MPP charge only. +## x402-channel-priority-fee-product-uncapped + +**Case:** `vector/x402-upto-verify-priority-fee-over-cap-reject`, +`vector/x402-upto-verify-implicit-limit-priority-fee-over-cap-reject`, +`vector/batch-verify-top-up-priority-fee-over-cap-reject`, +`vector/batch-verify-top-up-implicit-limit-priority-fee-over-cap-reject` +**SDKs:** typescript + +The sponsor co-signs the payer-built channel `open`, `top_up` and refund +`request_close` as fee payer, so it pays whatever priority fee the payer +chose. scheme_upto_svm.md: "A sponsor MAY apply a stricter local policy for +compute-unit limit, compute-unit price, and required-signature count"; Rust +holds the fee itself (limit times price, the runtime default limit when none +is declared, or the version-1 header fee) to 2,000 lamports, the same cap +exact uses (`core::payment_channels::scan_channel_tx_layout`, RULINGS S6). +The vendored `@x402/svm` 2.26.0 `findCanonicalOpenInstruction` caps each +field alone, so a 400,000 unit limit at 5,000,000 micro-lamports (a +2,000,000 lamport fee) and a price-only prefix charged on the implicit limit +are both accepted. + +## upto-settlement-funds-recipient-ata + +**Case:** `interop/x402-upto-basic/rust/python` +**SDKs:** python + +An upto settlement co-signed by the fee payer that also creates each +distribution recipient's token account pays that account's rent, even for a +zero-amount settlement. A recipient the operator does not control can close +the account after each settlement and keep the rent. Rust creates only the +fee payer's payee account and the treasury account, and instead refuses an +open whose recipients lack a usable token account (scheme_upto_svm.md Phase 3 +settlement readiness), so a payout is never forfeited to the treasury. Python +appends `create_idempotent_associated_token_account` for every recipient +(`python/src/solana_pay_kit/protocols/x402/upto/__init__.py:446`). Fix: drop +the recipient creations and check recipient token accounts before co-signing +the open; dropping the creations alone would forfeit payouts to accounts that +do not exist. + +## batch-deposit-balance-unchecked + +**Case:** `vector/batch-verify-open-unfunded-payer-reject`, +`vector/batch-verify-top-up-unfunded-payer-reject` +**SDKs:** typescript + +scheme_batch_settlement_svm.md, canonical `open` and `top_up`: "It MUST +confirm the payer has sufficient tokens". The pay-kit gate broadcasts the +deposit only after the handler runs, so Rust reads the payer's token account +and the transaction's blockhash before it reserves the request +(`X402BatchSettlement::check_deposit_can_land`). The vendored `@x402/svm` +2.26.0 verify reads no balance; its deposit settle simulates the +transaction, which the offline harness signer stubs, so the vector cannot +observe it there. + +## upto-client-blockhash-not-checked + +**Case:** `vector/x402-upto-build-foreign-blockhash-reject` +**SDKs:** typescript + +A signed Solana transaction is bound to a cluster only by its recent +blockhash. The upto client signs a channel `open` over the offer's +`extra.recentBlockhash`, so a hint taken from another cluster yields an open +that escrows `maxAmount` there instead of on the offer's `network`. Rust signs +the hint only once its own RPC reports it live (`isBlockhashValid`); the +vendored upstream `@x402/svm` upto client uses any well-formed hint as is +(`resolveBlockhash` in the svm mechanism's shared utils). Fix: check the hint +against the client's RPC, or fetch the client's own blockhash. + ## session-open-initial-voucher-accepted **Case:** `vector/session-wire-action-open-initial-voucher-reject` diff --git a/harness/expectations/RULINGS.md b/harness/expectations/RULINGS.md index 37a347bb9..3117410bc 100644 --- a/harness/expectations/RULINGS.md +++ b/harness/expectations/RULINGS.md @@ -46,8 +46,10 @@ sentence fixes the shape of a client-paid transaction; it does not oblige a client to accept the challenge, and Client-Side Verification leaves split acceptance to the client. A client that will not fund that rent declines the challenge, which is conformant; it never builds a transaction without the -instruction. Rust's low-level builder includes the creation by default, and -`PayKitClient`, whose spend cap covers only `amount`, declines. +instruction. Rust's builders decline unless the caller opts in +(`PayerFundedAtaCreation::Include`), since the rent sits outside any amount +cap; the conformance testee opts in so the vectors can pin the client-paid +shape. ## MPP core @@ -123,7 +125,15 @@ refused as `compute-price-over-cap`. Vector: `priorityFee` is the same product, so the cap applies to it unchanged; the txv1 per-unit cap (5 lamports per unit) still holds below it, and `x402-verify-v1-priority-fee-{at,over}-cap-*` pin that boundary at a 300 unit -limit, where it binds before the total does. +limit, where it binds before the total does. The same sponsor cap covers the +payment-channel transactions an x402 sponsor co-signs (upto `open`, batch +`open`, `top_up` and refund `request_close`), whose spec ceilings (400,000 +units, 5,000,000 micro-lamports) are absolute maxima a sponsor MAY tighten; +without a declared limit the price is charged on the runtime default of +200,000 units per non-ComputeBudget instruction. Vectors: +`x402-upto-verify-{priority-fee,implicit-limit-priority-fee,v1-priority-fee-over-sponsor}-*` +and `batch-verify-top-up-{priority-fee,implicit-limit-priority-fee}-over-cap-reject`, +`batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject`. ## x402 upto on SVM diff --git a/harness/expectations/python.toml b/harness/expectations/python.toml index 80cca36aa..5ff6a40cd 100644 --- a/harness/expectations/python.toml +++ b/harness/expectations/python.toml @@ -76,6 +76,13 @@ ids = [ reason = "the x402 server adapter does not mount MPP_HARNESS_REPLAY_SOURCE_PATH, so the cheap route a cross-route payment comes from does not exist" tracking = "FINDINGS.md#x402-replay-route-missing" +[[known_failing]] +ids = [ + "interop/x402-upto-basic/rust/python", +] +reason = "upto settlement idempotently creates every distribution recipient's token account with the fee payer as funder (python/src/solana_pay_kit/protocols/x402/upto/__init__.py:446), one instruction more than the settlement shape the Rust server now sends" +tracking = "FINDINGS.md#upto-settlement-funds-recipient-ata" + # Transaction versions (SIMD-0385; mpp-specs-txv1, x402-txv1). [[unsupported]] diff --git a/harness/expectations/typescript.toml b/harness/expectations/typescript.toml index 9bd69f419..d5fc4e14c 100644 --- a/harness/expectations/typescript.toml +++ b/harness/expectations/typescript.toml @@ -136,6 +136,24 @@ ids = [ reason = "isUptoSvmPayload requires openSlot to be a string; the pinned spec types it as a number" tracking = "FINDINGS.md#upto-slot-wire-type" +[[known_failing]] +ids = [ + "vector/x402-upto-verify-priority-fee-over-cap-reject", + "vector/x402-upto-verify-implicit-limit-priority-fee-over-cap-reject", + "vector/batch-verify-top-up-priority-fee-over-cap-reject", + "vector/batch-verify-top-up-implicit-limit-priority-fee-over-cap-reject", +] +reason = "the vendored @x402/svm 2.26.0 open and top_up verifiers cap the compute-unit limit and price separately (findCanonicalOpenInstruction), so the sponsor pays up to 400000 x 5000000 micro-lamports, and a price with no declared limit is never charged against the runtime default limit" +tracking = "FINDINGS.md#x402-channel-priority-fee-product-uncapped" + +[[known_failing]] +ids = [ + "vector/batch-verify-open-unfunded-payer-reject", + "vector/batch-verify-top-up-unfunded-payer-reject", +] +reason = "the vendored @x402/svm 2.26.0 verify reads no payer balance: an unfunded deposit is caught only by the simulation its deposit settle runs, which the offline signer stubs" +tracking = "FINDINGS.md#batch-deposit-balance-unchecked" + [[known_failing]] ids = [ "vector/x402-upto-verify-open-trailing-byte-reject", @@ -161,6 +179,7 @@ ids = [ "vector/x402-upto-verify-v1-limit-over-cap-reject", "vector/x402-upto-verify-v1-priority-fee-over-cap-reject", "vector/x402-upto-verify-v1-priority-fee-at-cap-accept", + "vector/x402-upto-verify-v1-priority-fee-over-sponsor-cap-reject", "vector/x402-upto-verify-v1-missing-limit-reject", "vector/x402-upto-verify-v1-missing-loaded-limit-reject", "vector/x402-upto-verify-v1-small-loaded-limit-accept", @@ -320,6 +339,7 @@ ids = [ "vector/batch-txv1-top-up-v1-over-1232-bytes", "vector/batch-txv1-top-up-v1-priority-fee-at-cap", "vector/batch-txv1-top-up-v1-priority-fee-over-cap-reject", + "vector/batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject", "vector/batch-txv1-top-up-v1-unit-limit-over-cap-reject", ] reason = "the vendored @x402/svm 2.26.0 predates SVM transaction versions (x402-foundation/x402 PR 3473): its verifier fails on a version-1 message and does not enforce the 1232-byte version-0 limit, and its client ignores extra.transactionVersions" @@ -643,3 +663,8 @@ pattern = "vector/session-build-*" id = "vector/session-wire-action-open-initial-voucher-reject" reason = "the session open schema accepts an open payload carrying a signed voucher (typescript/packages/mpp/src/Methods.ts: the open object schema forbids `bump` but zod strips any other unknown key); draft-solana-session-00 Action open: \"MUST NOT carry an initial voucher\"" tracking = "FINDINGS.md#session-open-initial-voucher-accepted" + +[[known_failing]] +id = "vector/x402-upto-build-foreign-blockhash-reject" +reason = "the vendored upstream @x402/svm upto client signs extra.recentBlockhash without asking its RPC whether the blockhash is live on the client's cluster (resolveBlockhash in the svm mechanism's shared utils)" +tracking = "FINDINGS.md#upto-client-blockhash-not-checked" diff --git a/harness/requirements/x402.toml b/harness/requirements/x402.toml index c21a1e915..4b77b350e 100644 --- a/harness/requirements/x402.toml +++ b/harness/requirements/x402.toml @@ -586,6 +586,18 @@ doc = "specs/schemes/batch-settlement/scheme_batch_settlement_svm.md" text = "| authorization | BatchAuthorization | REQUIRED in server mode and absent in client mode." required = true +[[requirement]] +id = "X402-0ff4cabcb4" +doc = "specs/schemes/batch-settlement/scheme_batch_settlement_svm.md" +text = "It MUST confirm the payer has sufficient tokens for the deposit and the sponsor has sufficient SOL for the transaction fee plus the channel PDA and escrow ATA rent." +required = true + +[[requirement]] +id = "X402-014270dc81" +doc = "specs/schemes/batch-settlement/scheme_batch_settlement_svm.md" +text = "It MUST confirm the payer has sufficient tokens." +required = true + [[requirement]] id = "X402-4cedb5114b" doc = "specs/schemes/batch-settlement/scheme_batch_settlement_svm.md" diff --git a/harness/src/conformance/schema.ts b/harness/src/conformance/schema.ts index 35476588a..adb731640 100644 --- a/harness/src/conformance/schema.ts +++ b/harness/src/conformance/schema.ts @@ -665,13 +665,15 @@ export type VectorInput = { }; sessionServerFeePayerSecretKey?: number[]; // build-transaction (session): the client's `open` for `request` (the - // challenge's SessionRequest) with the channel `salt` its builder takes; - // `signerSecretKey` is the payer, `sessionSignerSecretKey` the voucher key - // it authorizes. `server` / `challenge` are for the judge only. An - // accepted build returns the open action as `sessionCredential`. + // challenge's SessionRequest) with the channel `salt` its builder takes + // and the `deposit` its caller authorizes; `signerSecretKey` is the payer, + // `sessionSignerSecretKey` the voucher key it authorizes. `server` / + // `challenge` are for the judge only. An accepted build returns the open + // action as `sessionCredential`. sessionOpenBuild?: { request: Record; salt: string; + deposit: string; server: Record; challenge: { id: string; recentBlockhash: string; recentSlot: string }; }; diff --git a/harness/vectors/FILL.sha256 b/harness/vectors/FILL.sha256 index 8ed9d1305..27db47d47 100644 --- a/harness/vectors/FILL.sha256 +++ b/harness/vectors/FILL.sha256 @@ -26,8 +26,9 @@ ea981eedf129540b23117a2f7e9e72916e8b93da074c345231e06e342cc2df0e annotated/batc a7659349471ab46653e0e08233655e80038fd828fcf733b065d00b9664871b22 annotated/batch-txv1-top-up-v1-missing-unit-limit-reject.txt 78c007df83fe926d4b7b52b9b9398f6d57281cb954e730e3cba8814acb6d2f3d annotated/batch-txv1-top-up-v1-not-advertised-reject.txt 22fe677b27fe02e32faaffe2822eb07ccedc2434cabbf4a45112d7f144acc2c9 annotated/batch-txv1-top-up-v1-over-1232-bytes.txt -8ee7b11777ab5c00e0e36172afdded6f68ea984bc804aa90fa563d7d915600eb annotated/batch-txv1-top-up-v1-priority-fee-at-cap.txt -bc2ac43fc7647b88381607a5b43d708251df3360d6be99a10c6a5c6d2c731b13 annotated/batch-txv1-top-up-v1-priority-fee-over-cap-reject.txt +9d58aa022a5771c09d78c97691e2cabb8cf08eb3f7c39b0c12e177bfd5973109 annotated/batch-txv1-top-up-v1-priority-fee-at-cap.txt +bc2917705fb7456d265b510dfd05e9f3d58c861238870eebf94f6f4005714071 annotated/batch-txv1-top-up-v1-priority-fee-over-cap-reject.txt +39907cb3f1674a0cdb1e2351cdadadb5692a011594328dbbfbeac752986f95ab annotated/batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject.txt a2e031a6a4276a2d28779bb931e2af3b3b3f7e22f1ae2c41184581e9ed37e843 annotated/batch-txv1-top-up-v1-unit-limit-over-cap-reject.txt ac6856f925b534e013855d6edc22b1616924bc914052fee52ca411431d39f2b5 annotated/batch-verify-accepted-amount-mismatch-reject.txt e5711029cc266f1fc00b60d5c28e4cf08c83bc4f7ed2067933c5a2d0e66d1e95 annotated/batch-verify-accepted-network-mismatch-reject.txt @@ -44,6 +45,7 @@ abbc3ff848d06872dd85b62b99d6d80efe67399fdf2767ae09092d9cd748c5d7 annotated/batc 1b8fc828c376ab16109ac5f089f396976f77e9a38f8b62a4a04bde7ee97e2c4f annotated/batch-verify-open-grace-period-mismatch-reject.txt 2affb69abe6cb174185ad102a6ef60eaac09386129b8c74d0e85af08cf2663d3 annotated/batch-verify-open-missing-binding-memo-reject.txt d8cbf524c5674d105caf1bebf2c0cb8b92b6476581b59e47ec23187ff167fcee annotated/batch-verify-open-stale-slot-reject.txt +7d5274d7e63295f3fbf9e769f60dc5f06ba6c011427ecd7f3d9bba6a6142eab1 annotated/batch-verify-open-unfunded-payer-reject.txt ec422081390113b98d4e87eda9775ded5bd03c4125da97cac15e2c62a6c1967b annotated/batch-verify-refund-compute-price-over-cap-reject.txt d4ffb0b5ec8fb59abf99416aaeb7a476d76990086b918283e4be00f36c25054a annotated/batch-verify-refund-disallowed-suffix-reject.txt 5ebbb1f5b11cd934f0ef1e290d1faa447c0217813bb66ee074e84dc8bdbe828f annotated/batch-verify-refund-extra-account-reject.txt @@ -61,7 +63,7 @@ b321f5a6904588490d96ad69087fe8de268d21210564fd07575ec8fd2bbaa2b2 annotated/batc 8005ddd0c9f70bb393934ea90a4bf9b55202121f36159eae72e0d6a7fc9e49db annotated/batch-verify-top-up-accept.txt f37f7e838c37d68edb371c4452c255ee0b19484bee43fa53d876a060d2940b3e annotated/batch-verify-top-up-amount-mismatch-reject.txt 3cdadb20446e17f1ea27f62d8edf1395fa91720fc8960abed4dd38e302d29b8e annotated/batch-verify-top-up-ata-instruction-reject.txt -4a949221a79fccea2e874552fcfa58425da7ca53668df8aa166689e035007536 annotated/batch-verify-top-up-compute-budget-prefix.txt +1ff9971b5c1fc4def2f875ac6fd8ae9a5b795ffa1d6a19e7ddeec0b8c881acdf annotated/batch-verify-top-up-compute-budget-prefix.txt cff0683f94cc314246aaa144a37eb40cc328d900ab3934feeee42a6373028afb annotated/batch-verify-top-up-compute-limit-over-cap-reject.txt 070c31a1d57a3beebcd79fa34b7bc2ce5a779a87acd932f9417475f28d11b139 annotated/batch-verify-top-up-compute-price-over-cap-reject.txt 08856502c2f4beb69aecea6eb54095c38afd75ed8230bc7cda2a48c26aaacbb2 annotated/batch-verify-top-up-duplicate-limit-reject.txt @@ -72,6 +74,7 @@ cff0683f94cc314246aaa144a37eb40cc328d900ab3934feeee42a6373028afb annotated/batc 40008adb08e644ce581a8fdf588bb2ec1781fc549505fcc96b75abb0a9b0926f annotated/batch-verify-top-up-fee-payer-not-sponsor-reject.txt 9eb513712b5f3ec86dc145ca787a7fdbfc6c4e64906eb3c814ac5b9b27f41de3 annotated/batch-verify-top-up-four-lighthouse-reject.txt ad0234c28be3a00ec169ffcac7708d4de28ca4a13a65a87b2dd3833bc745bf10 annotated/batch-verify-top-up-frozen-payer-ata-reject.txt +6181c15cd01a70578b8c9cb3ad6d8fa682108269b7867926d4ab7b01df5d271e annotated/batch-verify-top-up-implicit-limit-priority-fee-over-cap-reject.txt d2db393b2e9934b812d07767930c9435b8b775273546e8e86f2cd964eb330fe1 annotated/batch-verify-top-up-legacy-message.txt 4b0fba5e3942f08bdbcb7a54cb594bc8fe22e7e9e543864b240807eccd96b66b annotated/batch-verify-top-up-memo-mismatch-reject.txt 96f7b3553cb8906f55af973a8d4302cb7d8ab435f057edbec82f867f0ecb4a1e annotated/batch-verify-top-up-missing-memo-reject.txt @@ -79,12 +82,14 @@ a21cd90f07842230198b5e91463b5a32008388785d435a4022bc4bb564a003fe annotated/batc 162f0cfcb737e749f9be55b7cc6538c79190439be6feb8987e4a5dde12ac0766 annotated/batch-verify-top-up-missing-receiver-ata-reject.txt 3e7851a34c992e6bd903faf1ea995b90f73fc236da6e0eff0574bbcb22dce615 annotated/batch-verify-top-up-oversized-memo-reject.txt 131b94e275b189c3f85bad07f05cee779aff9534b0e8a455ed708b67cd1fe751 annotated/batch-verify-top-up-price-before-limit-reject.txt +0d432e27826d0c5a834d0ea66e0ed892d9582438f50dff46f370eda17a12d541 annotated/batch-verify-top-up-priority-fee-over-cap-reject.txt b4d04378f5767b1c5d30054184cafc929af2be344d2a3afb2f2a1603c518b13a annotated/batch-verify-top-up-second-setup-instruction-reject.txt c5ad34fc7aaa0bf8a49bd8d386fee5d0cae41b2334bdbd1bd1b382e513f810f2 annotated/batch-verify-top-up-smuggled-transfer-reject.txt 42f7fdd961a9643109a4d82ea00808bed206245b614dc7fc1a27ffe807533d26 annotated/batch-verify-top-up-three-lighthouse.txt d9e47769a4cdae29c93ee813ac9fefdde1257d93a54103986018a73d15debaa5 annotated/batch-verify-top-up-token-program-not-mint-owner-reject.txt 376fd66be9d2cbe6eeb0669080dfad4e29806c2356dbfc30e18c8e4f836a3c65 annotated/batch-verify-top-up-trailing-bytes-reject.txt 0886f848e43dea172477e103edeb934c5ad499a36b95953b1ae4bfd64f48a5de annotated/batch-verify-top-up-two-memos-reject.txt +6eef6e2e6b8ef5c5244f1b7f90ecfdc1effc93f9daeca6cdaf55ad61d635993d annotated/batch-verify-top-up-unfunded-payer-reject.txt 089fe911fc1b1f8000dad6e13d91846cdd2e73afad9e4b5cff820b21a2f23bb8 annotated/batch-verify-top-up-unsupported-compute-budget-reject.txt a7a9b6b9d0364ebcc8372a1781728f71f93c1ea76cf3f20d9f48851036907f81 annotated/batch-verify-top-up-wrong-channel-reject.txt d5f619a54d0fd07ac2e14433b892efedc3a6d4d8022e21420b813d4d0f0ec14a annotated/batch-verify-unsupported-scheme-reject.txt @@ -107,6 +112,7 @@ d54be8d24dc58c6412fab0c27ef261db61b11404be26478bbd01ea0ef3955c5c annotated/batc 531387a5967803eaf457add1a9627859af1a43378f4f9d5d315f647a51703910 annotated/batch-verify-voucher-receiver-authorizer-mismatch-reject.txt d3da7795e16892e7188afad55ce5d01d70ef2795fb5ba7fad43bd187169174ba annotated/batch-verify-voucher-receiver-authorizer-missing-reject.txt 69c0911edd4dbdc7087e50b531a4c0e1767460b8bf721e83256db18053615dbe annotated/batch-verify-voucher-receiver-not-pay-to-reject.txt +ef969b69c65b5649d51ba8f7ce515c997b14159c53bcbc5f5927aa7d3ed28f42 annotated/batch-verify-voucher-receiver-quotes-a-code-reject.txt e3ebeac648f18bfb0c7201f8ab72417b191327729b22f4013ba365daf871e054 annotated/batch-verify-voucher-server-mode-config-reject.txt 8f0736a900e01c7c1b9f3f425f6be83d8b69a7a88c3d8d743df69e590b6163b7 annotated/batch-verify-voucher-signature-over-other-amount-reject.txt 3a311d024360e6478928e28120f02b5a730ae48184f98711d529f039b8fb3c51 annotated/batch-verify-voucher-stale-reject.txt @@ -484,7 +490,7 @@ acc9a03b99aa82aad211f9a7045eeb40c27ad21606b6c40126e686e5eff7d054 annotated/x402 680284da54a60b588a697c92fc9551e2f34ccce261d3c7d2cbdeddfdf8fc0d30 annotated/x402-upto-verify-client-voucher-empty-reject.txt ea69f94e8ed85c52afe6b840cc59c2db368606f74143be441a8e1cb4aefae69e annotated/x402-upto-verify-client-voucher-reject.txt 8f4d132df707ad8af2d98b18b0ae0d2aae386be972dd9a34be61313c9b927043 annotated/x402-upto-verify-compute-after-open-reject.txt -87083847140c9610db91badecc3235f8182dcbb31cad238376b1ab3f60da6374 annotated/x402-upto-verify-compute-at-caps-accept.txt +e52a6ca2aa3c9255303643af1472f895b6fcca932c8c0749fd8258f7c0fc3ba9 annotated/x402-upto-verify-compute-at-caps-accept.txt 6432ba8692105852846dda3ab230ca0b376b11f8a93e44cd24e9fd5921799b19 annotated/x402-upto-verify-compute-duplicate-limit-reject.txt 21608dcea744525e48e2907fe7db4391c9ba41add489cd7bf7271b0f254b8349 annotated/x402-upto-verify-compute-duplicate-price-reject.txt ebf22f2bf093a9c44b4ee00b404622309d53746e5509fe7adff4cf284de885f0 annotated/x402-upto-verify-compute-limit-over-cap-reject.txt @@ -513,6 +519,8 @@ faf9819f9d408b7501f5d86e57e32c6ddaa557f9cf07dc50c33f8faeb382e7b8 annotated/x402 0a36e7e94a7eebf13e5e96552436a7632a5bb640391f7d37ee1cca8257e9aad8 annotated/x402-upto-verify-fractional-expires-at-reject.txt 871d71d91dfc67e79b1ee5925f7aaba73f276be25de61cadd9e250c20bec6076 annotated/x402-upto-verify-fractional-valid-after-reject.txt e1b89f350d2146afba565aa3b729ddf14e180c4cc3ffaaa3b64603fb22eda88e annotated/x402-upto-verify-grace-period-reject.txt +2134419d8a747670bbaf164c0b033e70089de5ac7141fc3811e06df98c1c2569 annotated/x402-upto-verify-implicit-limit-at-fee-cap-accept.txt +45e9d41c3aad45749f25859cc72af8c40ab0315956df34241165acee35059a26 annotated/x402-upto-verify-implicit-limit-priority-fee-over-cap-reject.txt 3bae8185d730c713d895ad01dc0698bcd451ec3a870c9027311384d38db1d9f5 annotated/x402-upto-verify-invalid-payer-signature-reject.txt 38eaacf3194b9f95a37d692b99c63332d34e08cc7aa01e78eee8019cc6261b73 annotated/x402-upto-verify-legacy-message-accept.txt debe92e1abbc8d2507e47917d34b7d23e8f45c8a9b9e40e160915d3aeff14831 annotated/x402-upto-verify-lighthouse-accept.txt @@ -541,6 +549,7 @@ b8d1adc29384f0ca1d605cb8ca6738c1769c9bf4caae2e89da286e0beb5b6fe5 annotated/x402 690bf4307d6c7b0736a4fd97b7489879e11be02b82a71885b9e816f8089df738 annotated/x402-upto-verify-pay-to-fee-payer-accept.txt 091c85b57f469025f65a0d17c910a6cd73f775640508969380da14a6180469bd annotated/x402-upto-verify-payee-reject.txt b9bdcfe745db3b93a2fb118630bee4c171d828dac85baf6a81cd062581fe2110 annotated/x402-upto-verify-payer-token-account-reject.txt +17514a51ebe453546e264577c94fe545eb07871214da61065d7cf803b402c5cf annotated/x402-upto-verify-priority-fee-over-cap-reject.txt 452683fafe8d84b99f526ba48e5f43889967f38d7e28a299d817ba960479dc22 annotated/x402-upto-verify-recipient-bps-reject.txt 7607efcd94618b9910b025d924826cd65e79ad10d26babc5fac1eafafb59ad40 annotated/x402-upto-verify-recipient-implicit-reject.txt 3b0f56eb8d9b1b069a0a8e74cbc43a15a3ea4b5eeebc737971d0f7b503a58ecb annotated/x402-upto-verify-recipient-reject.txt @@ -566,8 +575,9 @@ ce59ed37df74e4826d9bd6c71c09cc514163da33f85f708843d7742d363d558e annotated/x402 1917d0fe6e9e52317ae2ff05ce769ceb9e2948f629530de38984a74a42d09b88 annotated/x402-upto-verify-v1-missing-limit-reject.txt 047c59de0ca609c7ecbfadf78e99af07e73f1d97581e42feb1bd5af305ed767d annotated/x402-upto-verify-v1-missing-loaded-limit-reject.txt 4e62956ea1ce652109463a90b26d4c46a52360b3f62ba207fd382d79c68a40c5 annotated/x402-upto-verify-v1-oversize-reject.txt -2eb93676066b4ac25c8205dbb2a4d2141d0b6c3202fbf220828950f9541ee5ec annotated/x402-upto-verify-v1-priority-fee-at-cap-accept.txt -8f107c62c931deb4930b5ad85fa78f14ab540dc32d91252a5db320bbf06e60de annotated/x402-upto-verify-v1-priority-fee-over-cap-reject.txt +c6c8ef7beb8ac903a0a9ea75ebae5fc36f8bc1bca7619af8ca0fce273b4ee783 annotated/x402-upto-verify-v1-priority-fee-at-cap-accept.txt +21d1fbf22e8848a9111dfe36352d5b877f6cd4a4c84f9945a79619bf92cfae04 annotated/x402-upto-verify-v1-priority-fee-over-cap-reject.txt +8fdec90d0dac0cf754335c9e62e8f8446c0a27cc5d82cc9b0853082a75d2dd3c annotated/x402-upto-verify-v1-priority-fee-over-sponsor-cap-reject.txt 415ba369d974ef5b2b26d27e44565a8eee760b993747fd64ad818ef87be2c4c3 annotated/x402-upto-verify-v1-small-loaded-limit-accept.txt 251510e562d067008004931a6e6ee408301b3566e23155b019cbc8346ff44e62 annotated/x402-upto-verify-v1-unadvertised-before-layout-reject.txt 22844edaa25c1b45723e72efd6ef3cf096fd3ada517d7d0205e73b7e02ec274f annotated/x402-upto-verify-v1-unadvertised-reject.txt @@ -604,11 +614,11 @@ ee17ec2e291409954d77a23e40909764e62a3cd53730fd693a72ce0462212811 annotated/x402 00d714eb0b579a1bc8ee6c0f017297dad3dcdec91827a30efbd8927634021937 batch-build.json 1e0bb980d86a6dca02071160befe39f9603b73d7ddb06de06e3f32a68fb248ec batch-canonical.json 9d29189ac18e7f3219a336acb593d6a64527b9357ff60ce0be44108ed38e2598 batch-corrective.json -c8baf9606dc77393d125bba0050f4f07f79887da58ce33ed8e09a3d04f7441f9 batch-txv1.json -456f3193ec301265c7ee71571757809c802afc41a866fb4bfa8989f1203dad47 batch-verify-open.json +b906fc5e25dc7ebe454f0d24e881cae5bb06bb7fa2d0c5c0b2f9307138a484ce batch-txv1.json +b07ebc33137c3c1c6c6ae99f757e720b8e35afc964ae24547e8fc53f64b76f7c batch-verify-open.json 2c69a2d23afd0c815d5be2634154208f608c157cf1132c9675d1434a8d5d2857 batch-verify-refund.json -5a3737493aa52305b81f3305c7a097ebad45e02154dbbcd1da89e62c5869fd6e batch-verify-setup-policy.json -3428ded34c4f1cfbfe343e7e8923f4f3a396a587836729f198a7c36d32f5b1ca batch-verify-voucher.json +4d50c26ef9207a2636478fcf6355cf502fbb100c07fe540c9cc682a59bccd34a batch-verify-setup-policy.json +62a0d7e58d5b3578ee7eef92a244edcb74b841ad8a81e8dc7e7ecd07b740c222 batch-verify-voucher.json 0c6f4fae057ce68548cc4c496ecaa36cef906709abafc3463cd3de8f2543a5b5 batch-wire.json 65a3a4793b3ef918d2b6464e0aa24e8f30de634c1a8223543960224fef443bea canonical-bytes.json d751557cf0494e0b1d0cccad86bddf0f7ec0b784fe8e21ac2bf621793e1e956c charge-build-policy.json @@ -618,7 +628,7 @@ a0f8c42823b78c7ba5db0a25682ab0daa4bff03985fe3d7b64a244173d6465f3 charge-rejects e564bdca0d12e602ecb8b722f63a582b0213f7be74d01fa27e50ece2cf5fee2a charge-tx-versions.json ecd8ace669ac4739473b5b393aee34d563e9ad7d4aaa206540f731c9afff5b44 charge-verify-mutations.json 88de2d5aa3a36dee4e9a4ac1521a17e2de2025c8c5b92ac89c46013c20082187 charge-verify-policy.json -a2dae7b002989b55edd1362d326176b3d348c105bcef48be4f89b3056fe6bab5 session-build.json +ae480d2e1d4147763c9ba94fdc52b05371bfeea8ae687895ea15071831439802 session-build.json eb2da9fc8fd9190525718add58674f5a75ae1fcd418d50716dcd4fe0e43ee505 session-server-close.json 1679f69290ad24ceaeb8b2d4cde3707ed9c061c46d534ae698f4e49a70a62efd session-server-open.json dabdb7f95ed32cd6c45dc40ba9c2d1e9b6946655eb5397d107862374a95a5a81 session-server-topup.json @@ -640,9 +650,9 @@ c033a9a8ebbceabbf477b542173afc78db89a3529f8d42f8467de03a2842e689 subscription-w ce46f0ac323f508415a6dea09315596ed4fa52e38b511e2f0cf808f485d32f2a x402-build.json 812e251b273d84998507068b1b41c9710db973f05c9c38b340bb5b009f0060fc x402-extensions.json 2c75e41fa50fdbaeff061100d455866af1bd1d5393d1a8a2277608072ac99e52 x402-tx-versions.json -ac2555712b1f952bb8c59dbcc57dccd0f3fe2de480f0a98982e15a801229e695 x402-upto-build.json -104a4c96607919402d21a0b4ffdd15796132b70702a02e7436b6495f1d1700f4 x402-upto-open-policy.json -ac8b5c84c914b88af97e7327e9221edd8ebe99e9280680a34c4ee5b18534211c x402-upto-txv1.json +6ada287c38a26eb633fdaedf9b5c5b6d52c1cb9777cf23d9e7b65a6db8cdcb10 x402-upto-build.json +53f6cdf619c05aa0b10b1bbf74c36251be48ce4ff166a3fb84bc1e2a59da9e66 x402-upto-open-policy.json +226edd935ccd71e8fa835fc5d6d04b46736b3414c110158f99f397e8594b58ad x402-upto-txv1.json ed579f6183f66be54f127aaec7beb5ba19f6a22222b0dbeeb18479f901f67d43 x402-upto-verify.json 7c2c19185d91c9a2d7b8d55ef4342cbcf49dc7e2918d5daa5b0357c624ad2ab1 x402-upto-wire.json a0b94e993a0766fe74aa500254c63672ddeab94aad6ec4b1ed136bb7ccd26be8 x402-v1-build.json diff --git a/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-at-cap.txt b/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-at-cap.txt index cf422c1d8..80c803343 100644 --- a/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-at-cap.txt +++ b/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-at-cap.txt @@ -35,7 +35,7 @@ payment header (base64 JSON) }, "deposit": { "amount": "6000", - "transaction": "gQIABA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIJ/RckOFqgx1tk+3jNYC+h2ZH96/drE8WO1wLqyDXp9hjqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLBLpNiunJD3KvxKSvUdldArM8IOOcMbn/NGbf2SxXiMea4T+VAWZkKbqIwjcZYhVrZWKZR4UVyYj9/rTk9uwE+z4qYJbWO8tXMd0MeH5xi0Nf6UmH4u3+Idtnx6JoNkrIAVKU1qZKSEGTSTocWDaOHx8NbXdvJK7geQfqEBBBUSNBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk7RCyzkSFX8TqTPQE0KC0DK1/+zQGi2/G3eQYI3wAup6eh+6TrKwkJk/fS39YrieK4cgd6Y5/X10eo6Z9j1BWuQEIPAAAAAABADQMAAAAABAgGCQAFAAoAAQQDAgcGA3AXAAAAAAAAaW52b2ljZS00MgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA08/hj5yslYv9++MmG85bG/9bajC8CQQ5a0VH4w0SPJuWnmEVOWIlHtx0P5nHMYw/ZXBbZJsB2hIVi0qIe3q0I" + "transaction": "gQIABA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIJ/RckOFqgx1tk+3jNYC+h2ZH96/drE8WO1wLqyDXp9hjqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLBLpNiunJD3KvxKSvUdldArM8IOOcMbn/NGbf2SxXiMea4T+VAWZkKbqIwjcZYhVrZWKZR4UVyYj9/rTk9uwE+z4qYJbWO8tXMd0MeH5xi0Nf6UmH4u3+Idtnx6JoNkrIAVKU1qZKSEGTSTocWDaOHx8NbXdvJK7geQfqEBBBUSNBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk7RCyzkSFX8TqTPQE0KC0DK1/+zQGi2/G3eQYI3wAup6eh+6TrKwkJk/fS39YrieK4cgd6Y5/X10eo6Z9j1BWu3AUAAAAAAAAsAQAAAAAABAgGCQAFAAoAAQQDAgcGA3AXAAAAAAAAaW52b2ljZS00MgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA82oAfUP6t8tQlVyWAQKaZa/+ExOJ7uWa2fDzLUXUtLKrJXiz6qNxlytIsH8bOT9WGKv6rcb86QRerxLCEXF4D" }, "transaction": "", "type": "deposit", diff --git a/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-cap-reject.txt b/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-cap-reject.txt index 00e759080..fed22fa8f 100644 --- a/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-cap-reject.txt +++ b/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-cap-reject.txt @@ -35,7 +35,7 @@ payment header (base64 JSON) }, "deposit": { "amount": "6000", - "transaction": "gQIABA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIJ/RckOFqgx1tk+3jNYC+h2ZH96/drE8WO1wLqyDXp9hjqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLBLpNiunJD3KvxKSvUdldArM8IOOcMbn/NGbf2SxXiMea4T+VAWZkKbqIwjcZYhVrZWKZR4UVyYj9/rTk9uwE+z4qYJbWO8tXMd0MeH5xi0Nf6UmH4u3+Idtnx6JoNkrIAVKU1qZKSEGTSTocWDaOHx8NbXdvJK7geQfqEBBBUSNBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk7RCyzkSFX8TqTPQE0KC0DK1/+zQGi2/G3eQYI3wAup6eh+6TrKwkJk/fS39YrieK4cgd6Y5/X10eo6Z9j1BWuQUIPAAAAAABADQMAAAAABAgGCQAFAAoAAQQDAgcGA3AXAAAAAAAAaW52b2ljZS00MgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJPodhRikhY4LEBl93zGhjHE3jkh2fxgINYJyU+pniirom8dXt+006KiPGnSJN+poq0auB/BrscPHGowcKCkoD" + "transaction": "gQIABA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIJ/RckOFqgx1tk+3jNYC+h2ZH96/drE8WO1wLqyDXp9hjqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLBLpNiunJD3KvxKSvUdldArM8IOOcMbn/NGbf2SxXiMea4T+VAWZkKbqIwjcZYhVrZWKZR4UVyYj9/rTk9uwE+z4qYJbWO8tXMd0MeH5xi0Nf6UmH4u3+Idtnx6JoNkrIAVKU1qZKSEGTSTocWDaOHx8NbXdvJK7geQfqEBBBUSNBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk7RCyzkSFX8TqTPQE0KC0DK1/+zQGi2/G3eQYI3wAup6eh+6TrKwkJk/fS39YrieK4cgd6Y5/X10eo6Z9j1BWu3QUAAAAAAAAsAQAAAAAABAgGCQAFAAoAAQQDAgcGA3AXAAAAAAAAaW52b2ljZS00MgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACd1hCEv9V1EQ9cFuqef/0QJq5Wm03Xc6SDEcDNbTgZ4QiG/QVmbr0F92MJlbhhdd1Fd3vuRjQmJp3w+0kANcIP" }, "transaction": "", "type": "deposit", diff --git a/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject.txt b/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject.txt new file mode 100644 index 000000000..7ede7f8a7 --- /dev/null +++ b/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject.txt @@ -0,0 +1,51 @@ +# batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject (x402-batch-settlement verify-transaction, expect reject) +# generated by pkc fill; do not edit + +payment header (base64 JSON) +{ + "accepted": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "memo": "invoice-42", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "transactionVersions": [ + 0, + 1 + ], + "withdrawDelay": 3600 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "batch-settlement" + }, + "payload": { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "42", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "deposit": { + "amount": "6000", + "transaction": "gQIABA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIJ/RckOFqgx1tk+3jNYC+h2ZH96/drE8WO1wLqyDXp9hjqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLBLpNiunJD3KvxKSvUdldArM8IOOcMbn/NGbf2SxXiMea4T+VAWZkKbqIwjcZYhVrZWKZR4UVyYj9/rTk9uwE+z4qYJbWO8tXMd0MeH5xi0Nf6UmH4u3+Idtnx6JoNkrIAVKU1qZKSEGTSTocWDaOHx8NbXdvJK7geQfqEBBBUSNBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk7RCyzkSFX8TqTPQE0KC0DK1/+zQGi2/G3eQYI3wAup6eh+6TrKwkJk/fS39YrieK4cgd6Y5/X10eo6Z9j1BWu0QcAAAAAAABADQMAAAAABAgGCQAFAAoAAQQDAgcGA3AXAAAAAAAAaW52b2ljZS00MgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJvfC0vQK4xloC9ljQm24MGCITeWYtZ8CnrnMqf7nkg39pmvJoOZPwJntL58jAHvZS14eBH4tDT05I2lMYXNwD" + }, + "transaction": "", + "type": "deposit", + "voucher": { + "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ", + "expiresAt": 0, + "maxClaimableAmount": "4000", + "signature": "3WYNjcmhd4sXonxQPrBqrFbsVt9JogFStoASpj4o1LTnLxi9He4b4e8tHjsuCtMCWBPktoRfzGXxHSfJ9uYgaXDR" + } + }, + "x402Version": 2 +} + diff --git a/harness/vectors/annotated/batch-verify-open-unfunded-payer-reject.txt b/harness/vectors/annotated/batch-verify-open-unfunded-payer-reject.txt new file mode 100644 index 000000000..8a86b8b5a --- /dev/null +++ b/harness/vectors/annotated/batch-verify-open-unfunded-payer-reject.txt @@ -0,0 +1,47 @@ +# batch-verify-open-unfunded-payer-reject (x402-batch-settlement verify-transaction, expect reject) +# generated by pkc fill; do not edit + +payment header (base64 JSON) +{ + "accepted": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "memo": "invoice-42", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "withdrawDelay": 3600 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "batch-settlement" + }, + "payload": { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "42", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "deposit": { + "amount": "10000", + "transaction": "AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABX7uj8xzwiqVsetaSzL7qB9S4DGswA0XQDzg002r06bFlLS9iSIpfJ0xXK6gDKPm/qMir2e2iiHId0ZnerMlwGgAIACA39FyQ4WqDHW2T7eM1gL6HZkf3r92sTxY7XAurINen2GOpKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIsEuk2K6ckPcq/EpK9R2V0Cszwg45wxuf80Zt/ZLFeIx5rhP5UBZmQpuojCNxliFWtlYplHhRXJiP3+tOT27AT7PipgltY7y1cx3Qx4fnGLQ1/pSYfi7f4h22fHomg2SsgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFSlNamSkhBk0k6HFg2jh8fDW13bySu4HkH6hAQQVEjQan1RcZLFxRIYzJTD1K8X9Y2u4Im6H9ROPb2YoAAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk7RCyzkSFX8TqTPQE0KC0DK1/+zQGi2/G3eQYI3wAup1pUDXtrHisrtRdSGcmj8GAQkkHKjE8XDMHKLUju6vnQjJclj04kifG7PRApFI4NgwtaE5na/xCEBI572Nvp+Fmnofuk6ysJCZP30t/WK4niuHIHemOf19dHqOmfY9QVrgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwwOAQAACQEEAwIIBQcLCgxDASoAAAAAAAAAECcAAAAAAAAQDgAAQD9TFAAAAAABAAAAq04rMx5LTzoVQrrg+VXdXTMDScdOoccKkgXsBlUJIjMQJwYACmludm9pY2UtNDIGAFF4NDAyOmJhdGNoLXNldHRsZW1lbnQ6c3ZtOnJjdmF1dGg6djE6QW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MA" + }, + "transaction": "", + "type": "deposit", + "voucher": { + "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "5kSviFQ8hjmQpK8sRmgHD6FxbELADzWzf6MqCG8ubWHatG4SXYV1brk9bQJQtXe8qBtfZbPZzmCHbkt7eJmEddBB" + } + }, + "x402Version": 2 +} + diff --git a/harness/vectors/annotated/batch-verify-top-up-compute-budget-prefix.txt b/harness/vectors/annotated/batch-verify-top-up-compute-budget-prefix.txt index 0f8f4d102..2daf49013 100644 --- a/harness/vectors/annotated/batch-verify-top-up-compute-budget-prefix.txt +++ b/harness/vectors/annotated/batch-verify-top-up-compute-budget-prefix.txt @@ -31,7 +31,7 @@ payment header (base64 JSON) }, "deposit": { "amount": "6000", - "transaction": "AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABElladfJFcf0y7dkj4Ke8PIxZ2rvq+TvYxGDhA1fiQYjOLMCQ2YMgrnzlJrwUEM4dvo65sJCRiAGg9hzUlsP4OgAIABQr9FyQ4WqDHW2T7eM1gL6HZkf3r92sTxY7XAurINen2GOpKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIsEuk2K6ckPcq/EpK9R2V0Cszwg45wxuf80Zt/ZLFeIx5rhP5UBZmQpuojCNxliFWtlYplHhRXJiP3+tOT27AT7PipgltY7y1cx3Qx4fnGLQ1/pSYfi7f4h22fHomg2SsgAwZGb+UhFzL/7K26csOb57yM5bvF9xJrLEObOkAAAAAFSlNamSkhBk0k6HFg2jh8fDW13bySu4HkH6hAQQVEjQbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpO0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqenofuk6ysJCZP30t/WK4niuHIHemOf19dHqOmfY9QVrgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAUABQKAGgYABQAJA0BLTAAAAAAACQYBBAMCCAcJA3AXAAAAAAAABgAKaW52b2ljZS00MgA=" + "transaction": "AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAbMsz3/1r/vuBj7FPVQc74hT+YXULuWaa819aAiELB6b3fCD+CiqbpDkkEXzGSk/0Tx7q89zuqYNCqxSN3R4NgAIABQr9FyQ4WqDHW2T7eM1gL6HZkf3r92sTxY7XAurINen2GOpKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIsEuk2K6ckPcq/EpK9R2V0Cszwg45wxuf80Zt/ZLFeIx5rhP5UBZmQpuojCNxliFWtlYplHhRXJiP3+tOT27AT7PipgltY7y1cx3Qx4fnGLQ1/pSYfi7f4h22fHomg2SsgAwZGb+UhFzL/7K26csOb57yM5bvF9xJrLEObOkAAAAAFSlNamSkhBk0k6HFg2jh8fDW13bySu4HkH6hAQQVEjQbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpO0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqenofuk6ysJCZP30t/WK4niuHIHemOf19dHqOmfY9QVrgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAUABQKAGgYABQAJA4gTAAAAAAAACQYBBAMCCAcJA3AXAAAAAAAABgAKaW52b2ljZS00MgA=" }, "transaction": "", "type": "deposit", diff --git a/harness/vectors/annotated/batch-verify-top-up-implicit-limit-priority-fee-over-cap-reject.txt b/harness/vectors/annotated/batch-verify-top-up-implicit-limit-priority-fee-over-cap-reject.txt new file mode 100644 index 000000000..419297ff2 --- /dev/null +++ b/harness/vectors/annotated/batch-verify-top-up-implicit-limit-priority-fee-over-cap-reject.txt @@ -0,0 +1,47 @@ +# batch-verify-top-up-implicit-limit-priority-fee-over-cap-reject (x402-batch-settlement verify-transaction, expect reject) +# generated by pkc fill; do not edit + +payment header (base64 JSON) +{ + "accepted": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "memo": "invoice-42", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "withdrawDelay": 3600 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "batch-settlement" + }, + "payload": { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "42", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "deposit": { + "amount": "6000", + "transaction": "AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgorU7XPirvNxB8h1YsYOLc5STSKljTU0asU5SiLIz52k3HdUX4omACLgYBZULeReyTCyu4BrjJqX7PhgYddAMgAIABQr9FyQ4WqDHW2T7eM1gL6HZkf3r92sTxY7XAurINen2GOpKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIsEuk2K6ckPcq/EpK9R2V0Cszwg45wxuf80Zt/ZLFeIx5rhP5UBZmQpuojCNxliFWtlYplHhRXJiP3+tOT27AT7PipgltY7y1cx3Qx4fnGLQ1/pSYfi7f4h22fHomg2SsgAwZGb+UhFzL/7K26csOb57yM5bvF9xJrLEObOkAAAAAFSlNamSkhBk0k6HFg2jh8fDW13bySu4HkH6hAQQVEjQbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpO0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqenofuk6ysJCZP30t/WK4niuHIHemOf19dHqOmfY9QVrgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwUACQOJEwAAAAAAAAkGAQQDAggHCQNwFwAAAAAAAAYACmludm9pY2UtNDIA" + }, + "transaction": "", + "type": "deposit", + "voucher": { + "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ", + "expiresAt": 0, + "maxClaimableAmount": "4000", + "signature": "3WYNjcmhd4sXonxQPrBqrFbsVt9JogFStoASpj4o1LTnLxi9He4b4e8tHjsuCtMCWBPktoRfzGXxHSfJ9uYgaXDR" + } + }, + "x402Version": 2 +} + diff --git a/harness/vectors/annotated/batch-verify-top-up-priority-fee-over-cap-reject.txt b/harness/vectors/annotated/batch-verify-top-up-priority-fee-over-cap-reject.txt new file mode 100644 index 000000000..08e1976b3 --- /dev/null +++ b/harness/vectors/annotated/batch-verify-top-up-priority-fee-over-cap-reject.txt @@ -0,0 +1,47 @@ +# batch-verify-top-up-priority-fee-over-cap-reject (x402-batch-settlement verify-transaction, expect reject) +# generated by pkc fill; do not edit + +payment header (base64 JSON) +{ + "accepted": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "memo": "invoice-42", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "withdrawDelay": 3600 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "batch-settlement" + }, + "payload": { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "42", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "deposit": { + "amount": "6000", + "transaction": "AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABElladfJFcf0y7dkj4Ke8PIxZ2rvq+TvYxGDhA1fiQYjOLMCQ2YMgrnzlJrwUEM4dvo65sJCRiAGg9hzUlsP4OgAIABQr9FyQ4WqDHW2T7eM1gL6HZkf3r92sTxY7XAurINen2GOpKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIsEuk2K6ckPcq/EpK9R2V0Cszwg45wxuf80Zt/ZLFeIx5rhP5UBZmQpuojCNxliFWtlYplHhRXJiP3+tOT27AT7PipgltY7y1cx3Qx4fnGLQ1/pSYfi7f4h22fHomg2SsgAwZGb+UhFzL/7K26csOb57yM5bvF9xJrLEObOkAAAAAFSlNamSkhBk0k6HFg2jh8fDW13bySu4HkH6hAQQVEjQbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpO0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqenofuk6ysJCZP30t/WK4niuHIHemOf19dHqOmfY9QVrgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAUABQKAGgYABQAJA0BLTAAAAAAACQYBBAMCCAcJA3AXAAAAAAAABgAKaW52b2ljZS00MgA=" + }, + "transaction": "", + "type": "deposit", + "voucher": { + "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ", + "expiresAt": 0, + "maxClaimableAmount": "4000", + "signature": "3WYNjcmhd4sXonxQPrBqrFbsVt9JogFStoASpj4o1LTnLxi9He4b4e8tHjsuCtMCWBPktoRfzGXxHSfJ9uYgaXDR" + } + }, + "x402Version": 2 +} + diff --git a/harness/vectors/annotated/batch-verify-top-up-unfunded-payer-reject.txt b/harness/vectors/annotated/batch-verify-top-up-unfunded-payer-reject.txt new file mode 100644 index 000000000..a21608fd3 --- /dev/null +++ b/harness/vectors/annotated/batch-verify-top-up-unfunded-payer-reject.txt @@ -0,0 +1,47 @@ +# batch-verify-top-up-unfunded-payer-reject (x402-batch-settlement verify-transaction, expect reject) +# generated by pkc fill; do not edit + +payment header (base64 JSON) +{ + "accepted": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "memo": "invoice-42", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "withdrawDelay": 3600 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "batch-settlement" + }, + "payload": { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "42", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "deposit": { + "amount": "6000", + "transaction": "AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJz9Ahi2a6U4iQkrx8eX+yDiVVCWrVckrjwV6cgWKcxKFcHE5Xa4nguvtAqR0eHaiFw1IctI/VP6u/lVZw5oQJgAIABAn9FyQ4WqDHW2T7eM1gL6HZkf3r92sTxY7XAurINen2GOpKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIsEuk2K6ckPcq/EpK9R2V0Cszwg45wxuf80Zt/ZLFeIx5rhP5UBZmQpuojCNxliFWtlYplHhRXJiP3+tOT27AT7PipgltY7y1cx3Qx4fnGLQ1/pSYfi7f4h22fHomg2SsgBUpTWpkpIQZNJOhxYNo4fHw1td28kruB5B+oQEEFRI0G3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8AqTtELLORIVfxOpM9ATQoLQMrX/7NAaLb8bd5BgjfAC6np6H7pOsrCQmT99Lf1iuJ4rhyB3pjn9fXR6jpn2PUFa4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIIBgEEAwIHBgkDcBcAAAAAAAAFAAppbnZvaWNlLTQyAA==" + }, + "transaction": "", + "type": "deposit", + "voucher": { + "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ", + "expiresAt": 0, + "maxClaimableAmount": "4000", + "signature": "3WYNjcmhd4sXonxQPrBqrFbsVt9JogFStoASpj4o1LTnLxi9He4b4e8tHjsuCtMCWBPktoRfzGXxHSfJ9uYgaXDR" + } + }, + "x402Version": 2 +} + diff --git a/harness/vectors/annotated/batch-verify-voucher-receiver-quotes-a-code-reject.txt b/harness/vectors/annotated/batch-verify-voucher-receiver-quotes-a-code-reject.txt new file mode 100644 index 000000000..7a3112fce --- /dev/null +++ b/harness/vectors/annotated/batch-verify-voucher-receiver-quotes-a-code-reject.txt @@ -0,0 +1,43 @@ +# batch-verify-voucher-receiver-quotes-a-code-reject (x402-batch-settlement verify-transaction, expect reject) +# generated by pkc fill; do not edit + +payment header (base64 JSON) +{ + "accepted": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "memo": "invoice-42", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "withdrawDelay": 3600 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "batch-settlement" + }, + "payload": { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "invalid_batch_settlement_svm_cumulative_amount_mismatch", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "42", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "transaction": "", + "type": "voucher", + "voucher": { + "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ", + "expiresAt": 0, + "maxClaimableAmount": "4000", + "signature": "3WYNjcmhd4sXonxQPrBqrFbsVt9JogFStoASpj4o1LTnLxi9He4b4e8tHjsuCtMCWBPktoRfzGXxHSfJ9uYgaXDR" + } + }, + "x402Version": 2 +} + diff --git a/harness/vectors/annotated/x402-upto-verify-compute-at-caps-accept.txt b/harness/vectors/annotated/x402-upto-verify-compute-at-caps-accept.txt index d93f29fd0..331d59a8d 100644 --- a/harness/vectors/annotated/x402-upto-verify-compute-at-caps-accept.txt +++ b/harness/vectors/annotated/x402-upto-verify-compute-at-caps-accept.txt @@ -28,7 +28,7 @@ payment header (base64 JSON) "maxAmount": "1000000", "nonce": "4242", "openSlot": "400000000", - "openTransaction": "AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA8aFtZH/8/GTrEAE7HZY6o5Bhc6SqvljLoTqFsmWU38NB5L90TUISKmixWQiEbVLfJ29Dr1ZWBsib5R1GICAOgAIACg9mvn4zLHpFMzK9nQp/fbBV9cXvGgatpm2Ys5+2gQxHOupKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIsIcHVkVxDmWkYi7SL3G64epdKZq5xNIBuQz2VKR6IvR5rhP5UBZmQpuojCNxliFWtlYplHhRXJiP3+tOT27AT7Ns19x+fca37bm5o4/hk4XDuY/8OxynLcXoyuea1jnvzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBkZv5SEXMv/srbpyw5vnvIzlu8X3EmssQ5s6QAAAAAVKU1qZKSEGTSTocWDaOHx8NbXdvJK7geQfqEBBBUSNBqfVFxksXFEhjMlMPUrxf1ja7gibof1E49vZigAAAAAG3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8AqTtELLORIVfxOpM9ATQoLQMrX/7NAaLb8bd5BgjfAC6nWlQNe2seKyu1F1IZyaPwYBCSQcqMTxcMwcotSO7q+dCMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WZGiigt0OBWTpNlGlXkgiSavyK2CyIObdkQ1m566mks6p6H7pOsrCQmT99Lf1iuJ4rhyB3pjn9fXR6jpn2PUFa4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQGAAUCgBoGAAYACQNAS0wAAAAAAA4OAQAACg0CAwQJBQgMCw5DAZIQAAAAAAAAQEIPAAAAAACEAwAAAITXFwAAAAABAAAAq04rMx5LTzoVQrrg+VXdXTMDScdOoccKkgXsBlUJIjMQJwcAIDVmM2M5YTFlN2IyZDRjNmU4ZjBhMWIyYzNkNGU1ZjYwAA==", + "openTransaction": "AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACywg/GXJuDjiBZQOi79RqEM0aHYTe4s1Ycno6eeZXSA+xJf/P0IPxzIyfAcQ+VLCDRO7EWar/MyTd4/IpzyQsLgAIACg9mvn4zLHpFMzK9nQp/fbBV9cXvGgatpm2Ys5+2gQxHOupKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIsIcHVkVxDmWkYi7SL3G64epdKZq5xNIBuQz2VKR6IvR5rhP5UBZmQpuojCNxliFWtlYplHhRXJiP3+tOT27AT7Ns19x+fca37bm5o4/hk4XDuY/8OxynLcXoyuea1jnvzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBkZv5SEXMv/srbpyw5vnvIzlu8X3EmssQ5s6QAAAAAVKU1qZKSEGTSTocWDaOHx8NbXdvJK7geQfqEBBBUSNBqfVFxksXFEhjMlMPUrxf1ja7gibof1E49vZigAAAAAG3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8AqTtELLORIVfxOpM9ATQoLQMrX/7NAaLb8bd5BgjfAC6nWlQNe2seKyu1F1IZyaPwYBCSQcqMTxcMwcotSO7q+dCMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WZGiigt0OBWTpNlGlXkgiSavyK2CyIObdkQ1m566mks6p6H7pOsrCQmT99Lf1iuJ4rhyB3pjn9fXR6jpn2PUFa4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQGAAUCgBoGAAYACQOIEwAAAAAAAA4OAQAACg0CAwQJBQgMCw5DAZIQAAAAAAAAQEIPAAAAAACEAwAAAITXFwAAAAABAAAAq04rMx5LTzoVQrrg+VXdXTMDScdOoccKkgXsBlUJIjMQJwcAIDVmM2M5YTFlN2IyZDRjNmU4ZjBhMWIyYzNkNGU1ZjYwAA==", "transaction": "", "validAfter": 1800000000 }, diff --git a/harness/vectors/annotated/x402-upto-verify-implicit-limit-at-fee-cap-accept.txt b/harness/vectors/annotated/x402-upto-verify-implicit-limit-at-fee-cap-accept.txt new file mode 100644 index 000000000..841b54f17 --- /dev/null +++ b/harness/vectors/annotated/x402-upto-verify-implicit-limit-at-fee-cap-accept.txt @@ -0,0 +1,37 @@ +# x402-upto-verify-implicit-limit-at-fee-cap-accept (x402-upto verify-transaction, expect accept) +# generated by pkc fill; do not edit + +payment header (base64 JSON) +{ + "accepted": { + "amount": "1000000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "recentBlockhash": "11111111111111111111111111111111", + "recentSlot": "400000000", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "withdrawDelay": 900 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "upto" + }, + "payload": { + "authorizedSigner": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "channelId": "3GmtA7TCp1rZ5fCYmw6iG2HqBBXmLMDNGCaXgSUabBb3", + "deposit": "1000000", + "expiresAt": 1800000300, + "from": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "maxAmount": "1000000", + "nonce": "4242", + "openSlot": "400000000", + "openTransaction": "AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBx2swntLzZZ5R7tu8g5pGf7jhj2inm27ckk6KWijUzr5478CQv5wMP+p+bZReVflIARtwQujJsHqg5GogF7IHgAIACg9mvn4zLHpFMzK9nQp/fbBV9cXvGgatpm2Ys5+2gQxHOupKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIsIcHVkVxDmWkYi7SL3G64epdKZq5xNIBuQz2VKR6IvR5rhP5UBZmQpuojCNxliFWtlYplHhRXJiP3+tOT27AT7Ns19x+fca37bm5o4/hk4XDuY/8OxynLcXoyuea1jnvzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBkZv5SEXMv/srbpyw5vnvIzlu8X3EmssQ5s6QAAAAAVKU1qZKSEGTSTocWDaOHx8NbXdvJK7geQfqEBBBUSNBqfVFxksXFEhjMlMPUrxf1ja7gibof1E49vZigAAAAAG3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8AqTtELLORIVfxOpM9ATQoLQMrX/7NAaLb8bd5BgjfAC6nWlQNe2seKyu1F1IZyaPwYBCSQcqMTxcMwcotSO7q+dCMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WZGiigt0OBWTpNlGlXkgiSavyK2CyIObdkQ1m566mks6p6H7pOsrCQmT99Lf1iuJ4rhyB3pjn9fXR6jpn2PUFa4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMGAAkDiBMAAAAAAAAODgEAAAoNAgMECQUIDAsOQwGSEAAAAAAAAEBCDwAAAAAAhAMAAACE1xcAAAAAAQAAAKtOKzMeS086FUK64PlV3V0zA0nHTqHHCpIF7AZVCSIzECcHACA1ZjNjOWExZTdiMmQ0YzZlOGYwYTFiMmMzZDRlNWY2MAA=", + "transaction": "", + "validAfter": 1800000000 + }, + "x402Version": 2 +} + diff --git a/harness/vectors/annotated/x402-upto-verify-implicit-limit-priority-fee-over-cap-reject.txt b/harness/vectors/annotated/x402-upto-verify-implicit-limit-priority-fee-over-cap-reject.txt new file mode 100644 index 000000000..3e6959b40 --- /dev/null +++ b/harness/vectors/annotated/x402-upto-verify-implicit-limit-priority-fee-over-cap-reject.txt @@ -0,0 +1,37 @@ +# x402-upto-verify-implicit-limit-priority-fee-over-cap-reject (x402-upto verify-transaction, expect reject) +# generated by pkc fill; do not edit + +payment header (base64 JSON) +{ + "accepted": { + "amount": "1000000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "recentBlockhash": "11111111111111111111111111111111", + "recentSlot": "400000000", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "withdrawDelay": 900 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "upto" + }, + "payload": { + "authorizedSigner": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "channelId": "3GmtA7TCp1rZ5fCYmw6iG2HqBBXmLMDNGCaXgSUabBb3", + "deposit": "1000000", + "expiresAt": 1800000300, + "from": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "maxAmount": "1000000", + "nonce": "4242", + "openSlot": "400000000", + "openTransaction": "AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50+YxqTBkvXn4HvkxD/jhPKuh3P70vwYRyzGKpB+b3Q+zgfDDD8qYbyqLGP/Hb9obHuNBggUMQ0br2OeT+sAgAIACg9mvn4zLHpFMzK9nQp/fbBV9cXvGgatpm2Ys5+2gQxHOupKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIsIcHVkVxDmWkYi7SL3G64epdKZq5xNIBuQz2VKR6IvR5rhP5UBZmQpuojCNxliFWtlYplHhRXJiP3+tOT27AT7Ns19x+fca37bm5o4/hk4XDuY/8OxynLcXoyuea1jnvzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBkZv5SEXMv/srbpyw5vnvIzlu8X3EmssQ5s6QAAAAAVKU1qZKSEGTSTocWDaOHx8NbXdvJK7geQfqEBBBUSNBqfVFxksXFEhjMlMPUrxf1ja7gibof1E49vZigAAAAAG3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8AqTtELLORIVfxOpM9ATQoLQMrX/7NAaLb8bd5BgjfAC6nWlQNe2seKyu1F1IZyaPwYBCSQcqMTxcMwcotSO7q+dCMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WZGiigt0OBWTpNlGlXkgiSavyK2CyIObdkQ1m566mks6p6H7pOsrCQmT99Lf1iuJ4rhyB3pjn9fXR6jpn2PUFa4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMGAAkDiRMAAAAAAAAODgEAAAoNAgMECQUIDAsOQwGSEAAAAAAAAEBCDwAAAAAAhAMAAACE1xcAAAAAAQAAAKtOKzMeS086FUK64PlV3V0zA0nHTqHHCpIF7AZVCSIzECcHACA1ZjNjOWExZTdiMmQ0YzZlOGYwYTFiMmMzZDRlNWY2MAA=", + "transaction": "", + "validAfter": 1800000000 + }, + "x402Version": 2 +} + diff --git a/harness/vectors/annotated/x402-upto-verify-priority-fee-over-cap-reject.txt b/harness/vectors/annotated/x402-upto-verify-priority-fee-over-cap-reject.txt new file mode 100644 index 000000000..83017629c --- /dev/null +++ b/harness/vectors/annotated/x402-upto-verify-priority-fee-over-cap-reject.txt @@ -0,0 +1,37 @@ +# x402-upto-verify-priority-fee-over-cap-reject (x402-upto verify-transaction, expect reject) +# generated by pkc fill; do not edit + +payment header (base64 JSON) +{ + "accepted": { + "amount": "1000000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "recentBlockhash": "11111111111111111111111111111111", + "recentSlot": "400000000", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "withdrawDelay": 900 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "upto" + }, + "payload": { + "authorizedSigner": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "channelId": "3GmtA7TCp1rZ5fCYmw6iG2HqBBXmLMDNGCaXgSUabBb3", + "deposit": "1000000", + "expiresAt": 1800000300, + "from": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "maxAmount": "1000000", + "nonce": "4242", + "openSlot": "400000000", + "openTransaction": "AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA8aFtZH/8/GTrEAE7HZY6o5Bhc6SqvljLoTqFsmWU38NB5L90TUISKmixWQiEbVLfJ29Dr1ZWBsib5R1GICAOgAIACg9mvn4zLHpFMzK9nQp/fbBV9cXvGgatpm2Ys5+2gQxHOupKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIsIcHVkVxDmWkYi7SL3G64epdKZq5xNIBuQz2VKR6IvR5rhP5UBZmQpuojCNxliFWtlYplHhRXJiP3+tOT27AT7Ns19x+fca37bm5o4/hk4XDuY/8OxynLcXoyuea1jnvzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBkZv5SEXMv/srbpyw5vnvIzlu8X3EmssQ5s6QAAAAAVKU1qZKSEGTSTocWDaOHx8NbXdvJK7geQfqEBBBUSNBqfVFxksXFEhjMlMPUrxf1ja7gibof1E49vZigAAAAAG3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8AqTtELLORIVfxOpM9ATQoLQMrX/7NAaLb8bd5BgjfAC6nWlQNe2seKyu1F1IZyaPwYBCSQcqMTxcMwcotSO7q+dCMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WZGiigt0OBWTpNlGlXkgiSavyK2CyIObdkQ1m566mks6p6H7pOsrCQmT99Lf1iuJ4rhyB3pjn9fXR6jpn2PUFa4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQGAAUCgBoGAAYACQNAS0wAAAAAAA4OAQAACg0CAwQJBQgMCw5DAZIQAAAAAAAAQEIPAAAAAACEAwAAAITXFwAAAAABAAAAq04rMx5LTzoVQrrg+VXdXTMDScdOoccKkgXsBlUJIjMQJwcAIDVmM2M5YTFlN2IyZDRjNmU4ZjBhMWIyYzNkNGU1ZjYwAA==", + "transaction": "", + "validAfter": 1800000000 + }, + "x402Version": 2 +} + diff --git a/harness/vectors/annotated/x402-upto-verify-v1-priority-fee-at-cap-accept.txt b/harness/vectors/annotated/x402-upto-verify-v1-priority-fee-at-cap-accept.txt index 09008c292..133c97f05 100644 --- a/harness/vectors/annotated/x402-upto-verify-v1-priority-fee-at-cap-accept.txt +++ b/harness/vectors/annotated/x402-upto-verify-v1-priority-fee-at-cap-accept.txt @@ -32,7 +32,7 @@ payment header (base64 JSON) "maxAmount": "1000000", "nonce": "4242", "openSlot": "400000000", - "openTransaction": "gQIACQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIOZr5+Myx6RTMyvZ0Kf32wVfXF7xoGraZtmLOftoEMRzrqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLCHB1ZFcQ5lpGIu0i9xuuHqXSmaucTSAbkM9lSkeiL0ea4T+VAWZkKbqIwjcZYhVrZWKZR4UVyYj9/rTk9uwE+zbNfcfn3Gt+25uaOP4ZOFw7mP/Dscpy3F6MrnmtY578wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUpTWpkpIQZNJOhxYNo4fHw1td28kruB5B+oQEEFRI0Gp9UXGSxcUSGMyUw9SvF/WNruCJuh/UTj29mKAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpO0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqdaVA17ax4rK7UXUhnJo/BgEJJByoxPFwzByi1I7ur50IyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZkaKKC3Q4FZOk2UaVeSCJJq/IrYLIg5t2RDWbnrqaSzqnofuk6ysJCZP30t/WK4niuHIHemOf19dHqOmfY9QVrkBCDwAAAAAAQA0DAAAAAAQNDkMABgAgAAEAAAkMAgMECAUHCwoNAZIQAAAAAAAAQEIPAAAAAACEAwAAAITXFwAAAAABAAAAq04rMx5LTzoVQrrg+VXdXTMDScdOoccKkgXsBlUJIjMQJzVmM2M5YTFlN2IyZDRjNmU4ZjBhMWIyYzNkNGU1ZjYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKxbFcquLlJSPVc1Icd7kGT05+gw0P3fXLN6LUfvBpmy5agI/Xx/TFTXiQBC7ayPH5duD18Hhr1cG5otj/rC4wM=", + "openTransaction": "gQIACQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIOZr5+Myx6RTMyvZ0Kf32wVfXF7xoGraZtmLOftoEMRzrqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLCHB1ZFcQ5lpGIu0i9xuuHqXSmaucTSAbkM9lSkeiL0ea4T+VAWZkKbqIwjcZYhVrZWKZR4UVyYj9/rTk9uwE+zbNfcfn3Gt+25uaOP4ZOFw7mP/Dscpy3F6MrnmtY578wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUpTWpkpIQZNJOhxYNo4fHw1td28kruB5B+oQEEFRI0Gp9UXGSxcUSGMyUw9SvF/WNruCJuh/UTj29mKAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpO0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqdaVA17ax4rK7UXUhnJo/BgEJJByoxPFwzByi1I7ur50IyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZkaKKC3Q4FZOk2UaVeSCJJq/IrYLIg5t2RDWbnrqaSzqnofuk6ysJCZP30t/WK4niuHIHemOf19dHqOmfY9QVrtwFAAAAAAAALAEAAAAAAAQNDkMABgAgAAEAAAkMAgMECAUHCwoNAZIQAAAAAAAAQEIPAAAAAACEAwAAAITXFwAAAAABAAAAq04rMx5LTzoVQrrg+VXdXTMDScdOoccKkgXsBlUJIjMQJzVmM2M5YTFlN2IyZDRjNmU4ZjBhMWIyYzNkNGU1ZjYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAObQX37o1MiA/E7tDgsr3vgzRs35MTC1rnNKHTSM7VQk8WMq9u/csHCWzG4VSwD6AjUpyvsvBI5gDisTFL+7cgo=", "transaction": "", "validAfter": 1800000000 }, diff --git a/harness/vectors/annotated/x402-upto-verify-v1-priority-fee-over-cap-reject.txt b/harness/vectors/annotated/x402-upto-verify-v1-priority-fee-over-cap-reject.txt index 0fb733e35..3d2d73efe 100644 --- a/harness/vectors/annotated/x402-upto-verify-v1-priority-fee-over-cap-reject.txt +++ b/harness/vectors/annotated/x402-upto-verify-v1-priority-fee-over-cap-reject.txt @@ -32,7 +32,7 @@ payment header (base64 JSON) "maxAmount": "1000000", "nonce": "4242", "openSlot": "400000000", - "openTransaction": "gQIACQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIOZr5+Myx6RTMyvZ0Kf32wVfXF7xoGraZtmLOftoEMRzrqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLCHB1ZFcQ5lpGIu0i9xuuHqXSmaucTSAbkM9lSkeiL0ea4T+VAWZkKbqIwjcZYhVrZWKZR4UVyYj9/rTk9uwE+zbNfcfn3Gt+25uaOP4ZOFw7mP/Dscpy3F6MrnmtY578wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUpTWpkpIQZNJOhxYNo4fHw1td28kruB5B+oQEEFRI0Gp9UXGSxcUSGMyUw9SvF/WNruCJuh/UTj29mKAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpO0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqdaVA17ax4rK7UXUhnJo/BgEJJByoxPFwzByi1I7ur50IyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZkaKKC3Q4FZOk2UaVeSCJJq/IrYLIg5t2RDWbnrqaSzqnofuk6ysJCZP30t/WK4niuHIHemOf19dHqOmfY9QVrkFCDwAAAAAAQA0DAAAAAAQNDkMABgAgAAEAAAkMAgMECAUHCwoNAZIQAAAAAAAAQEIPAAAAAACEAwAAAITXFwAAAAABAAAAq04rMx5LTzoVQrrg+VXdXTMDScdOoccKkgXsBlUJIjMQJzVmM2M5YTFlN2IyZDRjNmU4ZjBhMWIyYzNkNGU1ZjYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4T042JdKDph5oUbZzBcT7TB5p4YV8MPodWKFKZBNg7oVTAqK9fXSC67kPjRyWfV8E8WVIrXSDySc2FyFc0zQ0=", + "openTransaction": "gQIACQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIOZr5+Myx6RTMyvZ0Kf32wVfXF7xoGraZtmLOftoEMRzrqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLCHB1ZFcQ5lpGIu0i9xuuHqXSmaucTSAbkM9lSkeiL0ea4T+VAWZkKbqIwjcZYhVrZWKZR4UVyYj9/rTk9uwE+zbNfcfn3Gt+25uaOP4ZOFw7mP/Dscpy3F6MrnmtY578wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUpTWpkpIQZNJOhxYNo4fHw1td28kruB5B+oQEEFRI0Gp9UXGSxcUSGMyUw9SvF/WNruCJuh/UTj29mKAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpO0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqdaVA17ax4rK7UXUhnJo/BgEJJByoxPFwzByi1I7ur50IyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZkaKKC3Q4FZOk2UaVeSCJJq/IrYLIg5t2RDWbnrqaSzqnofuk6ysJCZP30t/WK4niuHIHemOf19dHqOmfY9QVrt0FAAAAAAAALAEAAAAAAAQNDkMABgAgAAEAAAkMAgMECAUHCwoNAZIQAAAAAAAAQEIPAAAAAACEAwAAAITXFwAAAAABAAAAq04rMx5LTzoVQrrg+VXdXTMDScdOoccKkgXsBlUJIjMQJzVmM2M5YTFlN2IyZDRjNmU4ZjBhMWIyYzNkNGU1ZjYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALgDvtuSIfbm2Dsu9fH7Mi1+IWvOPqg5TKAGkST93eFae5Ifyw9WGFmzByDUEP0sixxIbgB+A3In7xYTOTmFKQg=", "transaction": "", "validAfter": 1800000000 }, diff --git a/harness/vectors/annotated/x402-upto-verify-v1-priority-fee-over-sponsor-cap-reject.txt b/harness/vectors/annotated/x402-upto-verify-v1-priority-fee-over-sponsor-cap-reject.txt new file mode 100644 index 000000000..b94539d87 --- /dev/null +++ b/harness/vectors/annotated/x402-upto-verify-v1-priority-fee-over-sponsor-cap-reject.txt @@ -0,0 +1,41 @@ +# x402-upto-verify-v1-priority-fee-over-sponsor-cap-reject (x402-upto verify-transaction, expect reject) +# generated by pkc fill; do not edit + +payment header (base64 JSON) +{ + "accepted": { + "amount": "1000000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "recentBlockhash": "11111111111111111111111111111111", + "recentSlot": "400000000", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "transactionVersions": [ + 0, + 1 + ], + "withdrawDelay": 900 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "upto" + }, + "payload": { + "authorizedSigner": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "channelId": "3GmtA7TCp1rZ5fCYmw6iG2HqBBXmLMDNGCaXgSUabBb3", + "deposit": "1000000", + "expiresAt": 1800000300, + "from": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "maxAmount": "1000000", + "nonce": "4242", + "openSlot": "400000000", + "openTransaction": "gQIACQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIOZr5+Myx6RTMyvZ0Kf32wVfXF7xoGraZtmLOftoEMRzrqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLCHB1ZFcQ5lpGIu0i9xuuHqXSmaucTSAbkM9lSkeiL0ea4T+VAWZkKbqIwjcZYhVrZWKZR4UVyYj9/rTk9uwE+zbNfcfn3Gt+25uaOP4ZOFw7mP/Dscpy3F6MrnmtY578wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUpTWpkpIQZNJOhxYNo4fHw1td28kruB5B+oQEEFRI0Gp9UXGSxcUSGMyUw9SvF/WNruCJuh/UTj29mKAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpO0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqdaVA17ax4rK7UXUhnJo/BgEJJByoxPFwzByi1I7ur50IyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZkaKKC3Q4FZOk2UaVeSCJJq/IrYLIg5t2RDWbnrqaSzqnofuk6ysJCZP30t/WK4niuHIHemOf19dHqOmfY9QVrtEHAAAAAAAAQA0DAAAAAAQNDkMABgAgAAEAAAkMAgMECAUHCwoNAZIQAAAAAAAAQEIPAAAAAACEAwAAAITXFwAAAAABAAAAq04rMx5LTzoVQrrg+VXdXTMDScdOoccKkgXsBlUJIjMQJzVmM2M5YTFlN2IyZDRjNmU4ZjBhMWIyYzNkNGU1ZjYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHKufUr9Ma1oJHW5883mWdR3w25d48uzUPeXPwsWhMTu2PO6sN34lqYPIdZRfaspcDo+hAxne3zaIFUaAgGY9A8=", + "transaction": "", + "validAfter": 1800000000 + }, + "x402Version": 2 +} + diff --git a/harness/vectors/batch-txv1.json b/harness/vectors/batch-txv1.json index 427a9354a..f7a49e12b 100644 --- a/harness/vectors/batch-txv1.json +++ b/harness/vectors/batch-txv1.json @@ -1324,7 +1324,7 @@ }, { "bugType": "auth-bypass", - "description": "priorityFee 1000001 lamports at computeUnitLimit 200000: 1000001 × 10^6 > 5000000 × 200000 (one lamport over the cap).", + "description": "priorityFee 1501 lamports at computeUnitLimit 300: 1501 × 10^6 > 5000000 × 300 (one lamport over the cap), and still under the sponsor's 2000 lamport cap on the total fee, so only the per-unit rule rejects it.", "expect": { "outcome": "reject", "rejectCode": "setup-transaction" @@ -1472,7 +1472,7 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3VRVUlQQUFBQUFBQkFEUU1BQUFBQUJBZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSlBvZGhSaWtoWTRMRUJsOTN6R2hqSEUzamtoMmZ4Z0lOWUp5VStwbmlpcm9tOGRYdCswMDZLaVBHblNKTitwb3EwYXVCL0Jyc2NQSEdvd2NLQ2tvRCJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3UzUVVBQUFBQUFBQXNBUUFBQUFBQUJBZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDZDFoQ0V2OVYxRVE5Y0Z1cWVmLzBRSnE1V20wM1hjNlNERWNETmJUZ1o0UWlHL1FWbWJyMEY5Mk1KbGJoaGRkMUZkM3Z1UmpRbUpwM3crMGtBTmNJUCJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", @@ -1490,7 +1490,7 @@ }, { "bugType": "auth-bypass", - "description": "Paired accept: priorityFee 1000000 lamports at computeUnitLimit 200000 is exactly the cap.", + "description": "Paired accept: priorityFee 1500 lamports at computeUnitLimit 300 is exactly the per-unit cap, and under the sponsor's 2000 lamport cap on the total fee (RULINGS S6).", "expect": { "outcome": "accept" }, @@ -1637,7 +1637,173 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3VRRUlQQUFBQUFBQkFEUU1BQUFBQUJBZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBMDgvaGo1eXNsWXY5KytNbUc4NWJHLzliYWpDOENRUTVhMFZINHcwU1BKdVdubUVWT1dJbEh0eDBQNW5ITVl3L1pYQmJaSnNCMmhJVmkwcUllM3EwSSJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3UzQVVBQUFBQUFBQXNBUUFBQUFBQUJBZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBODJvQWZVUDZ0OHRRbFZ5V0FRS2FaYS8rRXhPSjd1V2EyZkR6TFVYVXRMS3JKWGl6NnFOeGx5dElzSDhiT1Q5V0dLdjZyY2I4NlFSZXJ4TENFWEY0RCJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" + }, + "intent": "x402-batch-settlement", + "mode": "verify-transaction", + "provenance": "generated", + "requirements": [ + "X402TX-0f874a9c63" + ], + "role": "server", + "spec": { + "doc": "x402-txv1/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", + "quote": "`priorityFee * 1000000 <= 5000000 * computeUnitLimit`", + "section": "Top-level instruction layout" + }, + "tier": "offline" + }, + { + "bugType": "auth-bypass", + "description": "priorityFee 2001 lamports at computeUnitLimit 200000: far under the per-unit cap, but one lamport over the cap the sponsor puts on the total fee it pays (RULINGS S6).", + "expect": { + "outcome": "reject", + "rejectCode": "setup-transaction" + }, + "id": "batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject", + "input": { + "batchRequirements": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "memo": "invoice-42", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "transactionVersions": [ + 0, + 1 + ], + "withdrawDelay": 3600 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "batch-settlement" + }, + "batchServer": { + "cluster": "devnet", + "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "decimals": 6, + "feePayerSecretKey": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 253, + 23, + 36, + 56, + 90, + 160, + 199, + 91, + 100, + 251, + 120, + 205, + 96, + 47, + 161, + 217, + 145, + 253, + 235, + 247, + 107, + 19, + 197, + 142, + 215, + 2, + 234, + 200, + 53, + 233, + 246, + 24 + ], + "maxTimeoutSeconds": 300, + "memo": "invoice-42", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "price": "0.001", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "transactionVersions": [ + 0, + 1 + ], + "withdrawDelay": 3600 + }, + "batchServerChannel": { + "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ", + "chargedCumulativeAmount": "3000", + "deposit": "4000", + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "settled": "0" + }, + "rpcFixtures": { + "accounts": { + "8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqfqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLADKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "BSMX9adNvtMHhBSbiuDeaPZZbF82cmPJkSHyptJSHecz": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqc7S0pMPs1+WdY0rmfl3rvsCtBvIE3wE6aVozdqV7mNBQDKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ": { + "data": "AQH/ACoAAAAAAAAAoA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAOAABKHxlNESMyCQEQHZINFOcuqsCHfS894FMmEGgZV1RQmepKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIs/RckOFqgx1tk+3jNYC+h2ZH96/drE8WO1wLqyDXp9hjqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLDtELLORIVfxOpM9ATQoLQMrX/7NAaLb8bd5BgjfAC6n/RckOFqgx1tk+3jNYC+h2ZH96/drE8WO1wLqyDXp9hhAP1MUAAAAAA==", + "owner": "CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX" + }, + "PjeTAeWHZHjrBForCEJvMVmRJpW5dngPaRzCp8w1MM4": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqerTiszHktPOhVCuuD5Vd1dMwNJx06hxwqSBewGVQkiMwDKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "f5xag9qZ5qmEkt2MDrBQZENh9QV1orw3UyrqAg5wTc3": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqf9FyQ4WqDHW2T7eM1gL6HZkf3r92sTxY7XAurINen2GADKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "11111111111111111111111111111111", + "slot": 341000100 + }, + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3UwUWNBQUFBQUFBQkFEUU1BQUFBQUJBZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnZmQzB2UUs0eGxvQzlsalFtMjRNR0NJVGVXWXRaOENucm5NcWY3bmtnMzlwbXZKb09aUHdKbnRMNThqQUh2WlMxNGVCSDR0RFQwNUkybE1ZWE53RCJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", diff --git a/harness/vectors/batch-verify-open.json b/harness/vectors/batch-verify-open.json index 9c434efad..90ea3bfe0 100644 --- a/harness/vectors/batch-verify-open.json +++ b/harness/vectors/batch-verify-open.json @@ -145,6 +145,151 @@ }, "tier": "offline" }, + { + "bugType": "settlement", + "description": "The accept open, but the payer's token account holds 1 base unit against the 10000 deposit. The deposit is broadcast only after the handler runs, so a verifier that skips the balance serves the request and only then finds the open cannot land. Pair: batch-verify-open-accept.", + "expect": { + "outcome": "reject", + "rejectCode": "settlement-simulation" + }, + "id": "batch-verify-open-unfunded-payer-reject", + "input": { + "batchRequirements": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "memo": "invoice-42", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "withdrawDelay": 3600 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "batch-settlement" + }, + "batchServer": { + "cluster": "devnet", + "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "decimals": 6, + "feePayerSecretKey": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 253, + 23, + 36, + 56, + 90, + 160, + 199, + 91, + 100, + 251, + 120, + 205, + 96, + 47, + 161, + 217, + 145, + 253, + 235, + 247, + 107, + 19, + 197, + 142, + 215, + 2, + 234, + 200, + 53, + 233, + 246, + 24 + ], + "maxTimeoutSeconds": 300, + "memo": "invoice-42", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "price": "0.001", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "withdrawDelay": 3600 + }, + "rpcFixtures": { + "accounts": { + "8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqfqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "BSMX9adNvtMHhBSbiuDeaPZZbF82cmPJkSHyptJSHecz": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqc7S0pMPs1+WdY0rmfl3rvsCtBvIE3wE6aVozdqV7mNBQDKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "PjeTAeWHZHjrBForCEJvMVmRJpW5dngPaRzCp8w1MM4": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqerTiszHktPOhVCuuD5Vd1dMwNJx06hxwqSBewGVQkiMwDKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "f5xag9qZ5qmEkt2MDrBQZENh9QV1orw3UyrqAg5wTc3": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqf9FyQ4WqDHW2T7eM1gL6HZkf3r92sTxY7XAurINen2GADKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "11111111111111111111111111111111", + "slot": 341000100 + }, + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJtYXhUaW1lb3V0U2Vjb25kcyI6MzAwLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwicGF5VG8iOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInNjaGVtZSI6ImJhdGNoLXNldHRsZW1lbnQifSwicGF5bG9hZCI6eyJjaGFubmVsQ29uZmlnIjp7Im9wZW5TbG90IjozNDEwMDAwMDAsInBheWVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJwYXllckF1dGhvcml6ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInJlY2VpdmVyIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInNhbHQiOiI0MiIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiZGVwb3NpdCI6eyJhbW91bnQiOiIxMDAwMCIsInRyYW5zYWN0aW9uIjoiQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCWDd1ajh4endpcVZzZXRhU3pMN3FCOVM0REdzd0EwWFFEemcwMDJyMDZiRmxMUzlpU0lwZkoweFhLNmdES1BtL3FNaXIyZTJpaUhJZDBabmVyTWx3R2dBSUFDQTM5RnlRNFdxREhXMlQ3ZU0xZ0w2SFprZjNyOTJzVHhZN1hBdXJJTmVuMkdPcEtiR1BpbkZJS3Z2VlFleE11eGZtVlIzYXV2cjU3a2tJZTZta1VSdElzRXVrMks2Y2tQY3EvRXBLOVIyVjBDc3p3ZzQ1d3h1ZjgwWnQvWkxGZUl4NXJoUDVVQlptUXB1b2pDTnhsaUZXdGxZcGxIaFJYSmlQMyt0T1QyN0FUN1BpcGdsdFk3eTFjeDNReDRmbkdMUTEvcFNZZmk3ZjRoMjJmSG9tZzJTc2dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRlNsTmFtU2toQmswazZIRmcyamg4ZkRXMTNieVN1NEhrSDZoQVFRVkVqUWFuMVJjWkxGeFJJWXpKVEQxSzhYOVkydTRJbTZIOVJPUGIyWW9BQUFBQUJ0MzI0ZGRsb1pQWnkrRkd6dXQ1ckJ5MGhlMWZXemVST296MWhYNy9BS2s3UkN5emtTRlg4VHFUUFFFMEtDMERLMS8relFHaTIvRzNlUVlJM3dBdXAxcFVEWHRySGlzcnRSZFNHY21qOEdBUWtrSEtqRThYRE1IS0xVanU2dm5RakpjbGowNGtpZkc3UFJBcEZJNE5nd3RhRTVuYS94Q0VCSTU3Mk52cCtGbW5vZnVrNnlzSkNaUDMwdC9XSzRuaXVISUhlbU9mMTlkSHFPbWZZOVFWcmdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBd3dPQVFBQUNRRUVBd0lJQlFjTENneERBU29BQUFBQUFBQUFFQ2NBQUFBQUFBQVFEZ0FBUUQ5VEZBQUFBQUFCQUFBQXEwNHJNeDVMVHpvVlFycmcrVlhkWFRNRFNjZE9vY2NLa2dYc0JsVUpJak1RSndZQUNtbHVkbTlwWTJVdE5ESUdBRkY0TkRBeU9tSmhkR05vTFhObGRIUnNaVzFsYm5RNmMzWnRPbkpqZG1GMWRHZzZkakU2UVc5V2MwZGhhamhOVTBvMmVIZExlR1pHZUc4NWFWcFhTRE5sYmtNNFVsSlVXRXRJTW1aNE1rWTRiM01BIn0sInR5cGUiOiJkZXBvc2l0Iiwidm91Y2hlciI6eyJjaGFubmVsSWQiOiJIamcyUERnTHhZRGlRV1JIckplZVk5VjlpTnllYk05TVd1dG9BNjdlaXZzWiIsImV4cGlyZXNBdCI6MCwibWF4Q2xhaW1hYmxlQW1vdW50IjoiMTAwMCIsInNpZ25hdHVyZSI6IjVrU3ZpRlE4aGptUXBLOHNSbWdIRDZGeGJFTEFEeld6ZjZNcUNHOHViV0hhdEc0U1hZVjFicms5YlFKUXRYZThxQnRmWmJQWnptQ0hia3Q3ZUptRWRkQkIifX0sIng0MDJWZXJzaW9uIjoyfQ==" + }, + "intent": "x402-batch-settlement", + "mode": "verify-transaction", + "provenance": "generated", + "requirements": [ + "X402-0ff4cabcb4" + ], + "role": "server", + "spec": { + "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", + "quote": "It MUST confirm the payer has sufficient tokens for the deposit and the sponsor has sufficient SOL for the transaction fee plus the channel PDA and escrow ATA rent.", + "section": "Canonical open" + }, + "tier": "offline" + }, { "bugType": "auth-bypass", "description": "The open carries only the seller memo: without the binding memo the channel is bound to no receiver authorizer.", diff --git a/harness/vectors/batch-verify-setup-policy.json b/harness/vectors/batch-verify-setup-policy.json index 6912d5837..f65af56d0 100644 --- a/harness/vectors/batch-verify-setup-policy.json +++ b/harness/vectors/batch-verify-setup-policy.json @@ -160,7 +160,7 @@ }, { "bugType": "auth-bypass", - "description": "Paired accept: SetComputeUnitLimit 400000 then SetComputeUnitPrice 5000000 (both at the cap) before the top_up.", + "description": "Paired accept: SetComputeUnitLimit 400000 (at the cap) then SetComputeUnitPrice 5000 before the top_up, a 2000 lamport priority fee: exactly the sponsor's cap on the fee it pays (RULINGS S6).", "expect": { "outcome": "accept" }, @@ -299,7 +299,7 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJtYXhUaW1lb3V0U2Vjb25kcyI6MzAwLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwicGF5VG8iOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInNjaGVtZSI6ImJhdGNoLXNldHRsZW1lbnQifSwicGF5bG9hZCI6eyJjaGFubmVsQ29uZmlnIjp7Im9wZW5TbG90IjozNDEwMDAwMDAsInBheWVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJwYXllckF1dGhvcml6ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInJlY2VpdmVyIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInNhbHQiOiI0MiIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiZGVwb3NpdCI6eyJhbW91bnQiOiI2MDAwIiwidHJhbnNhY3Rpb24iOiJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJFbGxhZGZKRmNmMHk3ZGtqNEtlOFBJeFoycnZxK1R2WXhHRGhBMWZpUVlqT0xNQ1EyWU1ncm56bEpyd1VFTTRkdm82NXNKQ1JpQUdnOWh6VWxzUDRPZ0FJQUJRcjlGeVE0V3FESFcyVDdlTTFnTDZIWmtmM3I5MnNUeFk3WEF1cklOZW4yR09wS2JHUGluRklLdnZWUWV4TXV4Zm1WUjNhdXZyNTdra0llNm1rVVJ0SXNFdWsySzZja1BjcS9FcEs5UjJWMENzendnNDV3eHVmODBadC9aTEZlSXg1cmhQNVVCWm1RcHVvakNOeGxpRld0bFlwbEhoUlhKaVAzK3RPVDI3QVQ3UGlwZ2x0WTd5MWN4M1F4NGZuR0xRMS9wU1lmaTdmNGgyMmZIb21nMlNzZ0F3WkdiK1VoRnpMLzdLMjZjc09iNTd5TTVidkY5eEpyTEVPYk9rQUFBQUFGU2xOYW1Ta2hCazBrNkhGZzJqaDhmRFcxM2J5U3U0SGtINmhBUVFWRWpRYmQ5dUhYWmFHVDJjdmhSczdyZWF3Y3RJWHRYMXMza1RxTTlZVisvd0NwTzBRc3M1RWhWL0U2a3owQk5DZ3RBeXRmL3MwQm90dnh0M2tHQ044QUxxZW5vZnVrNnlzSkNaUDMwdC9XSzRuaXVISUhlbU9mMTlkSHFPbWZZOVFWcmdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQVVBQlFLQUdnWUFCUUFKQTBCTFRBQUFBQUFBQ1FZQkJBTUNDQWNKQTNBWEFBQUFBQUFBQmdBS2FXNTJiMmxqWlMwME1nQT0ifSwidHlwZSI6ImRlcG9zaXQiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkhqZzJQRGdMeFlEaVFXUkhySmVlWTlWOWlOeWViTTlNV3V0b0E2N2VpdnNaIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiI0MDAwIiwic2lnbmF0dXJlIjoiM1dZTmpjbWhkNHNYb254UVByQnFyRmJzVnQ5Sm9nRlN0b0FTcGo0bzFMVG5MeGk5SGU0YjRlOHRIanN1Q3RNQ1dCUGt0b1JmekdYeEhTZko5dVlnYVhEUiJ9fSwieDQwMlZlcnNpb24iOjJ9" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJtYXhUaW1lb3V0U2Vjb25kcyI6MzAwLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwicGF5VG8iOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInNjaGVtZSI6ImJhdGNoLXNldHRsZW1lbnQifSwicGF5bG9hZCI6eyJjaGFubmVsQ29uZmlnIjp7Im9wZW5TbG90IjozNDEwMDAwMDAsInBheWVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJwYXllckF1dGhvcml6ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInJlY2VpdmVyIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInNhbHQiOiI0MiIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiZGVwb3NpdCI6eyJhbW91bnQiOiI2MDAwIiwidHJhbnNhY3Rpb24iOiJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBYk1zejMvMXIvdnVCajdGUFZRYzc0aFQrWVhVTHVXYWE4MTlhQWlFTEI2YjNmQ0QrQ2lxYnBEa2tFWHpHU2svMFR4N3E4OXp1cVlOQ3F4U04zUjROZ0FJQUJRcjlGeVE0V3FESFcyVDdlTTFnTDZIWmtmM3I5MnNUeFk3WEF1cklOZW4yR09wS2JHUGluRklLdnZWUWV4TXV4Zm1WUjNhdXZyNTdra0llNm1rVVJ0SXNFdWsySzZja1BjcS9FcEs5UjJWMENzendnNDV3eHVmODBadC9aTEZlSXg1cmhQNVVCWm1RcHVvakNOeGxpRld0bFlwbEhoUlhKaVAzK3RPVDI3QVQ3UGlwZ2x0WTd5MWN4M1F4NGZuR0xRMS9wU1lmaTdmNGgyMmZIb21nMlNzZ0F3WkdiK1VoRnpMLzdLMjZjc09iNTd5TTVidkY5eEpyTEVPYk9rQUFBQUFGU2xOYW1Ta2hCazBrNkhGZzJqaDhmRFcxM2J5U3U0SGtINmhBUVFWRWpRYmQ5dUhYWmFHVDJjdmhSczdyZWF3Y3RJWHRYMXMza1RxTTlZVisvd0NwTzBRc3M1RWhWL0U2a3owQk5DZ3RBeXRmL3MwQm90dnh0M2tHQ044QUxxZW5vZnVrNnlzSkNaUDMwdC9XSzRuaXVISUhlbU9mMTlkSHFPbWZZOVFWcmdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQVVBQlFLQUdnWUFCUUFKQTRnVEFBQUFBQUFBQ1FZQkJBTUNDQWNKQTNBWEFBQUFBQUFBQmdBS2FXNTJiMmxqWlMwME1nQT0ifSwidHlwZSI6ImRlcG9zaXQiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkhqZzJQRGdMeFlEaVFXUkhySmVlWTlWOWlOeWViTTlNV3V0b0E2N2VpdnNaIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiI0MDAwIiwic2lnbmF0dXJlIjoiM1dZTmpjbWhkNHNYb254UVByQnFyRmJzVnQ5Sm9nRlN0b0FTcGo0bzFMVG5MeGk5SGU0YjRlOHRIanN1Q3RNQ1dCUGt0b1JmekdYeEhTZko5dVlnYVhEUiJ9fSwieDQwMlZlcnNpb24iOjJ9" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", @@ -318,6 +318,323 @@ }, "tier": "offline" }, + { + "bugType": "auth-bypass", + "description": "SetComputeUnitLimit 400000 and SetComputeUnitPrice 5000000, each at its own cap: the sponsor would pay a 2000000 lamport priority fee, so it bounds the fee as limit times price (RULINGS S6). Pair: batch-verify-top-up-compute-budget-prefix.", + "expect": { + "outcome": "reject", + "rejectCode": "setup-transaction" + }, + "id": "batch-verify-top-up-priority-fee-over-cap-reject", + "input": { + "batchRequirements": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "memo": "invoice-42", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "withdrawDelay": 3600 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "batch-settlement" + }, + "batchServer": { + "cluster": "devnet", + "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "decimals": 6, + "feePayerSecretKey": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 253, + 23, + 36, + 56, + 90, + 160, + 199, + 91, + 100, + 251, + 120, + 205, + 96, + 47, + 161, + 217, + 145, + 253, + 235, + 247, + 107, + 19, + 197, + 142, + 215, + 2, + 234, + 200, + 53, + 233, + 246, + 24 + ], + "maxTimeoutSeconds": 300, + "memo": "invoice-42", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "price": "0.001", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "withdrawDelay": 3600 + }, + "batchServerChannel": { + "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ", + "chargedCumulativeAmount": "3000", + "deposit": "4000", + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "settled": "0" + }, + "rpcFixtures": { + "accounts": { + "8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqfqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLADKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "BSMX9adNvtMHhBSbiuDeaPZZbF82cmPJkSHyptJSHecz": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqc7S0pMPs1+WdY0rmfl3rvsCtBvIE3wE6aVozdqV7mNBQDKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ": { + "data": "AQH/ACoAAAAAAAAAoA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAOAABKHxlNESMyCQEQHZINFOcuqsCHfS894FMmEGgZV1RQmepKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIs/RckOFqgx1tk+3jNYC+h2ZH96/drE8WO1wLqyDXp9hjqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLDtELLORIVfxOpM9ATQoLQMrX/7NAaLb8bd5BgjfAC6n/RckOFqgx1tk+3jNYC+h2ZH96/drE8WO1wLqyDXp9hhAP1MUAAAAAA==", + "owner": "CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX" + }, + "PjeTAeWHZHjrBForCEJvMVmRJpW5dngPaRzCp8w1MM4": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqerTiszHktPOhVCuuD5Vd1dMwNJx06hxwqSBewGVQkiMwDKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "f5xag9qZ5qmEkt2MDrBQZENh9QV1orw3UyrqAg5wTc3": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqf9FyQ4WqDHW2T7eM1gL6HZkf3r92sTxY7XAurINen2GADKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "11111111111111111111111111111111", + "slot": 341000100 + }, + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJtYXhUaW1lb3V0U2Vjb25kcyI6MzAwLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwicGF5VG8iOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInNjaGVtZSI6ImJhdGNoLXNldHRsZW1lbnQifSwicGF5bG9hZCI6eyJjaGFubmVsQ29uZmlnIjp7Im9wZW5TbG90IjozNDEwMDAwMDAsInBheWVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJwYXllckF1dGhvcml6ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInJlY2VpdmVyIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInNhbHQiOiI0MiIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiZGVwb3NpdCI6eyJhbW91bnQiOiI2MDAwIiwidHJhbnNhY3Rpb24iOiJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJFbGxhZGZKRmNmMHk3ZGtqNEtlOFBJeFoycnZxK1R2WXhHRGhBMWZpUVlqT0xNQ1EyWU1ncm56bEpyd1VFTTRkdm82NXNKQ1JpQUdnOWh6VWxzUDRPZ0FJQUJRcjlGeVE0V3FESFcyVDdlTTFnTDZIWmtmM3I5MnNUeFk3WEF1cklOZW4yR09wS2JHUGluRklLdnZWUWV4TXV4Zm1WUjNhdXZyNTdra0llNm1rVVJ0SXNFdWsySzZja1BjcS9FcEs5UjJWMENzendnNDV3eHVmODBadC9aTEZlSXg1cmhQNVVCWm1RcHVvakNOeGxpRld0bFlwbEhoUlhKaVAzK3RPVDI3QVQ3UGlwZ2x0WTd5MWN4M1F4NGZuR0xRMS9wU1lmaTdmNGgyMmZIb21nMlNzZ0F3WkdiK1VoRnpMLzdLMjZjc09iNTd5TTVidkY5eEpyTEVPYk9rQUFBQUFGU2xOYW1Ta2hCazBrNkhGZzJqaDhmRFcxM2J5U3U0SGtINmhBUVFWRWpRYmQ5dUhYWmFHVDJjdmhSczdyZWF3Y3RJWHRYMXMza1RxTTlZVisvd0NwTzBRc3M1RWhWL0U2a3owQk5DZ3RBeXRmL3MwQm90dnh0M2tHQ044QUxxZW5vZnVrNnlzSkNaUDMwdC9XSzRuaXVISUhlbU9mMTlkSHFPbWZZOVFWcmdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQVVBQlFLQUdnWUFCUUFKQTBCTFRBQUFBQUFBQ1FZQkJBTUNDQWNKQTNBWEFBQUFBQUFBQmdBS2FXNTJiMmxqWlMwME1nQT0ifSwidHlwZSI6ImRlcG9zaXQiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkhqZzJQRGdMeFlEaVFXUkhySmVlWTlWOWlOeWViTTlNV3V0b0E2N2VpdnNaIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiI0MDAwIiwic2lnbmF0dXJlIjoiM1dZTmpjbWhkNHNYb254UVByQnFyRmJzVnQ5Sm9nRlN0b0FTcGo0bzFMVG5MeGk5SGU0YjRlOHRIanN1Q3RNQ1dCUGt0b1JmekdYeEhTZko5dVlnYVhEUiJ9fSwieDQwMlZlcnNpb24iOjJ9" + }, + "intent": "x402-batch-settlement", + "mode": "verify-transaction", + "provenance": "generated", + "requirements": [ + "X402-b4167aad45", + "X402-a93234f1d7" + ], + "role": "server", + "spec": { + "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", + "quote": "A sponsor MAY apply stricter local compute-unit, priority-fee, or required-signature caps, but MUST NOT relax the absolute maxima above.", + "section": "Client-supplied transaction acceptance policy" + }, + "tier": "offline" + }, + { + "bugType": "auth-bypass", + "description": "SetComputeUnitPrice 5001 with no SetComputeUnitLimit: the runtime budgets 200000 units for each of the top_up and the memo, so the sponsor would pay 2001 lamports, one over its cap (RULINGS S6). A verifier that bounds only declared limits accepts it.", + "expect": { + "outcome": "reject", + "rejectCode": "setup-transaction" + }, + "id": "batch-verify-top-up-implicit-limit-priority-fee-over-cap-reject", + "input": { + "batchRequirements": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "memo": "invoice-42", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "withdrawDelay": 3600 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "batch-settlement" + }, + "batchServer": { + "cluster": "devnet", + "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "decimals": 6, + "feePayerSecretKey": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 253, + 23, + 36, + 56, + 90, + 160, + 199, + 91, + 100, + 251, + 120, + 205, + 96, + 47, + 161, + 217, + 145, + 253, + 235, + 247, + 107, + 19, + 197, + 142, + 215, + 2, + 234, + 200, + 53, + 233, + 246, + 24 + ], + "maxTimeoutSeconds": 300, + "memo": "invoice-42", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "price": "0.001", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "withdrawDelay": 3600 + }, + "batchServerChannel": { + "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ", + "chargedCumulativeAmount": "3000", + "deposit": "4000", + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "settled": "0" + }, + "rpcFixtures": { + "accounts": { + "8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqfqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLADKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "BSMX9adNvtMHhBSbiuDeaPZZbF82cmPJkSHyptJSHecz": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqc7S0pMPs1+WdY0rmfl3rvsCtBvIE3wE6aVozdqV7mNBQDKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ": { + "data": "AQH/ACoAAAAAAAAAoA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAOAABKHxlNESMyCQEQHZINFOcuqsCHfS894FMmEGgZV1RQmepKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIs/RckOFqgx1tk+3jNYC+h2ZH96/drE8WO1wLqyDXp9hjqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLDtELLORIVfxOpM9ATQoLQMrX/7NAaLb8bd5BgjfAC6n/RckOFqgx1tk+3jNYC+h2ZH96/drE8WO1wLqyDXp9hhAP1MUAAAAAA==", + "owner": "CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX" + }, + "PjeTAeWHZHjrBForCEJvMVmRJpW5dngPaRzCp8w1MM4": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqerTiszHktPOhVCuuD5Vd1dMwNJx06hxwqSBewGVQkiMwDKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "f5xag9qZ5qmEkt2MDrBQZENh9QV1orw3UyrqAg5wTc3": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqf9FyQ4WqDHW2T7eM1gL6HZkf3r92sTxY7XAurINen2GADKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "11111111111111111111111111111111", + "slot": 341000100 + }, + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJtYXhUaW1lb3V0U2Vjb25kcyI6MzAwLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwicGF5VG8iOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInNjaGVtZSI6ImJhdGNoLXNldHRsZW1lbnQifSwicGF5bG9hZCI6eyJjaGFubmVsQ29uZmlnIjp7Im9wZW5TbG90IjozNDEwMDAwMDAsInBheWVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJwYXllckF1dGhvcml6ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInJlY2VpdmVyIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInNhbHQiOiI0MiIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiZGVwb3NpdCI6eyJhbW91bnQiOiI2MDAwIiwidHJhbnNhY3Rpb24iOiJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURnb3JVN1hQaXJ2TnhCOGgxWXNZT0xjNVNUU0tsalRVMGFzVTVTaUxJejUyazNIZFVYNG9tQUNMZ1lCWlVMZVJleVRDeXU0QnJqSnFYN1BoZ1lkZEFNZ0FJQUJRcjlGeVE0V3FESFcyVDdlTTFnTDZIWmtmM3I5MnNUeFk3WEF1cklOZW4yR09wS2JHUGluRklLdnZWUWV4TXV4Zm1WUjNhdXZyNTdra0llNm1rVVJ0SXNFdWsySzZja1BjcS9FcEs5UjJWMENzendnNDV3eHVmODBadC9aTEZlSXg1cmhQNVVCWm1RcHVvakNOeGxpRld0bFlwbEhoUlhKaVAzK3RPVDI3QVQ3UGlwZ2x0WTd5MWN4M1F4NGZuR0xRMS9wU1lmaTdmNGgyMmZIb21nMlNzZ0F3WkdiK1VoRnpMLzdLMjZjc09iNTd5TTVidkY5eEpyTEVPYk9rQUFBQUFGU2xOYW1Ta2hCazBrNkhGZzJqaDhmRFcxM2J5U3U0SGtINmhBUVFWRWpRYmQ5dUhYWmFHVDJjdmhSczdyZWF3Y3RJWHRYMXMza1RxTTlZVisvd0NwTzBRc3M1RWhWL0U2a3owQk5DZ3RBeXRmL3MwQm90dnh0M2tHQ044QUxxZW5vZnVrNnlzSkNaUDMwdC9XSzRuaXVISUhlbU9mMTlkSHFPbWZZOVFWcmdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBd1VBQ1FPSkV3QUFBQUFBQUFrR0FRUURBZ2dIQ1FOd0Z3QUFBQUFBQUFZQUNtbHVkbTlwWTJVdE5ESUEifSwidHlwZSI6ImRlcG9zaXQiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkhqZzJQRGdMeFlEaVFXUkhySmVlWTlWOWlOeWViTTlNV3V0b0E2N2VpdnNaIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiI0MDAwIiwic2lnbmF0dXJlIjoiM1dZTmpjbWhkNHNYb254UVByQnFyRmJzVnQ5Sm9nRlN0b0FTcGo0bzFMVG5MeGk5SGU0YjRlOHRIanN1Q3RNQ1dCUGt0b1JmekdYeEhTZko5dVlnYVhEUiJ9fSwieDQwMlZlcnNpb24iOjJ9" + }, + "intent": "x402-batch-settlement", + "mode": "verify-transaction", + "provenance": "generated", + "requirements": [ + "X402-a93234f1d7" + ], + "role": "server", + "spec": { + "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", + "quote": "A sponsor MAY apply stricter local compute-unit, priority-fee, or required-signature caps, but MUST NOT relax the absolute maxima above.", + "section": "Client-supplied transaction acceptance policy" + }, + "tier": "offline" + }, { "bugType": "auth-bypass", "description": "Paired accept: the memo followed by three Lighthouse assertions in the suffix.", @@ -4582,5 +4899,163 @@ "section": "Canonical top_up" }, "tier": "offline" + }, + { + "bugType": "settlement", + "description": "The accept top-up, but the payer's token account holds 1 base unit against the 6000 top-up. The deposit is broadcast only after the handler runs, so a verifier that skips the balance serves the request and only then finds the deposit cannot land.", + "expect": { + "outcome": "reject", + "rejectCode": "settlement-simulation" + }, + "id": "batch-verify-top-up-unfunded-payer-reject", + "input": { + "batchRequirements": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "memo": "invoice-42", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "withdrawDelay": 3600 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "batch-settlement" + }, + "batchServer": { + "cluster": "devnet", + "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "decimals": 6, + "feePayerSecretKey": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 253, + 23, + 36, + 56, + 90, + 160, + 199, + 91, + 100, + 251, + 120, + 205, + 96, + 47, + 161, + 217, + 145, + 253, + 235, + 247, + 107, + 19, + 197, + 142, + 215, + 2, + 234, + 200, + 53, + 233, + 246, + 24 + ], + "maxTimeoutSeconds": 300, + "memo": "invoice-42", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "price": "0.001", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "withdrawDelay": 3600 + }, + "batchServerChannel": { + "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ", + "chargedCumulativeAmount": "3000", + "deposit": "4000", + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "settled": "0" + }, + "rpcFixtures": { + "accounts": { + "8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqfqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "BSMX9adNvtMHhBSbiuDeaPZZbF82cmPJkSHyptJSHecz": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqc7S0pMPs1+WdY0rmfl3rvsCtBvIE3wE6aVozdqV7mNBQDKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ": { + "data": "AQH/ACoAAAAAAAAAoA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAOAABKHxlNESMyCQEQHZINFOcuqsCHfS894FMmEGgZV1RQmepKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIs/RckOFqgx1tk+3jNYC+h2ZH96/drE8WO1wLqyDXp9hjqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLDtELLORIVfxOpM9ATQoLQMrX/7NAaLb8bd5BgjfAC6n/RckOFqgx1tk+3jNYC+h2ZH96/drE8WO1wLqyDXp9hhAP1MUAAAAAA==", + "owner": "CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX" + }, + "PjeTAeWHZHjrBForCEJvMVmRJpW5dngPaRzCp8w1MM4": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqerTiszHktPOhVCuuD5Vd1dMwNJx06hxwqSBewGVQkiMwDKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "f5xag9qZ5qmEkt2MDrBQZENh9QV1orw3UyrqAg5wTc3": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqf9FyQ4WqDHW2T7eM1gL6HZkf3r92sTxY7XAurINen2GADKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "11111111111111111111111111111111", + "slot": 341000100 + }, + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJtYXhUaW1lb3V0U2Vjb25kcyI6MzAwLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwicGF5VG8iOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInNjaGVtZSI6ImJhdGNoLXNldHRsZW1lbnQifSwicGF5bG9hZCI6eyJjaGFubmVsQ29uZmlnIjp7Im9wZW5TbG90IjozNDEwMDAwMDAsInBheWVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJwYXllckF1dGhvcml6ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInJlY2VpdmVyIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInNhbHQiOiI0MiIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiZGVwb3NpdCI6eyJhbW91bnQiOiI2MDAwIiwidHJhbnNhY3Rpb24iOiJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJKejlBaGkyYTZVNGlRa3J4OGVYK3lEaVZWQ1dyVmNrcmp3VjZjZ1dLY3hLRmNIRTVYYTRuZ3V2dEFxUjBlSGFpRncxSWN0SS9WUDZ1L2xWWnc1b1FKZ0FJQUJBbjlGeVE0V3FESFcyVDdlTTFnTDZIWmtmM3I5MnNUeFk3WEF1cklOZW4yR09wS2JHUGluRklLdnZWUWV4TXV4Zm1WUjNhdXZyNTdra0llNm1rVVJ0SXNFdWsySzZja1BjcS9FcEs5UjJWMENzendnNDV3eHVmODBadC9aTEZlSXg1cmhQNVVCWm1RcHVvakNOeGxpRld0bFlwbEhoUlhKaVAzK3RPVDI3QVQ3UGlwZ2x0WTd5MWN4M1F4NGZuR0xRMS9wU1lmaTdmNGgyMmZIb21nMlNzZ0JVcFRXcGtwSVFaTkpPaHhZTm80Zkh3MXRkMjhrcnVCNUIrb1FFRUZSSTBHM2ZiaDEyV2hrOW5MNFViTzYzbXNITFNGN1Y5Yk41RTZqUFdGZnY4QXFUdEVMTE9SSVZmeE9wTTlBVFFvTFFNclgvN05BYUxiOGJkNUJnamZBQzZucDZIN3BPc3JDUW1UOTlMZjFpdUo0cmh5QjNwam45ZlhSNmpwbjJQVUZhNEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSUJnRUVBd0lIQmdrRGNCY0FBQUFBQUFBRkFBcHBiblp2YVdObExUUXlBQT09In0sInR5cGUiOiJkZXBvc2l0Iiwidm91Y2hlciI6eyJjaGFubmVsSWQiOiJIamcyUERnTHhZRGlRV1JIckplZVk5VjlpTnllYk05TVd1dG9BNjdlaXZzWiIsImV4cGlyZXNBdCI6MCwibWF4Q2xhaW1hYmxlQW1vdW50IjoiNDAwMCIsInNpZ25hdHVyZSI6IjNXWU5qY21oZDRzWG9ueFFQckJxckZic1Z0OUpvZ0ZTdG9BU3BqNG8xTFRuTHhpOUhlNGI0ZTh0SGpzdUN0TUNXQlBrdG9SZnpHWHhIU2ZKOXVZZ2FYRFIifX0sIng0MDJWZXJzaW9uIjoyfQ==" + }, + "intent": "x402-batch-settlement", + "mode": "verify-transaction", + "provenance": "generated", + "requirements": [ + "X402-014270dc81" + ], + "role": "server", + "spec": { + "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", + "quote": "It MUST confirm the payer has sufficient tokens.", + "section": "Canonical top_up" + }, + "tier": "offline" } ] diff --git a/harness/vectors/batch-verify-voucher.json b/harness/vectors/batch-verify-voucher.json index dc9ec9642..76eb70b54 100644 --- a/harness/vectors/batch-verify-voucher.json +++ b/harness/vectors/batch-verify-voucher.json @@ -3155,6 +3155,164 @@ }, "tier": "offline" }, + { + "bugType": "auth-bypass", + "description": "channelConfig.receiver is the text invalid_batch_settlement_svm_cumulative_amount_mismatch rather than payTo. The failure is the receiver binding (channel-state), whatever code the client's own text names: a verifier that classifies its error by searching the message reports a cumulative mismatch, and answers it with the corrective 402 carrying the channel's latest voucher.", + "expect": { + "outcome": "reject", + "rejectCode": "channel-state" + }, + "id": "batch-verify-voucher-receiver-quotes-a-code-reject", + "input": { + "batchRequirements": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "memo": "invoice-42", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "withdrawDelay": 3600 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "batch-settlement" + }, + "batchServer": { + "cluster": "devnet", + "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "decimals": 6, + "feePayerSecretKey": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 253, + 23, + 36, + 56, + 90, + 160, + 199, + 91, + 100, + 251, + 120, + 205, + 96, + 47, + 161, + 217, + 145, + 253, + 235, + 247, + 107, + 19, + 197, + 142, + 215, + 2, + 234, + 200, + 53, + 233, + 246, + 24 + ], + "maxTimeoutSeconds": 300, + "memo": "invoice-42", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "price": "0.001", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "withdrawDelay": 3600 + }, + "batchServerChannel": { + "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ", + "chargedCumulativeAmount": "3000", + "deposit": "10000", + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "settled": "0" + }, + "rpcFixtures": { + "accounts": { + "8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqfqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLADKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "BSMX9adNvtMHhBSbiuDeaPZZbF82cmPJkSHyptJSHecz": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqc7S0pMPs1+WdY0rmfl3rvsCtBvIE3wE6aVozdqV7mNBQDKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ": { + "data": "AQH/ACoAAAAAAAAAECcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAOAABKHxlNESMyCQEQHZINFOcuqsCHfS894FMmEGgZV1RQmepKbGPinFIKvvVQexMuxfmVR3auvr57kkIe6mkURtIs/RckOFqgx1tk+3jNYC+h2ZH96/drE8WO1wLqyDXp9hjqSmxj4pxSCr71UHsTLsX5lUd2rr6+e5JCHuppFEbSLDtELLORIVfxOpM9ATQoLQMrX/7NAaLb8bd5BgjfAC6n/RckOFqgx1tk+3jNYC+h2ZH96/drE8WO1wLqyDXp9hhAP1MUAAAAAA==", + "owner": "CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX" + }, + "PjeTAeWHZHjrBForCEJvMVmRJpW5dngPaRzCp8w1MM4": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqerTiszHktPOhVCuuD5Vd1dMwNJx06hxwqSBewGVQkiMwDKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + "f5xag9qZ5qmEkt2MDrBQZENh9QV1orw3UyrqAg5wTc3": { + "data": "O0Qss5EhV/E6kz0BNCgtAytf/s0Botvxt3kGCN8ALqf9FyQ4WqDHW2T7eM1gL6HZkf3r92sTxY7XAurINen2GADKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "11111111111111111111111111111111", + "slot": 341000100 + }, + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJtYXhUaW1lb3V0U2Vjb25kcyI6MzAwLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwicGF5VG8iOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInNjaGVtZSI6ImJhdGNoLXNldHRsZW1lbnQifSwicGF5bG9hZCI6eyJjaGFubmVsQ29uZmlnIjp7Im9wZW5TbG90IjozNDEwMDAwMDAsInBheWVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJwYXllckF1dGhvcml6ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInJlY2VpdmVyIjoiaW52YWxpZF9iYXRjaF9zZXR0bGVtZW50X3N2bV9jdW11bGF0aXZlX2Ftb3VudF9taXNtYXRjaCIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjQyIiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJ0eXBlIjoidm91Y2hlciIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" + }, + "intent": "x402-batch-settlement", + "mode": "verify-transaction", + "provenance": "generated", + "requirements": [ + "X402-a2dd2eb911" + ], + "role": "server", + "spec": { + "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", + "quote": "Confirm the channel exists, is `Open`, has `mint == channelConfig.token == asset`, `payee == extra.feePayer`", + "section": "Phase 3 - Voucher Acceptance (before serving)" + }, + "tier": "offline" + }, { "bugType": "auth-bypass", "description": "channelConfig.token is another mint than the asset (voucher signed for that config's PDA).", diff --git a/harness/vectors/session-build.json b/harness/vectors/session-build.json index 019fe3e52..a69a08194 100644 --- a/harness/vectors/session-build.json +++ b/harness/vectors/session-build.json @@ -33,6 +33,7 @@ "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", "recentSlot": "250000000" }, + "deposit": "1000", "request": { "amount": "25", "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", @@ -251,6 +252,7 @@ "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", "recentSlot": "250000000" }, + "deposit": "1000", "request": { "amount": "25", "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", @@ -538,6 +540,7 @@ "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", "recentSlot": "250000000" }, + "deposit": "1000", "request": { "amount": "25", "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", @@ -762,6 +765,7 @@ "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", "recentSlot": "250000000" }, + "deposit": "1000", "request": { "amount": "25", "currency": "2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo", @@ -976,6 +980,7 @@ "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", "recentSlot": "250000000" }, + "deposit": "1000", "request": { "amount": "25", "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", @@ -1169,6 +1174,7 @@ "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", "recentSlot": "250000000" }, + "deposit": "1000", "request": { "amount": "25", "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", @@ -1347,6 +1353,203 @@ }, "tier": "offline" }, + { + "bugType": "defaults", + "description": "The challenged recentBlockhash is not a live blockhash on the client's cluster (its RPC's latest is another), so it is not from the selected network: an open signed over it would be valid on another cluster. The client refuses before signing. Pair: session-build-open-client-paid.", + "expect": { + "outcome": "reject", + "rejectCode": "invalid-challenge" + }, + "id": "session-build-foreign-blockhash-reject", + "input": { + "rpcFixtures": { + "recentBlockhash": "9zrUHnA1nCByPksy3aL8tQ47vqdaG2vnFs4HrxgcZj4F" + }, + "sessionOpenBuild": { + "challenge": { + "id": "c_session_conformance_0001", + "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", + "recentSlot": "250000000" + }, + "deposit": "1000", + "request": { + "amount": "25", + "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "methodDetails": { + "channelProgram": "CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX", + "decimals": 6, + "gracePeriodSeconds": 900, + "network": "devnet", + "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", + "recentSlot": "250000000", + "voucherSigner": "client" + }, + "minimumDeposit": "100", + "recipient": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "suggestedDeposit": "1000" + }, + "salt": "7", + "server": { + "amount": "25", + "currency": "USDC", + "decimals": 6, + "gracePeriodSeconds": 900, + "idleTimeoutSeconds": 300, + "minimumDeposit": "100", + "network": "devnet", + "operator": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", + "recipient": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "suggestedDeposit": "1000", + "voucherSigner": "client" + } + }, + "sessionSignerSecretKey": [ + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 145, + 162, + 138, + 11, + 116, + 56, + 21, + 147, + 164, + 217, + 70, + 149, + 121, + 32, + 137, + 38, + 175, + 200, + 173, + 130, + 200, + 131, + 155, + 118, + 68, + 53, + 155, + 158, + 186, + 154, + 75, + 58 + ], + "signerSecretKey": [ + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 234, + 74, + 108, + 99, + 226, + 156, + 82, + 10, + 190, + 245, + 80, + 123, + 19, + 46, + 197, + 249, + 149, + 71, + 118, + 174, + 190, + 190, + 123, + 146, + 66, + 30, + 234, + 105, + 20, + 70, + 210, + 44 + ] + }, + "intent": "session", + "mode": "build-transaction", + "provenance": "generated", + "requirements": [ + "MPP-d235eadc2e" + ], + "role": "client", + "spec": { + "doc": "mpp-specs/specs/methods/solana/draft-solana-session-00.md", + "quote": "The server MUST obtain it from the selected network, and the client MUST use it as the transaction message's recent blockhash.", + "section": "Method Details" + }, + "tier": "offline" + }, { "bugType": "defaults", "description": "A new-channel challenge without recentSlot. Pair: session-build-open-client-paid. Challenge edit: challenge /methodDetails/recentSlot removed.", @@ -1362,6 +1565,7 @@ "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", "recentSlot": "250000000" }, + "deposit": "1000", "request": { "amount": "25", "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", @@ -1554,6 +1758,7 @@ "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", "recentSlot": "250000000" }, + "deposit": "1000", "request": { "amount": "25", "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", @@ -1748,6 +1953,7 @@ "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", "recentSlot": "250000000" }, + "deposit": "1000", "request": { "amount": "25", "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", @@ -1942,6 +2148,7 @@ "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", "recentSlot": "250000000" }, + "deposit": "1000", "request": { "amount": "25", "currency": "sol", @@ -2135,6 +2342,7 @@ "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", "recentSlot": "250000000" }, + "deposit": "1000", "request": { "amount": "25", "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", @@ -2329,6 +2537,7 @@ "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", "recentSlot": "250000000" }, + "deposit": "1000", "request": { "amount": "25", "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", @@ -2522,6 +2731,7 @@ "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", "recentSlot": "250000000" }, + "deposit": "1000", "request": { "amount": "25", "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", @@ -2715,6 +2925,7 @@ "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", "recentSlot": "250000000" }, + "deposit": "1000", "request": { "amount": "25", "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", @@ -2908,6 +3119,7 @@ "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N", "recentSlot": "250000000" }, + "deposit": "1000", "request": { "amount": "25", "currency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", diff --git a/harness/vectors/x402-upto-build.json b/harness/vectors/x402-upto-build.json index 0bfe6a707..9aeb1227a 100644 --- a/harness/vectors/x402-upto-build.json +++ b/harness/vectors/x402-upto-build.json @@ -1216,6 +1216,126 @@ }, "tier": "offline" }, + { + "bugType": "wire", + "description": "extra.recentBlockhash is not a live blockhash on the client's cluster (its RPC's latest is another). The blockhash alone binds the signed open to a cluster, so an open over it would escrow maxAmount on whichever cluster knows that hash rather than the offer's network: the client refuses the challenge before signing. Pair: x402-upto-build-accept. The client builds and signs the channel open from the challenge hints (no live RPC); the judge runs the Rust upto verifier on the SDK's header and compares the open with the kit's own build modulo the salt.", + "expect": { + "outcome": "reject", + "rejectCode": "invalid-challenge", + "rejectReason": "recentBlockhash unknown to the client's cluster" + }, + "id": "x402-upto-build-foreign-blockhash-reject", + "input": { + "nowSeconds": 1800000000, + "rpcFixtures": { + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "9zrUHnA1nCByPksy3aL8tQ47vqdaG2vnFs4HrxgcZj4F", + "slot": 400000000 + }, + "signerSecretKey": [ + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 234, + 74, + 108, + 99, + 226, + 156, + 82, + 10, + 190, + 245, + 80, + 123, + 19, + 46, + 197, + 249, + 149, + 71, + 118, + 174, + 190, + 190, + 123, + 146, + 66, + 30, + 234, + 105, + 20, + 70, + 210, + 44 + ], + "x402Offer": { + "amount": "1000000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "recentBlockhash": "11111111111111111111111111111111", + "recentSlot": "400000000", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "withdrawDelay": 900 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "upto" + }, + "x402UptoExpiresAt": 1800000300, + "x402UptoRequestNonce": "request-7" + }, + "intent": "x402-upto", + "mode": "build-transaction", + "provenance": "generated", + "requirements": [ + "X402-eace5aece9" + ], + "role": "client", + "spec": { + "doc": "x402/specs/schemes/upto/scheme_upto_svm.md", + "quote": "The client builds an open transaction against the canonical payment-channels program, deposits maxAmount, sets payee and rent_payer to extra.feePayer, sets authorized_signer to extra.receiverAuthorizer, encodes grace_period = extra.withdrawDelay, and signs as channel payer.", + "section": "Phase 1 - Setup" + }, + "tier": "offline" + }, { "bugType": "wire", "description": "extra.withdrawDelay 0 is outside the scheme: the client refuses the challenge instead of opening a channel with no escape-hatch delay. The client builds and signs the channel open from the challenge hints (no live RPC); the judge runs the Rust upto verifier on the SDK's header and compares the open with the kit's own build modulo the salt.", diff --git a/harness/vectors/x402-upto-open-policy.json b/harness/vectors/x402-upto-open-policy.json index 87ea32579..782abb0de 100644 --- a/harness/vectors/x402-upto-open-policy.json +++ b/harness/vectors/x402-upto-open-policy.json @@ -712,7 +712,7 @@ }, { "bugType": "auth-bypass", - "description": "SetComputeUnitLimit 400000 and SetComputeUnitPrice 5000000 sit exactly at the absolute ceilings and are accepted. Verify is the read-only preflight of the deposit settle (Phase 3): every static check before co-signing, at the vector's clock (nowSeconds).", + "description": "SetComputeUnitLimit 400000 sits exactly at the absolute ceiling and SetComputeUnitPrice 5000 makes a 2000 lamport priority fee, exactly the sponsor's cap on the fee it pays (RULINGS S6): accepted. Verify is the read-only preflight of the deposit settle (Phase 3): every static check before co-signing, at the vector's clock (nowSeconds).", "expect": { "outcome": "accept" }, @@ -729,7 +729,7 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 400000000 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiN3Y1NE5XZEJ0a2p1QUZKckxHc1MyU1hudWs4bkthbTgxbVpKZWVZeFZGaTkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInJlY2VudEJsb2NraGFzaCI6IjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIiwicmVjZW50U2xvdCI6IjQwMDAwMDAwMCIsInRva2VuUHJvZ3JhbSI6IlRva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEiLCJ3aXRoZHJhd0RlbGF5Ijo5MDB9LCJtYXhUaW1lb3V0U2Vjb25kcyI6MzAwLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwicGF5VG8iOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInNjaGVtZSI6InVwdG8ifSwicGF5bG9hZCI6eyJhdXRob3JpemVkU2lnbmVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJjaGFubmVsSWQiOiIzR210QTdUQ3Axclo1ZkNZbXc2aUcySHFCQlhtTE1ETkdDYVhnU1VhYkJiMyIsImRlcG9zaXQiOiIxMDAwMDAwIiwiZXhwaXJlc0F0IjoxODAwMDAwMzAwLCJmcm9tIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJtYXhBbW91bnQiOiIxMDAwMDAwIiwibm9uY2UiOiI0MjQyIiwib3BlblNsb3QiOiI0MDAwMDAwMDAiLCJvcGVuVHJhbnNhY3Rpb24iOiJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBOGFGdFpILzgvR1RyRUFFN0haWTZvNUJoYzZTcXZsakxvVHFGc21XVTM4TkI1TDkwVFVJU0ttaXhXUWlFYlZMZkoyOURyMVpXQnNpYjVSMUdJQ0FPZ0FJQUNnOW12bjR6TEhwRk16SzluUXAvZmJCVjljWHZHZ2F0cG0yWXM1KzJnUXhIT3VwS2JHUGluRklLdnZWUWV4TXV4Zm1WUjNhdXZyNTdra0llNm1rVVJ0SXNJY0hWa1Z4RG1Xa1lpN1NMM0c2NGVwZEtacTV4TklCdVF6MlZLUjZJdlI1cmhQNVVCWm1RcHVvakNOeGxpRld0bFlwbEhoUlhKaVAzK3RPVDI3QVQ3TnMxOXgrZmNhMzdibTVvNC9oazRYRHVZLzhPeHluTGNYb3l1ZWExam52ekFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQmtadjVTRVhNdi9zcmJweXc1dm52SXpsdThYM0Vtc3NRNXM2UUFBQUFBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnFmVkZ4a3NYRkVoak1sTVBVcnhmMWphN2dpYm9mMUU0OXZaaWdBQUFBQUczZmJoMTJXaGs5bkw0VWJPNjNtc0hMU0Y3VjliTjVFNmpQV0ZmdjhBcVR0RUxMT1JJVmZ4T3BNOUFUUW9MUU1yWC83TkFhTGI4YmQ1QmdqZkFDNm5XbFFOZTJzZUt5dTFGMUlaeWFQd1lCQ1NRY3FNVHhjTXdjb3RTTzdxK2RDTWx5V1BUaVNKOGJzOUVDa1VqZzJEQzFvVG1kci9FSVFFam52WTIrbjRXWkdpaWd0ME9CV1RwTmxHbFhrZ2lTYXZ5SzJDeUlPYmRrUTFtNTY2bWtzNnA2SDdwT3NyQ1FtVDk5TGYxaXVKNHJoeUIzcGpuOWZYUjZqcG4yUFVGYTRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUdBQVVDZ0JvR0FBWUFDUU5BUzB3QUFBQUFBQTRPQVFBQUNnMENBd1FKQlFnTUN3NURBWklRQUFBQUFBQUFRRUlQQUFBQUFBQ0VBd0FBQUlUWEZ3QUFBQUFCQUFBQXEwNHJNeDVMVHpvVlFycmcrVlhkWFRNRFNjZE9vY2NLa2dYc0JsVUpJak1RSndjQUlEVm1NMk01WVRGbE4ySXlaRFJqTm1VNFpqQmhNV0l5WXpOa05HVTFaall3QUE9PSIsInZhbGlkQWZ0ZXIiOjE4MDAwMDAwMDB9LCJ4NDAyVmVyc2lvbiI6Mn0=", + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiN3Y1NE5XZEJ0a2p1QUZKckxHc1MyU1hudWs4bkthbTgxbVpKZWVZeFZGaTkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInJlY2VudEJsb2NraGFzaCI6IjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIiwicmVjZW50U2xvdCI6IjQwMDAwMDAwMCIsInRva2VuUHJvZ3JhbSI6IlRva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEiLCJ3aXRoZHJhd0RlbGF5Ijo5MDB9LCJtYXhUaW1lb3V0U2Vjb25kcyI6MzAwLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwicGF5VG8iOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInNjaGVtZSI6InVwdG8ifSwicGF5bG9hZCI6eyJhdXRob3JpemVkU2lnbmVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJjaGFubmVsSWQiOiIzR210QTdUQ3Axclo1ZkNZbXc2aUcySHFCQlhtTE1ETkdDYVhnU1VhYkJiMyIsImRlcG9zaXQiOiIxMDAwMDAwIiwiZXhwaXJlc0F0IjoxODAwMDAwMzAwLCJmcm9tIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJtYXhBbW91bnQiOiIxMDAwMDAwIiwibm9uY2UiOiI0MjQyIiwib3BlblNsb3QiOiI0MDAwMDAwMDAiLCJvcGVuVHJhbnNhY3Rpb24iOiJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUN5d2cvR1hKdURqaUJaUU9pNzlScUVNMGFIWVRlNHMxWWNubzZlZVpYU0EreEpmL1AwSVB4ekl5ZkFjUStWTENEUk83RVdhci9NeVRkNC9JcHp5UXNMZ0FJQUNnOW12bjR6TEhwRk16SzluUXAvZmJCVjljWHZHZ2F0cG0yWXM1KzJnUXhIT3VwS2JHUGluRklLdnZWUWV4TXV4Zm1WUjNhdXZyNTdra0llNm1rVVJ0SXNJY0hWa1Z4RG1Xa1lpN1NMM0c2NGVwZEtacTV4TklCdVF6MlZLUjZJdlI1cmhQNVVCWm1RcHVvakNOeGxpRld0bFlwbEhoUlhKaVAzK3RPVDI3QVQ3TnMxOXgrZmNhMzdibTVvNC9oazRYRHVZLzhPeHluTGNYb3l1ZWExam52ekFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQmtadjVTRVhNdi9zcmJweXc1dm52SXpsdThYM0Vtc3NRNXM2UUFBQUFBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnFmVkZ4a3NYRkVoak1sTVBVcnhmMWphN2dpYm9mMUU0OXZaaWdBQUFBQUczZmJoMTJXaGs5bkw0VWJPNjNtc0hMU0Y3VjliTjVFNmpQV0ZmdjhBcVR0RUxMT1JJVmZ4T3BNOUFUUW9MUU1yWC83TkFhTGI4YmQ1QmdqZkFDNm5XbFFOZTJzZUt5dTFGMUlaeWFQd1lCQ1NRY3FNVHhjTXdjb3RTTzdxK2RDTWx5V1BUaVNKOGJzOUVDa1VqZzJEQzFvVG1kci9FSVFFam52WTIrbjRXWkdpaWd0ME9CV1RwTmxHbFhrZ2lTYXZ5SzJDeUlPYmRrUTFtNTY2bWtzNnA2SDdwT3NyQ1FtVDk5TGYxaXVKNHJoeUIzcGpuOWZYUjZqcG4yUFVGYTRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUdBQVVDZ0JvR0FBWUFDUU9JRXdBQUFBQUFBQTRPQVFBQUNnMENBd1FKQlFnTUN3NURBWklRQUFBQUFBQUFRRUlQQUFBQUFBQ0VBd0FBQUlUWEZ3QUFBQUFCQUFBQXEwNHJNeDVMVHpvVlFycmcrVlhkWFRNRFNjZE9vY2NLa2dYc0JsVUpJak1RSndjQUlEVm1NMk01WVRGbE4ySXlaRFJqTm1VNFpqQmhNV0l5WXpOa05HVTFaall3QUE9PSIsInZhbGlkQWZ0ZXIiOjE4MDAwMDAwMDB9LCJ4NDAyVmVyc2lvbiI6Mn0=", "x402ServerAmount": "1000000", "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "x402ServerFeePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", @@ -889,6 +889,185 @@ }, "tier": "offline" }, + { + "bugType": "auth-bypass", + "description": "SetComputeUnitPrice 5000 with no SetComputeUnitLimit: the runtime budgets 200000 units for each of the open and the memo, a 2000 lamport priority fee, exactly the sponsor's cap (RULINGS S6): accepted. Pair: x402-upto-verify-implicit-limit-priority-fee-over-cap-reject. Verify is the read-only preflight of the deposit settle (Phase 3): every static check before co-signing, at the vector's clock (nowSeconds).", + "expect": { + "outcome": "accept" + }, + "id": "x402-upto-verify-implicit-limit-at-fee-cap-accept", + "input": { + "nowSeconds": 1800000000, + "rpcFixtures": { + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "11111111111111111111111111111111", + "slot": 400000000 + }, + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiN3Y1NE5XZEJ0a2p1QUZKckxHc1MyU1hudWs4bkthbTgxbVpKZWVZeFZGaTkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInJlY2VudEJsb2NraGFzaCI6IjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIiwicmVjZW50U2xvdCI6IjQwMDAwMDAwMCIsInRva2VuUHJvZ3JhbSI6IlRva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEiLCJ3aXRoZHJhd0RlbGF5Ijo5MDB9LCJtYXhUaW1lb3V0U2Vjb25kcyI6MzAwLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwicGF5VG8iOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInNjaGVtZSI6InVwdG8ifSwicGF5bG9hZCI6eyJhdXRob3JpemVkU2lnbmVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJjaGFubmVsSWQiOiIzR210QTdUQ3Axclo1ZkNZbXc2aUcySHFCQlhtTE1ETkdDYVhnU1VhYkJiMyIsImRlcG9zaXQiOiIxMDAwMDAwIiwiZXhwaXJlc0F0IjoxODAwMDAwMzAwLCJmcm9tIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJtYXhBbW91bnQiOiIxMDAwMDAwIiwibm9uY2UiOiI0MjQyIiwib3BlblNsb3QiOiI0MDAwMDAwMDAiLCJvcGVuVHJhbnNhY3Rpb24iOiJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJCeDJzd250THpaWjVSN3R1OGc1cEdmN2poajJpbm0yN2NrazZLV2lqVXpyNTQ3OENRdjV3TVArcCtiWlJlVmZsSUFSdHdRdWpKc0hxZzVHb2dGN0lIZ0FJQUNnOW12bjR6TEhwRk16SzluUXAvZmJCVjljWHZHZ2F0cG0yWXM1KzJnUXhIT3VwS2JHUGluRklLdnZWUWV4TXV4Zm1WUjNhdXZyNTdra0llNm1rVVJ0SXNJY0hWa1Z4RG1Xa1lpN1NMM0c2NGVwZEtacTV4TklCdVF6MlZLUjZJdlI1cmhQNVVCWm1RcHVvakNOeGxpRld0bFlwbEhoUlhKaVAzK3RPVDI3QVQ3TnMxOXgrZmNhMzdibTVvNC9oazRYRHVZLzhPeHluTGNYb3l1ZWExam52ekFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQmtadjVTRVhNdi9zcmJweXc1dm52SXpsdThYM0Vtc3NRNXM2UUFBQUFBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnFmVkZ4a3NYRkVoak1sTVBVcnhmMWphN2dpYm9mMUU0OXZaaWdBQUFBQUczZmJoMTJXaGs5bkw0VWJPNjNtc0hMU0Y3VjliTjVFNmpQV0ZmdjhBcVR0RUxMT1JJVmZ4T3BNOUFUUW9MUU1yWC83TkFhTGI4YmQ1QmdqZkFDNm5XbFFOZTJzZUt5dTFGMUlaeWFQd1lCQ1NRY3FNVHhjTXdjb3RTTzdxK2RDTWx5V1BUaVNKOGJzOUVDa1VqZzJEQzFvVG1kci9FSVFFam52WTIrbjRXWkdpaWd0ME9CV1RwTmxHbFhrZ2lTYXZ5SzJDeUlPYmRrUTFtNTY2bWtzNnA2SDdwT3NyQ1FtVDk5TGYxaXVKNHJoeUIzcGpuOWZYUjZqcG4yUFVGYTRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUdBQWtEaUJNQUFBQUFBQUFPRGdFQUFBb05BZ01FQ1FVSURBc09Rd0dTRUFBQUFBQUFBRUJDRHdBQUFBQUFoQU1BQUFDRTF4Y0FBQUFBQVFBQUFLdE9Lek1lUzA4NkZVSzY0UGxWM1YwekEwbkhUcUhIQ3BJRjdBWlZDU0l6RUNjSEFDQTFaak5qT1dFeFpUZGlNbVEwWXpabE9HWXdZVEZpTW1NelpEUmxOV1kyTUFBPSIsInZhbGlkQWZ0ZXIiOjE4MDAwMDAwMDB9LCJ4NDAyVmVyc2lvbiI6Mn0=", + "x402ServerAmount": "1000000", + "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "x402ServerFeePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", + "x402ServerFeePayerSecretKey": [ + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 102, + 190, + 126, + 51, + 44, + 122, + 69, + 51, + 50, + 189, + 157, + 10, + 127, + 125, + 176, + 85, + 245, + 197, + 239, + 26, + 6, + 173, + 166, + 109, + 152, + 179, + 159, + 182, + 129, + 12, + 71, + 58 + ], + "x402ServerMaxChannelLifetimeSeconds": 3600, + "x402ServerMaxTimeoutSeconds": 300, + "x402ServerNetwork": "devnet", + "x402ServerReceiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "x402ServerReceiverAuthorizerSecretKey": [ + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 145, + 162, + 138, + 11, + 116, + 56, + 21, + 147, + 164, + 217, + 70, + 149, + 121, + 32, + 137, + 38, + 175, + 200, + 173, + 130, + 200, + 131, + 155, + 118, + 68, + 53, + 155, + 158, + 186, + 154, + 75, + 58 + ], + "x402ServerRecipient": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "x402ServerTokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "x402ServerWithdrawDelay": 900 + }, + "intent": "x402-upto", + "mode": "verify-transaction", + "provenance": "generated", + "requirements": [ + "X402-233dcf8a3e", + "X402-443a167ea1", + "X402-3b5914a7c5" + ], + "role": "server", + "spec": { + "doc": "x402/specs/schemes/upto/scheme_upto_svm.md", + "quote": "A sponsor MAY apply a stricter local policy for compute-unit limit, compute-unit price, and required-signature count (operator-configurable caps), but MUST NOT admit a compute-unit limit above 400000 or a compute-unit price above 5000000 microlamports.", + "section": "Top-level instruction layout" + }, + "tier": "offline" + }, { "bugType": "defaults", "description": "The route declares no extra.memo, so the suffix is only bounded at four Lighthouse/Memo instructions; two memos are allowed. Verify is the read-only preflight of the deposit settle (Phase 3): every static check before co-signing, at the vector's clock (nowSeconds).", @@ -4641,6 +4820,365 @@ }, "tier": "offline" }, + { + "bugType": "auth-bypass", + "description": "SetComputeUnitLimit 400000 and SetComputeUnitPrice 5000000: each at its absolute ceiling, but the sponsor would pay a 2000000 lamport priority fee. The sponsor bounds the fee it pays as limit times price (RULINGS S6): rejected as compute-price-over-cap. Pair: x402-upto-verify-compute-at-caps-accept. Verify is the read-only preflight of the deposit settle (Phase 3): every static check before co-signing, at the vector's clock (nowSeconds).", + "expect": { + "outcome": "reject", + "rejectCode": "compute-price-over-cap" + }, + "id": "x402-upto-verify-priority-fee-over-cap-reject", + "input": { + "nowSeconds": 1800000000, + "rpcFixtures": { + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "11111111111111111111111111111111", + "slot": 400000000 + }, + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiN3Y1NE5XZEJ0a2p1QUZKckxHc1MyU1hudWs4bkthbTgxbVpKZWVZeFZGaTkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInJlY2VudEJsb2NraGFzaCI6IjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIiwicmVjZW50U2xvdCI6IjQwMDAwMDAwMCIsInRva2VuUHJvZ3JhbSI6IlRva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEiLCJ3aXRoZHJhd0RlbGF5Ijo5MDB9LCJtYXhUaW1lb3V0U2Vjb25kcyI6MzAwLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwicGF5VG8iOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInNjaGVtZSI6InVwdG8ifSwicGF5bG9hZCI6eyJhdXRob3JpemVkU2lnbmVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJjaGFubmVsSWQiOiIzR210QTdUQ3Axclo1ZkNZbXc2aUcySHFCQlhtTE1ETkdDYVhnU1VhYkJiMyIsImRlcG9zaXQiOiIxMDAwMDAwIiwiZXhwaXJlc0F0IjoxODAwMDAwMzAwLCJmcm9tIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJtYXhBbW91bnQiOiIxMDAwMDAwIiwibm9uY2UiOiI0MjQyIiwib3BlblNsb3QiOiI0MDAwMDAwMDAiLCJvcGVuVHJhbnNhY3Rpb24iOiJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBOGFGdFpILzgvR1RyRUFFN0haWTZvNUJoYzZTcXZsakxvVHFGc21XVTM4TkI1TDkwVFVJU0ttaXhXUWlFYlZMZkoyOURyMVpXQnNpYjVSMUdJQ0FPZ0FJQUNnOW12bjR6TEhwRk16SzluUXAvZmJCVjljWHZHZ2F0cG0yWXM1KzJnUXhIT3VwS2JHUGluRklLdnZWUWV4TXV4Zm1WUjNhdXZyNTdra0llNm1rVVJ0SXNJY0hWa1Z4RG1Xa1lpN1NMM0c2NGVwZEtacTV4TklCdVF6MlZLUjZJdlI1cmhQNVVCWm1RcHVvakNOeGxpRld0bFlwbEhoUlhKaVAzK3RPVDI3QVQ3TnMxOXgrZmNhMzdibTVvNC9oazRYRHVZLzhPeHluTGNYb3l1ZWExam52ekFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQmtadjVTRVhNdi9zcmJweXc1dm52SXpsdThYM0Vtc3NRNXM2UUFBQUFBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnFmVkZ4a3NYRkVoak1sTVBVcnhmMWphN2dpYm9mMUU0OXZaaWdBQUFBQUczZmJoMTJXaGs5bkw0VWJPNjNtc0hMU0Y3VjliTjVFNmpQV0ZmdjhBcVR0RUxMT1JJVmZ4T3BNOUFUUW9MUU1yWC83TkFhTGI4YmQ1QmdqZkFDNm5XbFFOZTJzZUt5dTFGMUlaeWFQd1lCQ1NRY3FNVHhjTXdjb3RTTzdxK2RDTWx5V1BUaVNKOGJzOUVDa1VqZzJEQzFvVG1kci9FSVFFam52WTIrbjRXWkdpaWd0ME9CV1RwTmxHbFhrZ2lTYXZ5SzJDeUlPYmRrUTFtNTY2bWtzNnA2SDdwT3NyQ1FtVDk5TGYxaXVKNHJoeUIzcGpuOWZYUjZqcG4yUFVGYTRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUdBQVVDZ0JvR0FBWUFDUU5BUzB3QUFBQUFBQTRPQVFBQUNnMENBd1FKQlFnTUN3NURBWklRQUFBQUFBQUFRRUlQQUFBQUFBQ0VBd0FBQUlUWEZ3QUFBQUFCQUFBQXEwNHJNeDVMVHpvVlFycmcrVlhkWFRNRFNjZE9vY2NLa2dYc0JsVUpJak1RSndjQUlEVm1NMk01WVRGbE4ySXlaRFJqTm1VNFpqQmhNV0l5WXpOa05HVTFaall3QUE9PSIsInZhbGlkQWZ0ZXIiOjE4MDAwMDAwMDB9LCJ4NDAyVmVyc2lvbiI6Mn0=", + "x402ServerAmount": "1000000", + "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "x402ServerFeePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", + "x402ServerFeePayerSecretKey": [ + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 102, + 190, + 126, + 51, + 44, + 122, + 69, + 51, + 50, + 189, + 157, + 10, + 127, + 125, + 176, + 85, + 245, + 197, + 239, + 26, + 6, + 173, + 166, + 109, + 152, + 179, + 159, + 182, + 129, + 12, + 71, + 58 + ], + "x402ServerMaxChannelLifetimeSeconds": 3600, + "x402ServerMaxTimeoutSeconds": 300, + "x402ServerNetwork": "devnet", + "x402ServerReceiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "x402ServerReceiverAuthorizerSecretKey": [ + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 145, + 162, + 138, + 11, + 116, + 56, + 21, + 147, + 164, + 217, + 70, + 149, + 121, + 32, + 137, + 38, + 175, + 200, + 173, + 130, + 200, + 131, + 155, + 118, + 68, + 53, + 155, + 158, + 186, + 154, + 75, + 58 + ], + "x402ServerRecipient": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "x402ServerTokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "x402ServerWithdrawDelay": 900 + }, + "intent": "x402-upto", + "mode": "verify-transaction", + "provenance": "generated", + "requirements": [ + "X402-b4167aad45", + "X402-233dcf8a3e", + "X402-3b5914a7c5" + ], + "role": "server", + "spec": { + "doc": "x402/specs/schemes/upto/scheme_upto_svm.md", + "quote": "A sponsor MAY apply a stricter local policy for compute-unit limit, compute-unit price, and required-signature count (operator-configurable caps), but MUST NOT admit a compute-unit limit above 400000 or a compute-unit price above 5000000 microlamports.", + "section": "Top-level instruction layout" + }, + "tier": "offline" + }, + { + "bugType": "auth-bypass", + "description": "SetComputeUnitPrice 5001 with no SetComputeUnitLimit: the runtime budgets 200000 units for each of the open and the memo, so the sponsor would pay 2001 lamports, one over its cap (RULINGS S6). A verifier that bounds only declared limits accepts it: rejected as compute-price-over-cap. Pair: x402-upto-verify-implicit-limit-at-fee-cap-accept. Verify is the read-only preflight of the deposit settle (Phase 3): every static check before co-signing, at the vector's clock (nowSeconds).", + "expect": { + "outcome": "reject", + "rejectCode": "compute-price-over-cap" + }, + "id": "x402-upto-verify-implicit-limit-priority-fee-over-cap-reject", + "input": { + "nowSeconds": 1800000000, + "rpcFixtures": { + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "11111111111111111111111111111111", + "slot": 400000000 + }, + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiN3Y1NE5XZEJ0a2p1QUZKckxHc1MyU1hudWs4bkthbTgxbVpKZWVZeFZGaTkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInJlY2VudEJsb2NraGFzaCI6IjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIiwicmVjZW50U2xvdCI6IjQwMDAwMDAwMCIsInRva2VuUHJvZ3JhbSI6IlRva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEiLCJ3aXRoZHJhd0RlbGF5Ijo5MDB9LCJtYXhUaW1lb3V0U2Vjb25kcyI6MzAwLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwicGF5VG8iOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInNjaGVtZSI6InVwdG8ifSwicGF5bG9hZCI6eyJhdXRob3JpemVkU2lnbmVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJjaGFubmVsSWQiOiIzR210QTdUQ3Axclo1ZkNZbXc2aUcySHFCQlhtTE1ETkdDYVhnU1VhYkJiMyIsImRlcG9zaXQiOiIxMDAwMDAwIiwiZXhwaXJlc0F0IjoxODAwMDAwMzAwLCJmcm9tIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJtYXhBbW91bnQiOiIxMDAwMDAwIiwibm9uY2UiOiI0MjQyIiwib3BlblNsb3QiOiI0MDAwMDAwMDAiLCJvcGVuVHJhbnNhY3Rpb24iOiJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDNTArWXhxVEJrdlhuNEh2a3hEL2poUEt1aDNQNzB2d1lSeXpHS3BCK2IzUSt6Z2ZEREQ4cVlieXFMR1AvSGI5b2JIdU5CZ2dVTVEwYnIyT2VUK3NBZ0FJQUNnOW12bjR6TEhwRk16SzluUXAvZmJCVjljWHZHZ2F0cG0yWXM1KzJnUXhIT3VwS2JHUGluRklLdnZWUWV4TXV4Zm1WUjNhdXZyNTdra0llNm1rVVJ0SXNJY0hWa1Z4RG1Xa1lpN1NMM0c2NGVwZEtacTV4TklCdVF6MlZLUjZJdlI1cmhQNVVCWm1RcHVvakNOeGxpRld0bFlwbEhoUlhKaVAzK3RPVDI3QVQ3TnMxOXgrZmNhMzdibTVvNC9oazRYRHVZLzhPeHluTGNYb3l1ZWExam52ekFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQmtadjVTRVhNdi9zcmJweXc1dm52SXpsdThYM0Vtc3NRNXM2UUFBQUFBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnFmVkZ4a3NYRkVoak1sTVBVcnhmMWphN2dpYm9mMUU0OXZaaWdBQUFBQUczZmJoMTJXaGs5bkw0VWJPNjNtc0hMU0Y3VjliTjVFNmpQV0ZmdjhBcVR0RUxMT1JJVmZ4T3BNOUFUUW9MUU1yWC83TkFhTGI4YmQ1QmdqZkFDNm5XbFFOZTJzZUt5dTFGMUlaeWFQd1lCQ1NRY3FNVHhjTXdjb3RTTzdxK2RDTWx5V1BUaVNKOGJzOUVDa1VqZzJEQzFvVG1kci9FSVFFam52WTIrbjRXWkdpaWd0ME9CV1RwTmxHbFhrZ2lTYXZ5SzJDeUlPYmRrUTFtNTY2bWtzNnA2SDdwT3NyQ1FtVDk5TGYxaXVKNHJoeUIzcGpuOWZYUjZqcG4yUFVGYTRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUdBQWtEaVJNQUFBQUFBQUFPRGdFQUFBb05BZ01FQ1FVSURBc09Rd0dTRUFBQUFBQUFBRUJDRHdBQUFBQUFoQU1BQUFDRTF4Y0FBQUFBQVFBQUFLdE9Lek1lUzA4NkZVSzY0UGxWM1YwekEwbkhUcUhIQ3BJRjdBWlZDU0l6RUNjSEFDQTFaak5qT1dFeFpUZGlNbVEwWXpabE9HWXdZVEZpTW1NelpEUmxOV1kyTUFBPSIsInZhbGlkQWZ0ZXIiOjE4MDAwMDAwMDB9LCJ4NDAyVmVyc2lvbiI6Mn0=", + "x402ServerAmount": "1000000", + "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "x402ServerFeePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", + "x402ServerFeePayerSecretKey": [ + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 102, + 190, + 126, + 51, + 44, + 122, + 69, + 51, + 50, + 189, + 157, + 10, + 127, + 125, + 176, + 85, + 245, + 197, + 239, + 26, + 6, + 173, + 166, + 109, + 152, + 179, + 159, + 182, + 129, + 12, + 71, + 58 + ], + "x402ServerMaxChannelLifetimeSeconds": 3600, + "x402ServerMaxTimeoutSeconds": 300, + "x402ServerNetwork": "devnet", + "x402ServerReceiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "x402ServerReceiverAuthorizerSecretKey": [ + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 145, + 162, + 138, + 11, + 116, + 56, + 21, + 147, + 164, + 217, + 70, + 149, + 121, + 32, + 137, + 38, + 175, + 200, + 173, + 130, + 200, + 131, + 155, + 118, + 68, + 53, + 155, + 158, + 186, + 154, + 75, + 58 + ], + "x402ServerRecipient": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "x402ServerTokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "x402ServerWithdrawDelay": 900 + }, + "intent": "x402-upto", + "mode": "verify-transaction", + "provenance": "generated", + "requirements": [ + "X402-233dcf8a3e", + "X402-3b5914a7c5" + ], + "role": "server", + "spec": { + "doc": "x402/specs/schemes/upto/scheme_upto_svm.md", + "quote": "A sponsor MAY apply a stricter local policy for compute-unit limit, compute-unit price, and required-signature count (operator-configurable caps), but MUST NOT admit a compute-unit limit above 400000 or a compute-unit price above 5000000 microlamports.", + "section": "Top-level instruction layout" + }, + "tier": "offline" + }, { "bugType": "auth-bypass", "description": "ComputeBudget prefix replaced (2 instructions): rejected as compute-limit-over-cap. Verify is the read-only preflight of the deposit settle (Phase 3): every static check before co-signing, at the vector's clock (nowSeconds).", diff --git a/harness/vectors/x402-upto-txv1.json b/harness/vectors/x402-upto-txv1.json index 437c03517..df96311cc 100644 --- a/harness/vectors/x402-upto-txv1.json +++ b/harness/vectors/x402-upto-txv1.json @@ -1405,7 +1405,7 @@ }, { "bugType": "auth-bypass", - "description": "A version-1 open at 200000 units with priorityFee 1000001 lamports (priorityFee * 1000000 > 5000000 * computeUnitLimit): rejected as compute-price-over-cap. Verify is the read-only preflight of the deposit settle (Phase 3): every static check before co-signing, at the vector's clock (nowSeconds).", + "description": "A version-1 open at 300 units with priorityFee 1501 lamports (priorityFee * 1000000 > 5000000 * computeUnitLimit), still under the 2000 lamport cap on the total fee, so only the per-unit rule rejects it: rejected as compute-price-over-cap. Verify is the read-only preflight of the deposit settle (Phase 3): every static check before co-signing, at the vector's clock (nowSeconds).", "expect": { "outcome": "reject", "rejectCode": "compute-price-over-cap" @@ -1423,7 +1423,7 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 400000000 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiN3Y1NE5XZEJ0a2p1QUZKckxHc1MyU1hudWs4bkthbTgxbVpKZWVZeFZGaTkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInJlY2VudEJsb2NraGFzaCI6IjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIiwicmVjZW50U2xvdCI6IjQwMDAwMDAwMCIsInRva2VuUHJvZ3JhbSI6IlRva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEiLCJ0cmFuc2FjdGlvblZlcnNpb25zIjpbMCwxXSwid2l0aGRyYXdEZWxheSI6OTAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJ1cHRvIn0sInBheWxvYWQiOnsiYXV0aG9yaXplZFNpZ25lciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwiY2hhbm5lbElkIjoiM0dtdEE3VENwMXJaNWZDWW13NmlHMkhxQkJYbUxNRE5HQ2FYZ1NVYWJCYjMiLCJkZXBvc2l0IjoiMTAwMDAwMCIsImV4cGlyZXNBdCI6MTgwMDAwMDMwMCwiZnJvbSI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwibWF4QW1vdW50IjoiMTAwMDAwMCIsIm5vbmNlIjoiNDI0MiIsIm9wZW5TbG90IjoiNDAwMDAwMDAwIiwib3BlblRyYW5zYWN0aW9uIjoiZ1FJQUNROEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSU9acjUrTXl4NlJUTXl2WjBLZjMyd1ZmWEY3eG9HcmFadG1MT2Z0b0VNUnpycVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQ0hCMVpGY1E1bHBHSXUwaTl4dXVIcVhTbWF1Y1RTQWJrTTlsU2tlaUwwZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3piTmZjZm4zR3QrMjV1YU9QNFpPRnc3bVAvRHNjcHkzRjZNcm5tdFk1Nzh3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlVwVFdwa3BJUVpOSk9oeFlObzRmSHcxdGQyOGtydUI1QitvUUVFRlJJMEdwOVVYR1N4Y1VTR015VXc5U3ZGL1dOcnVDSnVoL1VUajI5bUtBQUFBQUFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFkYVZBMTdheDRySzdVWFVobkpvL0JnRUpKQnlveFBGd3pCeWkxSTd1cjUwSXlYSlk5T0pJbnh1ejBRS1JTT0RZTUxXaE9aMnY4UWhBU09lOWpiNmZoWmthS0tDM1E0RlpPazJVYVZlU0NKSnEvSXJZTElnNXQyUkRXYm5ycWFTenFub2Z1azZ5c0pDWlAzMHQvV0s0bml1SElIZW1PZjE5ZEhxT21mWTlRVnJrRkNEd0FBQUFBQVFBMERBQUFBQUFRTkRrTUFCZ0FnQUFFQUFBa01BZ01FQ0FVSEN3b05BWklRQUFBQUFBQUFRRUlQQUFBQUFBQ0VBd0FBQUlUWEZ3QUFBQUFCQUFBQXEwNHJNeDVMVHpvVlFycmcrVlhkWFRNRFNjZE9vY2NLa2dYc0JsVUpJak1RSnpWbU0yTTVZVEZsTjJJeVpEUmpObVU0WmpCaE1XSXlZek5rTkdVMVpqWXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSjRUMDQySmRLRHBoNW9VYlp6QmNUN1RCNXA0WVY4TVBvZFdLRktaQk5nN29WVEFxSzlmWFNDNjdrUGpSeVdmVjhFOFdWSXJYU0R5U2MyRnlGYzB6UTA9IiwidmFsaWRBZnRlciI6MTgwMDAwMDAwMH0sIng0MDJWZXJzaW9uIjoyfQ==", + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiN3Y1NE5XZEJ0a2p1QUZKckxHc1MyU1hudWs4bkthbTgxbVpKZWVZeFZGaTkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInJlY2VudEJsb2NraGFzaCI6IjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIiwicmVjZW50U2xvdCI6IjQwMDAwMDAwMCIsInRva2VuUHJvZ3JhbSI6IlRva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEiLCJ0cmFuc2FjdGlvblZlcnNpb25zIjpbMCwxXSwid2l0aGRyYXdEZWxheSI6OTAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJ1cHRvIn0sInBheWxvYWQiOnsiYXV0aG9yaXplZFNpZ25lciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwiY2hhbm5lbElkIjoiM0dtdEE3VENwMXJaNWZDWW13NmlHMkhxQkJYbUxNRE5HQ2FYZ1NVYWJCYjMiLCJkZXBvc2l0IjoiMTAwMDAwMCIsImV4cGlyZXNBdCI6MTgwMDAwMDMwMCwiZnJvbSI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwibWF4QW1vdW50IjoiMTAwMDAwMCIsIm5vbmNlIjoiNDI0MiIsIm9wZW5TbG90IjoiNDAwMDAwMDAwIiwib3BlblRyYW5zYWN0aW9uIjoiZ1FJQUNROEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSU9acjUrTXl4NlJUTXl2WjBLZjMyd1ZmWEY3eG9HcmFadG1MT2Z0b0VNUnpycVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQ0hCMVpGY1E1bHBHSXUwaTl4dXVIcVhTbWF1Y1RTQWJrTTlsU2tlaUwwZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3piTmZjZm4zR3QrMjV1YU9QNFpPRnc3bVAvRHNjcHkzRjZNcm5tdFk1Nzh3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlVwVFdwa3BJUVpOSk9oeFlObzRmSHcxdGQyOGtydUI1QitvUUVFRlJJMEdwOVVYR1N4Y1VTR015VXc5U3ZGL1dOcnVDSnVoL1VUajI5bUtBQUFBQUFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFkYVZBMTdheDRySzdVWFVobkpvL0JnRUpKQnlveFBGd3pCeWkxSTd1cjUwSXlYSlk5T0pJbnh1ejBRS1JTT0RZTUxXaE9aMnY4UWhBU09lOWpiNmZoWmthS0tDM1E0RlpPazJVYVZlU0NKSnEvSXJZTElnNXQyUkRXYm5ycWFTenFub2Z1azZ5c0pDWlAzMHQvV0s0bml1SElIZW1PZjE5ZEhxT21mWTlRVnJ0MEZBQUFBQUFBQUxBRUFBQUFBQUFRTkRrTUFCZ0FnQUFFQUFBa01BZ01FQ0FVSEN3b05BWklRQUFBQUFBQUFRRUlQQUFBQUFBQ0VBd0FBQUlUWEZ3QUFBQUFCQUFBQXEwNHJNeDVMVHpvVlFycmcrVlhkWFRNRFNjZE9vY2NLa2dYc0JsVUpJak1RSnpWbU0yTTVZVEZsTjJJeVpEUmpObVU0WmpCaE1XSXlZek5rTkdVMVpqWXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTGdEdnR1U0lmYm0yRHN1OWZIN01pMStJV3ZPUHFnNVRLQUdrU1Q5M2VGYWU1SWZ5dzlXR0ZtekJ5RFVFUDBzaXh4SWJnQitBM0luN3hZVE9UbUZLUWc9IiwidmFsaWRBZnRlciI6MTgwMDAwMDAwMH0sIng0MDJWZXJzaW9uIjoyfQ==", "x402ServerAmount": "1000000", "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "x402ServerFeePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", @@ -1587,7 +1587,7 @@ }, { "bugType": "auth-bypass", - "description": "A version-1 open at 200000 units with priorityFee 1000000 lamports: exactly 5000000 micro-lamports per unit, accepted. Verify is the read-only preflight of the deposit settle (Phase 3): every static check before co-signing, at the vector's clock (nowSeconds).", + "description": "A version-1 open at 300 units with priorityFee 1500 lamports: exactly 5000000 micro-lamports per unit and under the 2000 lamport cap a sponsor puts on the total fee (RULINGS S6), accepted. Verify is the read-only preflight of the deposit settle (Phase 3): every static check before co-signing, at the vector's clock (nowSeconds).", "expect": { "outcome": "accept" }, @@ -1604,7 +1604,189 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 400000000 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiN3Y1NE5XZEJ0a2p1QUZKckxHc1MyU1hudWs4bkthbTgxbVpKZWVZeFZGaTkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInJlY2VudEJsb2NraGFzaCI6IjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIiwicmVjZW50U2xvdCI6IjQwMDAwMDAwMCIsInRva2VuUHJvZ3JhbSI6IlRva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEiLCJ0cmFuc2FjdGlvblZlcnNpb25zIjpbMCwxXSwid2l0aGRyYXdEZWxheSI6OTAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJ1cHRvIn0sInBheWxvYWQiOnsiYXV0aG9yaXplZFNpZ25lciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwiY2hhbm5lbElkIjoiM0dtdEE3VENwMXJaNWZDWW13NmlHMkhxQkJYbUxNRE5HQ2FYZ1NVYWJCYjMiLCJkZXBvc2l0IjoiMTAwMDAwMCIsImV4cGlyZXNBdCI6MTgwMDAwMDMwMCwiZnJvbSI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwibWF4QW1vdW50IjoiMTAwMDAwMCIsIm5vbmNlIjoiNDI0MiIsIm9wZW5TbG90IjoiNDAwMDAwMDAwIiwib3BlblRyYW5zYWN0aW9uIjoiZ1FJQUNROEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSU9acjUrTXl4NlJUTXl2WjBLZjMyd1ZmWEY3eG9HcmFadG1MT2Z0b0VNUnpycVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQ0hCMVpGY1E1bHBHSXUwaTl4dXVIcVhTbWF1Y1RTQWJrTTlsU2tlaUwwZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3piTmZjZm4zR3QrMjV1YU9QNFpPRnc3bVAvRHNjcHkzRjZNcm5tdFk1Nzh3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlVwVFdwa3BJUVpOSk9oeFlObzRmSHcxdGQyOGtydUI1QitvUUVFRlJJMEdwOVVYR1N4Y1VTR015VXc5U3ZGL1dOcnVDSnVoL1VUajI5bUtBQUFBQUFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFkYVZBMTdheDRySzdVWFVobkpvL0JnRUpKQnlveFBGd3pCeWkxSTd1cjUwSXlYSlk5T0pJbnh1ejBRS1JTT0RZTUxXaE9aMnY4UWhBU09lOWpiNmZoWmthS0tDM1E0RlpPazJVYVZlU0NKSnEvSXJZTElnNXQyUkRXYm5ycWFTenFub2Z1azZ5c0pDWlAzMHQvV0s0bml1SElIZW1PZjE5ZEhxT21mWTlRVnJrQkNEd0FBQUFBQVFBMERBQUFBQUFRTkRrTUFCZ0FnQUFFQUFBa01BZ01FQ0FVSEN3b05BWklRQUFBQUFBQUFRRUlQQUFBQUFBQ0VBd0FBQUlUWEZ3QUFBQUFCQUFBQXEwNHJNeDVMVHpvVlFycmcrVlhkWFRNRFNjZE9vY2NLa2dYc0JsVUpJak1RSnpWbU0yTTVZVEZsTjJJeVpEUmpObVU0WmpCaE1XSXlZek5rTkdVMVpqWXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBS3hiRmNxdUxsSlNQVmMxSWNkN2tHVDA1K2d3MFAzZlhMTjZMVWZ2QnBteTVhZ0kvWHgvVEZUWGlRQkM3YXlQSDVkdUQxOEhocjFjRzVvdGovckM0d009IiwidmFsaWRBZnRlciI6MTgwMDAwMDAwMH0sIng0MDJWZXJzaW9uIjoyfQ==", + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiN3Y1NE5XZEJ0a2p1QUZKckxHc1MyU1hudWs4bkthbTgxbVpKZWVZeFZGaTkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInJlY2VudEJsb2NraGFzaCI6IjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIiwicmVjZW50U2xvdCI6IjQwMDAwMDAwMCIsInRva2VuUHJvZ3JhbSI6IlRva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEiLCJ0cmFuc2FjdGlvblZlcnNpb25zIjpbMCwxXSwid2l0aGRyYXdEZWxheSI6OTAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJ1cHRvIn0sInBheWxvYWQiOnsiYXV0aG9yaXplZFNpZ25lciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwiY2hhbm5lbElkIjoiM0dtdEE3VENwMXJaNWZDWW13NmlHMkhxQkJYbUxNRE5HQ2FYZ1NVYWJCYjMiLCJkZXBvc2l0IjoiMTAwMDAwMCIsImV4cGlyZXNBdCI6MTgwMDAwMDMwMCwiZnJvbSI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwibWF4QW1vdW50IjoiMTAwMDAwMCIsIm5vbmNlIjoiNDI0MiIsIm9wZW5TbG90IjoiNDAwMDAwMDAwIiwib3BlblRyYW5zYWN0aW9uIjoiZ1FJQUNROEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSU9acjUrTXl4NlJUTXl2WjBLZjMyd1ZmWEY3eG9HcmFadG1MT2Z0b0VNUnpycVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQ0hCMVpGY1E1bHBHSXUwaTl4dXVIcVhTbWF1Y1RTQWJrTTlsU2tlaUwwZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3piTmZjZm4zR3QrMjV1YU9QNFpPRnc3bVAvRHNjcHkzRjZNcm5tdFk1Nzh3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlVwVFdwa3BJUVpOSk9oeFlObzRmSHcxdGQyOGtydUI1QitvUUVFRlJJMEdwOVVYR1N4Y1VTR015VXc5U3ZGL1dOcnVDSnVoL1VUajI5bUtBQUFBQUFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFkYVZBMTdheDRySzdVWFVobkpvL0JnRUpKQnlveFBGd3pCeWkxSTd1cjUwSXlYSlk5T0pJbnh1ejBRS1JTT0RZTUxXaE9aMnY4UWhBU09lOWpiNmZoWmthS0tDM1E0RlpPazJVYVZlU0NKSnEvSXJZTElnNXQyUkRXYm5ycWFTenFub2Z1azZ5c0pDWlAzMHQvV0s0bml1SElIZW1PZjE5ZEhxT21mWTlRVnJ0d0ZBQUFBQUFBQUxBRUFBQUFBQUFRTkRrTUFCZ0FnQUFFQUFBa01BZ01FQ0FVSEN3b05BWklRQUFBQUFBQUFRRUlQQUFBQUFBQ0VBd0FBQUlUWEZ3QUFBQUFCQUFBQXEwNHJNeDVMVHpvVlFycmcrVlhkWFRNRFNjZE9vY2NLa2dYc0JsVUpJak1RSnpWbU0yTTVZVEZsTjJJeVpEUmpObVU0WmpCaE1XSXlZek5rTkdVMVpqWXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT2JRWDM3bzFNaUEvRTd0RGdzcjN2Z3pSczM1TVRDMXJuTktIVFNNN1ZRazhXTXE5dS9jc0hDV3pHNFZTd0Q2QWpVcHl2c3ZCSTVnRGlzVEZMKzdjZ289IiwidmFsaWRBZnRlciI6MTgwMDAwMDAwMH0sIng0MDJWZXJzaW9uIjoyfQ==", + "x402ServerAmount": "1000000", + "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "x402ServerFeePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", + "x402ServerFeePayerSecretKey": [ + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 102, + 190, + 126, + 51, + 44, + 122, + 69, + 51, + 50, + 189, + 157, + 10, + 127, + 125, + 176, + 85, + 245, + 197, + 239, + 26, + 6, + 173, + 166, + 109, + 152, + 179, + 159, + 182, + 129, + 12, + 71, + 58 + ], + "x402ServerMaxChannelLifetimeSeconds": 3600, + "x402ServerMaxTimeoutSeconds": 300, + "x402ServerNetwork": "devnet", + "x402ServerReceiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "x402ServerReceiverAuthorizerSecretKey": [ + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 145, + 162, + 138, + 11, + 116, + 56, + 21, + 147, + 164, + 217, + 70, + 149, + 121, + 32, + 137, + 38, + 175, + 200, + 173, + 130, + 200, + 131, + 155, + 118, + 68, + 53, + 155, + 158, + 186, + 154, + 75, + 58 + ], + "x402ServerRecipient": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "x402ServerTokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "x402ServerTransactionVersions": [ + 0, + 1 + ], + "x402ServerWithdrawDelay": 900 + }, + "intent": "x402-upto", + "mode": "verify-transaction", + "provenance": "generated", + "requirements": [ + "X402TX-0f874a9c63" + ], + "role": "server", + "spec": { + "doc": "x402-txv1/specs/schemes/upto/scheme_upto_svm.md", + "quote": "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed 400000, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= 5000000 computeUnitLimit.", + "section": "Top-level instruction layout" + }, + "tier": "offline" + }, + { + "bugType": "auth-bypass", + "description": "A version-1 open at 200000 units with priorityFee 2001 lamports: far under 5000000 micro-lamports per unit, but one lamport over the cap the sponsor puts on the total fee it pays (RULINGS S6): rejected as compute-price-over-cap. Verify is the read-only preflight of the deposit settle (Phase 3): every static check before co-signing, at the vector's clock (nowSeconds).", + "expect": { + "outcome": "reject", + "rejectCode": "compute-price-over-cap" + }, + "id": "x402-upto-verify-v1-priority-fee-over-sponsor-cap-reject", + "input": { + "nowSeconds": 1800000000, + "rpcFixtures": { + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "11111111111111111111111111111111", + "slot": 400000000 + }, + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiN3Y1NE5XZEJ0a2p1QUZKckxHc1MyU1hudWs4bkthbTgxbVpKZWVZeFZGaTkiLCJyZWNlaXZlckF1dGhvcml6ZXIiOiJBb1ZzR2FqOE1TSjZ4d0t4ZkZ4bzlpWldIM2VuQzhSUlRYS0gyZngyRjhvcyIsInJlY2VudEJsb2NraGFzaCI6IjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIiwicmVjZW50U2xvdCI6IjQwMDAwMDAwMCIsInRva2VuUHJvZ3JhbSI6IlRva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEiLCJ0cmFuc2FjdGlvblZlcnNpb25zIjpbMCwxXSwid2l0aGRyYXdEZWxheSI6OTAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJ1cHRvIn0sInBheWxvYWQiOnsiYXV0aG9yaXplZFNpZ25lciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwiY2hhbm5lbElkIjoiM0dtdEE3VENwMXJaNWZDWW13NmlHMkhxQkJYbUxNRE5HQ2FYZ1NVYWJCYjMiLCJkZXBvc2l0IjoiMTAwMDAwMCIsImV4cGlyZXNBdCI6MTgwMDAwMDMwMCwiZnJvbSI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwibWF4QW1vdW50IjoiMTAwMDAwMCIsIm5vbmNlIjoiNDI0MiIsIm9wZW5TbG90IjoiNDAwMDAwMDAwIiwib3BlblRyYW5zYWN0aW9uIjoiZ1FJQUNROEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSU9acjUrTXl4NlJUTXl2WjBLZjMyd1ZmWEY3eG9HcmFadG1MT2Z0b0VNUnpycVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQ0hCMVpGY1E1bHBHSXUwaTl4dXVIcVhTbWF1Y1RTQWJrTTlsU2tlaUwwZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3piTmZjZm4zR3QrMjV1YU9QNFpPRnc3bVAvRHNjcHkzRjZNcm5tdFk1Nzh3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlVwVFdwa3BJUVpOSk9oeFlObzRmSHcxdGQyOGtydUI1QitvUUVFRlJJMEdwOVVYR1N4Y1VTR015VXc5U3ZGL1dOcnVDSnVoL1VUajI5bUtBQUFBQUFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFkYVZBMTdheDRySzdVWFVobkpvL0JnRUpKQnlveFBGd3pCeWkxSTd1cjUwSXlYSlk5T0pJbnh1ejBRS1JTT0RZTUxXaE9aMnY4UWhBU09lOWpiNmZoWmthS0tDM1E0RlpPazJVYVZlU0NKSnEvSXJZTElnNXQyUkRXYm5ycWFTenFub2Z1azZ5c0pDWlAzMHQvV0s0bml1SElIZW1PZjE5ZEhxT21mWTlRVnJ0RUhBQUFBQUFBQVFBMERBQUFBQUFRTkRrTUFCZ0FnQUFFQUFBa01BZ01FQ0FVSEN3b05BWklRQUFBQUFBQUFRRUlQQUFBQUFBQ0VBd0FBQUlUWEZ3QUFBQUFCQUFBQXEwNHJNeDVMVHpvVlFycmcrVlhkWFRNRFNjZE9vY2NLa2dYc0JsVUpJak1RSnpWbU0yTTVZVEZsTjJJeVpEUmpObVU0WmpCaE1XSXlZek5rTkdVMVpqWXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSEt1ZlVyOU1hMW9KSFc1ODgzbVdkUjN3MjVkNDh1elVQZVhQd3NXaE1UdTJQTzZzTjM0bHFZUElkWlJmYXNwY0RvK2hBeG5lM3phSUZVYUFnR1k5QTg9IiwidmFsaWRBZnRlciI6MTgwMDAwMDAwMH0sIng0MDJWZXJzaW9uIjoyfQ==", "x402ServerAmount": "1000000", "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "x402ServerFeePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", diff --git a/rust/README.md b/rust/README.md index 6d20ab8c6..750adcc3f 100644 --- a/rust/README.md +++ b/rust/README.md @@ -250,14 +250,26 @@ and client — plus SIWX. after the handler runs, so it needs a `fee_payer_signer` (the fee payer signs the settlement as the channel's zero-share payee, and doubles as receiver authorizer — the voucher signer — by default) and is gated with `paid_upto_get` -/ `paid_upto_post` rather than `paid_get` / `paid_post`. +/ `paid_upto_post` rather than `paid_get` / `paid_post`. The recipient's token +account for each offered currency must already exist: opens are refused until +it does, and settlement never creates it at the fee payer's expense. The `upto` gate reads the meter only once the response body is complete, so it buffers the whole body before answering: a streaming handler reaches the client in one piece at the end. Bodies over 16 MiB, or bodies that fail mid-stream, are not delivered; the request settles at what was metered so far and answers 502. If settlement is still being retried in the background when the body is ready, -the response is served without a `PAYMENT-RESPONSE` header. +the response is served without a `PAYMENT-RESPONSE` header. A request dropped +after its channel opened (a client disconnect, a timeout layer) still settles +what was metered. A settlement that lands within the program's open-slot +window (1,500 slots) leaves the channel account `Distributed`, holding the +fee payer's rent until a permissionless `reclaim`; the `upto` server does not +run one. When the payer's token account can no longer take its refund (closed +or frozen since the open), settlement only seals the channel: `distribute` +would send that refund to the protocol treasury. Run `distribute_sealed` +periodically; it finds those channels on chain and distributes each once the +account is usable again, or once `withdraw_delay` has passed since the open, +when the refund goes to the treasury and the seller is paid. `batch-settlement` is for high-throughput APIs: the client opens one channel and signs a cumulative voucher per request, which the gate (`paid_batch_get` / @@ -270,7 +282,11 @@ operator and caps its total channel escrow; the bundled server currently offers client-signed vouchers. When a payer force-closes a channel, `finalize_close` applies the server's latest voucher with `settle_and_seal` during the grace period rather than forfeiting it, then finalizes -permissionlessly once the grace period has run out. +permissionlessly once the grace period has run out. A channel whose payer refund +account cannot take its refund is sealed without its `distribute`; later +`finalize_close` passes distribute it once the account is usable, or once the +channel has been sealed for its grace period, when the refund goes to the +treasury. ## Client diff --git a/rust/crates/conformance/src/cases/session_server.rs b/rust/crates/conformance/src/cases/session_server.rs index f846a484e..b7754912c 100644 --- a/rust/crates/conformance/src/cases/session_server.rs +++ b/rust/crates/conformance/src/cases/session_server.rs @@ -562,6 +562,7 @@ fn build_recipe(server: Server) -> BuildRecipe { server, authorized: Authorized::SessionKey, edits: vec![], + client_blockhash: None, } } @@ -1757,6 +1758,17 @@ crate::registry! { build_edit(Edit::Remove("/methodDetails/recentBlockhash")), invalid_challenge(), ).build(); + session_build_foreign_blockhash_reject => build_case( + "session-build-foreign-blockhash-reject", + s("Method Details", "The server MUST obtain it from the selected network, and the client MUST use it as the transaction message's recent blockhash."), + &[R_BLOCKHASH_USE], + "The challenged recentBlockhash is not a live blockhash on the client's cluster (its RPC's latest is another), so it is not from the selected network: an open signed over it would be valid on another cluster. The client refuses before signing. Pair: session-build-open-client-paid.", + BuildRecipe { + client_blockhash: Some(crate::realize::session::OTHER_BLOCKHASH), + ..build_recipe(server()) + }, + invalid_challenge(), + ).build(); session_build_missing_recent_slot_reject => build_case( "session-build-missing-recent-slot-reject", s("Method Details", "Conditionally REQUIRED when channelId is absent and MUST be absent when resuming an existing channel."), diff --git a/rust/crates/conformance/src/cases/x402_batch.rs b/rust/crates/conformance/src/cases/x402_batch.rs index 991526798..6d9c70715 100644 --- a/rust/crates/conformance/src/cases/x402_batch.rs +++ b/rust/crates/conformance/src/cases/x402_batch.rs @@ -456,6 +456,10 @@ fn policy_case( /// An `open` deposit: no stored record, no channel onchain yet. fn open_input(transaction: String) -> Value { + open_input_with(transaction, Atas::Healthy) +} + +fn open_input_with(transaction: String, atas: Atas) -> Value { let config = cfg(); let payload = json!({ "type": "deposit", @@ -468,7 +472,7 @@ fn open_input(transaction: String) -> Value { &requirements(), &payload, None, - fx::rpc_fixtures(None, Atas::Healthy, TOKEN_PROGRAM), + fx::rpc_fixtures(None, atas, TOKEN_PROGRAM), ) } @@ -1427,6 +1431,12 @@ crate::registry! { voucher_input(&with(cfg(), "receiver", json!(keys::X402_OTHER_PAY_TO)), honest_voucher(4_000), 3_000, 10_000, ChannelAccount::default()), rej(RejectCode::ChannelState), ).requirements(&[RECEIVER_IS_PAY_TO]).build(); + batch_verify_voucher_receiver_quotes_a_code_reject => voucher_case( + "batch-verify-voucher-receiver-quotes-a-code-reject", bindings_spec(), BugType::AuthBypass, + "channelConfig.receiver is the text invalid_batch_settlement_svm_cumulative_amount_mismatch rather than payTo. The failure is the receiver binding (channel-state), whatever code the client's own text names: a verifier that classifies its error by searching the message reports a cumulative mismatch, and answers it with the corrective 402 carrying the channel's latest voucher.", + voucher_input(&with(cfg(), "receiver", json!("invalid_batch_settlement_svm_cumulative_amount_mismatch")), honest_voucher(4_000), 3_000, 10_000, ChannelAccount::default()), + rej(RejectCode::ChannelState), + ).requirements(&[RECEIVER_IS_PAY_TO]).build(); batch_verify_voucher_token_not_asset_reject => voucher_case( "batch-verify-voucher-token-not-asset-reject", bindings_spec(), BugType::AuthBypass, "channelConfig.token is another mint than the asset (voucher signed for that config's PDA).", @@ -1509,10 +1519,22 @@ crate::registry! { ); batch_verify_top_up_compute_budget_prefix => policy_case( "batch-verify-top-up-compute-budget-prefix", policy_spec("If both are present, the limit MUST precede the price."), &[LAYOUT, LIMIT_BEFORE_PRICE, CB_LIMIT, CB_PRICE], - "Paired accept: SetComputeUnitLimit 400000 then SetComputeUnitPrice 5000000 (both at the cap) before the top_up.", - top_up_tx(vec![fx::compute_ix(&fx::unit_limit(400_000)), fx::compute_ix(&fx::unit_price(5_000_000))], TOP_UP_AMOUNT_ADDED, memo()), + "Paired accept: SetComputeUnitLimit 400000 (at the cap) then SetComputeUnitPrice 5000 before the top_up, a 2000 lamport priority fee: exactly the sponsor's cap on the fee it pays (RULINGS S6).", + top_up_tx(vec![fx::compute_ix(&fx::unit_limit(400_000)), fx::compute_ix(&fx::unit_price(5_000))], TOP_UP_AMOUNT_ADDED, memo()), Expect::Accept(Pin::Outcome), ); + batch_verify_top_up_priority_fee_over_cap_reject => policy_case( + "batch-verify-top-up-priority-fee-over-cap-reject", policy_spec("A sponsor MAY apply stricter local compute-unit, priority-fee, or required-signature caps, but MUST NOT relax the absolute maxima above."), &[CB_LIMIT, CB_PRICE], + "SetComputeUnitLimit 400000 and SetComputeUnitPrice 5000000, each at its own cap: the sponsor would pay a 2000000 lamport priority fee, so it bounds the fee as limit times price (RULINGS S6). Pair: batch-verify-top-up-compute-budget-prefix.", + top_up_tx(vec![fx::compute_ix(&fx::unit_limit(400_000)), fx::compute_ix(&fx::unit_price(5_000_000))], TOP_UP_AMOUNT_ADDED, memo()), + rej(RejectCode::SetupTransaction), + ); + batch_verify_top_up_implicit_limit_priority_fee_over_cap_reject => policy_case( + "batch-verify-top-up-implicit-limit-priority-fee-over-cap-reject", policy_spec("A sponsor MAY apply stricter local compute-unit, priority-fee, or required-signature caps, but MUST NOT relax the absolute maxima above."), &[CB_PRICE], + "SetComputeUnitPrice 5001 with no SetComputeUnitLimit: the runtime budgets 200000 units for each of the top_up and the memo, so the sponsor would pay 2001 lamports, one over its cap (RULINGS S6). A verifier that bounds only declared limits accepts it.", + top_up_tx(vec![fx::compute_ix(&fx::unit_price(5_001))], TOP_UP_AMOUNT_ADDED, memo()), + rej(RejectCode::SetupTransaction), + ); batch_verify_top_up_three_lighthouse => policy_case( "batch-verify-top-up-three-lighthouse", policy_spec("and at most three Lighthouse instructions"), &[LAYOUT, ALLOWLIST], "Paired accept: the memo followed by three Lighthouse assertions in the suffix.", @@ -1679,6 +1701,13 @@ crate::registry! { top_up_input_with(&route(), top_up_tx(vec![], TOP_UP_AMOUNT_ADDED, memo()), "6000", 4_000, Atas::FrozenPayer, TOKEN_PROGRAM), rej(RejectCode::SettlementSimulation), ).requirements(&[SETTLEMENT_ACCOUNTS, "X402-fbdea947ae"]).authored(None).build(); + batch_verify_top_up_unfunded_payer_reject => case( + "batch-verify-top-up-unfunded-payer-reject", "batch-verify-setup-policy.json", Mode::VerifyTransaction, Role::Server, BugType::Settlement, + s("Canonical top_up", "It MUST confirm the payer has sufficient tokens."), + "The accept top-up, but the payer's token account holds 1 base unit against the 6000 top-up. The deposit is broadcast only after the handler runs, so a verifier that skips the balance serves the request and only then finds the deposit cannot land.", + top_up_input_with(&route(), top_up_tx(vec![], TOP_UP_AMOUNT_ADDED, memo()), "6000", 4_000, Atas::UnfundedPayer, TOKEN_PROGRAM), + rej(RejectCode::SettlementSimulation), + ).requirements(&["X402-014270dc81"]).build(); // ── server verify: open ── batch_verify_open_accept => open_case( @@ -1687,6 +1716,13 @@ crate::registry! { open_tx(honest_open(), open_suffix()), Expect::AcceptAuthored(json!({})), ).authored(None).build(); + batch_verify_open_unfunded_payer_reject => case( + "batch-verify-open-unfunded-payer-reject", "batch-verify-open.json", Mode::VerifyTransaction, Role::Server, BugType::Settlement, + s("Canonical open", "It MUST confirm the payer has sufficient tokens for the deposit and the sponsor has sufficient SOL for the transaction fee plus the channel PDA and escrow ATA rent."), + "The accept open, but the payer's token account holds 1 base unit against the 10000 deposit. The deposit is broadcast only after the handler runs, so a verifier that skips the balance serves the request and only then finds the open cannot land. Pair: batch-verify-open-accept.", + open_input_with(open_tx(honest_open(), open_suffix()), Atas::UnfundedPayer), + rej(RejectCode::SettlementSimulation), + ).requirements(&["X402-0ff4cabcb4"]).build(); batch_verify_open_missing_binding_memo_reject => open_case( "batch-verify-open-missing-binding-memo-reject", s("Top-level instruction layout", "An `open` suffix also carries exactly one binding Memo from section 3."), &[MEMO_EXACT, BINDING_KEY], "The open carries only the seller memo: without the binding memo the channel is bound to no receiver authorizer.", @@ -1886,16 +1922,22 @@ crate::registry! { ).build(); batch_txv1_top_up_v1_priority_fee_over_cap_reject => txv1_case( "batch-txv1-top-up-v1-priority-fee-over-cap-reject", t("Top-level instruction layout", "`priorityFee * 1000000 <= 5000000 * computeUnitLimit`"), &[TX_V1_CAPS], - "priorityFee 1000001 lamports at computeUnitLimit 200000: 1000001 × 10^6 > 5000000 × 200000 (one lamport over the cap).", - v1_input(&v1_route(), v1_top_up(fx::v1_budget().with_priority_fee(1_000_001), vec![])), + "priorityFee 1501 lamports at computeUnitLimit 300: 1501 × 10^6 > 5000000 × 300 (one lamport over the cap), and still under the sponsor's 2000 lamport cap on the total fee, so only the per-unit rule rejects it.", + v1_input(&v1_route(), v1_top_up(fx::v1_budget().with_compute_unit_limit(300).with_priority_fee(1_501), vec![])), rej(RejectCode::SetupTransaction), ).build(); batch_txv1_top_up_v1_priority_fee_at_cap => txv1_case( "batch-txv1-top-up-v1-priority-fee-at-cap", t("Top-level instruction layout", "`priorityFee * 1000000 <= 5000000 * computeUnitLimit`"), &[TX_V1_CAPS], - "Paired accept: priorityFee 1000000 lamports at computeUnitLimit 200000 is exactly the cap.", - v1_input(&v1_route(), v1_top_up(fx::v1_budget().with_priority_fee(1_000_000), vec![])), + "Paired accept: priorityFee 1500 lamports at computeUnitLimit 300 is exactly the per-unit cap, and under the sponsor's 2000 lamport cap on the total fee (RULINGS S6).", + v1_input(&v1_route(), v1_top_up(fx::v1_budget().with_compute_unit_limit(300).with_priority_fee(1_500), vec![])), Expect::Accept(Pin::Outcome), ).build(); + batch_txv1_top_up_v1_priority_fee_over_sponsor_cap_reject => txv1_case( + "batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject", t("Top-level instruction layout", "`priorityFee * 1000000 <= 5000000 * computeUnitLimit`"), &[TX_V1_CAPS], + "priorityFee 2001 lamports at computeUnitLimit 200000: far under the per-unit cap, but one lamport over the cap the sponsor puts on the total fee it pays (RULINGS S6).", + v1_input(&v1_route(), v1_top_up(fx::v1_budget().with_priority_fee(2_001), vec![])), + rej(RejectCode::SetupTransaction), + ).build(); batch_txv1_top_up_v0_over_1232_bytes_reject => txv1_case( "batch-txv1-top-up-v0-over-1232-bytes-reject", tx_versions_spec("A legacy or version-0 transaction MUST NOT exceed 1232 serialized bytes; a version-1 transaction MUST NOT exceed 4096 serialized bytes."), &[TX_SIZE], "A version-0 top_up whose three 330-byte Lighthouse assertions push it past 1232 serialized bytes.", diff --git a/rust/crates/conformance/src/cases/x402_upto.rs b/rust/crates/conformance/src/cases/x402_upto.rs index 07fa889da..d831368f4 100644 --- a/rust/crates/conformance/src/cases/x402_upto.rs +++ b/rust/crates/conformance/src/cases/x402_upto.rs @@ -535,8 +535,16 @@ crate::registry! { POLICY_FILE, spec(SVM, "Top-level instruction layout", "A sponsor MAY apply a stricter local policy for compute-unit limit, compute-unit price, and required-signature count (operator-configurable caps), but MUST NOT admit a compute-unit limit above 400000 or a compute-unit price above 5000000 microlamports."), &[CB_LIMIT, CB_PRICE, CB_ABSOLUTE], - "SetComputeUnitLimit 400000 and SetComputeUnitPrice 5000000 sit exactly at the absolute ceilings and are accepted.", - with(base(), Tamper::Prefix(vec![unit_limit_ix(400_000), unit_price_ix(5_000_000)])), + "SetComputeUnitLimit 400000 sits exactly at the absolute ceiling and SetComputeUnitPrice 5000 makes a 2000 lamport priority fee, exactly the sponsor's cap on the fee it pays (RULINGS S6): accepted.", + with(base(), Tamper::Prefix(vec![unit_limit_ix(400_000), unit_price_ix(5_000)])), + ); + x402_upto_verify_implicit_limit_at_fee_cap_accept => accept( + "x402-upto-verify-implicit-limit-at-fee-cap-accept", + POLICY_FILE, + spec(SVM, "Top-level instruction layout", "A sponsor MAY apply a stricter local policy for compute-unit limit, compute-unit price, and required-signature count (operator-configurable caps), but MUST NOT admit a compute-unit limit above 400000 or a compute-unit price above 5000000 microlamports."), + &[CB_PRICE, CB_ABSOLUTE, VERIFIER_POLICY], + "SetComputeUnitPrice 5000 with no SetComputeUnitLimit: the runtime budgets 200000 units for each of the open and the memo, a 2000 lamport priority fee, exactly the sponsor's cap (RULINGS S6): accepted. Pair: x402-upto-verify-implicit-limit-priority-fee-over-cap-reject.", + with(base(), Tamper::Prefix(vec![unit_price_ix(5_000)])), ); x402_upto_verify_two_memos_unbound_accept => accept_lenient( "x402-upto-verify-two-memos-unbound-accept", @@ -1104,6 +1112,28 @@ crate::registry! { RejectCode::ComputePriceOverCap, None, ); + x402_upto_verify_priority_fee_over_cap_reject => verify_case( + "x402-upto-verify-priority-fee-over-cap-reject", + POLICY_FILE, + spec(SVM, "Top-level instruction layout", "A sponsor MAY apply a stricter local policy for compute-unit limit, compute-unit price, and required-signature count (operator-configurable caps), but MUST NOT admit a compute-unit limit above 400000 or a compute-unit price above 5000000 microlamports."), + &[CB_LIMIT, CB_PRICE, VERIFIER_POLICY], + BugType::AuthBypass, + "SetComputeUnitLimit 400000 and SetComputeUnitPrice 5000000: each at its absolute ceiling, but the sponsor would pay a 2000000 lamport priority fee. The sponsor bounds the fee it pays as limit times price (RULINGS S6): rejected as compute-price-over-cap. Pair: x402-upto-verify-compute-at-caps-accept.", + with(base(), Tamper::Prefix(vec![unit_limit_ix(400_000), unit_price_ix(5_000_000)])), + Expect::Reject { code: RejectCode::ComputePriceOverCap, reason: None }, + None, + ); + x402_upto_verify_implicit_limit_priority_fee_over_cap_reject => verify_case( + "x402-upto-verify-implicit-limit-priority-fee-over-cap-reject", + POLICY_FILE, + spec(SVM, "Top-level instruction layout", "A sponsor MAY apply a stricter local policy for compute-unit limit, compute-unit price, and required-signature count (operator-configurable caps), but MUST NOT admit a compute-unit limit above 400000 or a compute-unit price above 5000000 microlamports."), + &[CB_PRICE, VERIFIER_POLICY], + BugType::AuthBypass, + "SetComputeUnitPrice 5001 with no SetComputeUnitLimit: the runtime budgets 200000 units for each of the open and the memo, so the sponsor would pay 2001 lamports, one over its cap (RULINGS S6). A verifier that bounds only declared limits accepts it: rejected as compute-price-over-cap. Pair: x402-upto-verify-implicit-limit-at-fee-cap-accept.", + with(base(), Tamper::Prefix(vec![unit_price_ix(5_001)])), + Expect::Reject { code: RejectCode::ComputePriceOverCap, reason: None }, + None, + ); x402_upto_verify_compute_limit_over_cap_reject => reject( "x402-upto-verify-compute-limit-over-cap-reject", POLICY_FILE, @@ -1542,6 +1572,20 @@ crate::registry! { Expect::AcceptAuthored(json!({"exactBytes": {"openMessageVersion": 0}})), None, ); + x402_upto_build_foreign_blockhash_reject => build_case( + "x402-upto-build-foreign-blockhash-reject", + BUILD_FILE, + spec(SVM, "Phase 1 - Setup", "The client builds an open transaction against the canonical payment-channels program, deposits maxAmount, sets payee and rent_payer to extra.feePayer, sets authorized_signer to extra.receiverAuthorizer, encodes grace_period = extra.withdrawDelay, and signs as channel payer."), + &[CLIENT_DERIVES], + "extra.recentBlockhash is not a live blockhash on the client's cluster (its RPC's latest is another). The blockhash alone binds the signed open to a cluster, so an open over it would escrow maxAmount on whichever cluster knows that hash rather than the offer's network: the client refuses the challenge before signing. Pair: x402-upto-build-accept.", + { + let mut input = build_input(Route::default().offer()); + input["rpcFixtures"]["recentBlockhash"] = json!(crate::realize::session::OTHER_BLOCKHASH); + input + }, + Expect::Reject { code: RejectCode::InvalidChallenge, reason: Some("recentBlockhash unknown to the client's cluster".into()) }, + None, + ); x402_upto_build_zero_withdraw_delay_reject => build_case( "x402-upto-build-zero-withdraw-delay-reject", BUILD_FILE, @@ -1682,8 +1726,8 @@ crate::registry! { s_txv1_budget(), &[TV_V1_CAPS], BugType::AuthBypass, - "A version-1 open at 200000 units with priorityFee 1000001 lamports (priorityFee * 1000000 > 5000000 * computeUnitLimit): rejected as compute-price-over-cap.", - with(VerifySpec::honest(v1_route()), Tamper::Form(Form::V1 { unit_limit: Some(200_000), priority_fee_lamports: Some(1_000_001), loaded_accounts_data_size_limit: Some(64 * 1024 * 1024) })), + "A version-1 open at 300 units with priorityFee 1501 lamports (priorityFee * 1000000 > 5000000 * computeUnitLimit), still under the 2000 lamport cap on the total fee, so only the per-unit rule rejects it: rejected as compute-price-over-cap.", + with(VerifySpec::honest(v1_route()), Tamper::Form(Form::V1 { unit_limit: Some(300), priority_fee_lamports: Some(1_501), loaded_accounts_data_size_limit: Some(64 * 1024 * 1024) })), Expect::Reject { code: RejectCode::ComputePriceOverCap, reason: None }, None, ); @@ -1692,8 +1736,19 @@ crate::registry! { TXV1_FILE, s_txv1_budget(), &[TV_V1_CAPS], - "A version-1 open at 200000 units with priorityFee 1000000 lamports: exactly 5000000 micro-lamports per unit, accepted.", - with(VerifySpec::honest(v1_route()), Tamper::Form(Form::V1 { unit_limit: Some(200_000), priority_fee_lamports: Some(1_000_000), loaded_accounts_data_size_limit: Some(64 * 1024 * 1024) })), + "A version-1 open at 300 units with priorityFee 1500 lamports: exactly 5000000 micro-lamports per unit and under the 2000 lamport cap a sponsor puts on the total fee (RULINGS S6), accepted.", + with(VerifySpec::honest(v1_route()), Tamper::Form(Form::V1 { unit_limit: Some(300), priority_fee_lamports: Some(1_500), loaded_accounts_data_size_limit: Some(64 * 1024 * 1024) })), + ); + x402_upto_verify_v1_priority_fee_over_sponsor_cap_reject => verify_case( + "x402-upto-verify-v1-priority-fee-over-sponsor-cap-reject", + TXV1_FILE, + s_txv1_budget(), + &[TV_V1_CAPS], + BugType::AuthBypass, + "A version-1 open at 200000 units with priorityFee 2001 lamports: far under 5000000 micro-lamports per unit, but one lamport over the cap the sponsor puts on the total fee it pays (RULINGS S6): rejected as compute-price-over-cap.", + with(VerifySpec::honest(v1_route()), Tamper::Form(Form::V1 { unit_limit: Some(200_000), priority_fee_lamports: Some(2_001), loaded_accounts_data_size_limit: Some(64 * 1024 * 1024) })), + Expect::Reject { code: RejectCode::ComputePriceOverCap, reason: None }, + None, ); x402_upto_verify_v1_missing_limit_reject => verify_case( "x402-upto-verify-v1-missing-limit-reject", diff --git a/rust/crates/conformance/src/fixture_rpc.rs b/rust/crates/conformance/src/fixture_rpc.rs index 09cff8a6b..93663dcef 100644 --- a/rust/crates/conformance/src/fixture_rpc.rs +++ b/rust/crates/conformance/src/fixture_rpc.rs @@ -77,7 +77,8 @@ pub struct Fixtures { impl Fixtures { /// Parse `input.rpcFixtures`, defaulting the blockhash to the charge /// request's `methodDetails.recentBlockhash` (what the retired TS driver - /// did, so every SDK sees the chain state it always saw). + /// did, so every SDK sees the chain state it always saw), or the session + /// open challenge's. pub fn from_input(input: &Value) -> Result { let raw = input.get("rpcFixtures").cloned().unwrap_or(json!({})); let mut mints = BTreeMap::new(); @@ -141,9 +142,13 @@ impl Fixtures { .and_then(Value::as_str) .map(str::to_string) .or_else(|| { - input - .pointer("/request/methodDetails/recentBlockhash") - .and_then(Value::as_str) + ["/request", "/sessionOpenBuild/request"] + .iter() + .find_map(|request| { + input + .pointer(&format!("{request}/methodDetails/recentBlockhash")) + .and_then(Value::as_str) + }) .map(str::to_string) }); Ok(Self { diff --git a/rust/crates/conformance/src/interop/settle.rs b/rust/crates/conformance/src/interop/settle.rs index 52fefb01a..d4ccc724b 100644 --- a/rust/crates/conformance/src/interop/settle.rs +++ b/rust/crates/conformance/src/interop/settle.rs @@ -279,7 +279,7 @@ fn upto_shape(c: &mut Checker<'_>, scenario: &Scenario, acc: &Accounts) { let m = c.m; let actual = scenario.primary_delta(); let ixs = m.instructions(); - let expected_len = if actual == 0 { 5 } else { 6 }; + let expected_len = if actual == 0 { 4 } else { 5 }; if ixs.len() != expected_len { c.problems.push(format!( "x402-upto settlement has {} instructions, expected {expected_len}", @@ -287,8 +287,8 @@ fn upto_shape(c: &mut Checker<'_>, scenario: &Scenario, acc: &Accounts) { )); return; } - let (settle, create_payee, create_treasury, create_recipient, distribute) = if actual == 0 { - (&ixs[0], &ixs[1], &ixs[2], &ixs[3], &ixs[4]) + let (settle, create_payee, create_treasury, distribute) = if actual == 0 { + (&ixs[0], &ixs[1], &ixs[2], &ixs[3]) } else { let verify = &ixs[0]; c.check(m.program(verify) == ED25519_PROGRAM, || { @@ -312,7 +312,7 @@ fn upto_shape(c: &mut Checker<'_>, scenario: &Scenario, acc: &Accounts) { c.check(u64_le(&verify.data, 112 + 2 + 32) == Some(actual), || { format!("voucher cumulative amount != {actual}") }); - (&ixs[1], &ixs[2], &ixs[3], &ixs[4], &ixs[5]) + (&ixs[1], &ixs[2], &ixs[3], &ixs[4]) }; c.check(m.program(settle) == PAYMENT_CHANNELS_PROGRAM, || { "settle_and_seal is not a payment-channels instruction".into() @@ -341,12 +341,6 @@ fn upto_shape(c: &mut Checker<'_>, scenario: &Scenario, acc: &Accounts) { treasury_ata.as_str(), "treasury", ), - ( - create_recipient, - pay_to, - recipient_ata.as_str(), - "recipient", - ), ] { let ok = m.program(ix) == ATA_PROGRAM && ix.data.first() == Some(&1) diff --git a/rust/crates/conformance/src/realize.rs b/rust/crates/conformance/src/realize.rs index 86ae3f51e..d00e7ad8d 100644 --- a/rust/crates/conformance/src/realize.rs +++ b/rust/crates/conformance/src/realize.rs @@ -30,6 +30,7 @@ use solana_pay_kit::core::store::{ }; use solana_pay_kit::mpp::client::{ build_charge_transaction_with_options, BuildChargeTransactionOptions, ComputeBudgetOptions, + PayerFundedAtaCreation, }; use solana_pay_kit::mpp::protocol::core::{ base64url_decode, base64url_encode, compute_challenge_id, Base64UrlJson, @@ -524,6 +525,9 @@ async fn charge_build(input: &Value) -> Result { external_id: charge.external_id.clone(), compute_budget: budget, max_tx_version: signer_max_version(input)?, + // The vectors pin the spec's client-paid shape, which includes split + // ATA creation (RULINGS C5); the kit declines it by default. + payer_funded_ata_creation: PayerFundedAtaCreation::Include, ..Default::default() }; let recipient = charge diff --git a/rust/crates/conformance/src/realize/batch.rs b/rust/crates/conformance/src/realize/batch.rs index 834183f65..271f6c785 100644 --- a/rust/crates/conformance/src/realize/batch.rs +++ b/rust/crates/conformance/src/realize/batch.rs @@ -1182,10 +1182,15 @@ pub mod fx { // ── chain state ── pub fn token_account(owner: &str, state: u8) -> Value { + token_account_holding(owner, state, 1_000_000_000) + } + + /// [`token_account`] holding `amount` base units. + pub fn token_account_holding(owner: &str, state: u8, amount: u64) -> Value { let mut data = Vec::with_capacity(165); data.extend_from_slice(pubkey(keys::MINT).as_ref()); data.extend_from_slice(pubkey(owner).as_ref()); - data.extend_from_slice(&1_000_000_000u64.to_le_bytes()); + data.extend_from_slice(&amount.to_le_bytes()); data.extend_from_slice(&[0u8; 36]); // delegate: None data.push(state); data.extend_from_slice(&[0u8; 12]); // is_native: None @@ -1285,6 +1290,8 @@ pub mod fx { MissingReceiver, /// The payer's return ATA is frozen (state 2). FrozenPayer, + /// The payer's ATA holds a single base unit, short of any deposit. + UnfundedPayer, } /// `rpcFixtures`: the mint, the settlement ATAs and, when given, the @@ -1306,7 +1313,12 @@ pub mod fx { if atas == Atas::MissingReceiver && owner == keys::X402_PAY_TO { continue; } - accounts.insert(ata(&owner), token_account(&owner, state)); + let amount = if atas == Atas::UnfundedPayer && owner == payer() { + 1 + } else { + 1_000_000_000 + }; + accounts.insert(ata(&owner), token_account_holding(&owner, state, amount)); } if let Some((config, account)) = channel { accounts.insert( diff --git a/rust/crates/conformance/src/realize/session.rs b/rust/crates/conformance/src/realize/session.rs index 32e16f7aa..4fc5da538 100644 --- a/rust/crates/conformance/src/realize/session.rs +++ b/rust/crates/conformance/src/realize/session.rs @@ -15,9 +15,10 @@ //! is the sponsor's key when `server.feePayer` is set. Nothing in the input //! is a precomputed verdict: the testee parses `credential` with its SDK's //! wire types and hands it to the SDK's server. -//! - build: `sessionOpenBuild` = `{ request, salt, server, challenge }`: +//! - build: `sessionOpenBuild` = `{ request, salt, deposit, server, challenge }`: //! `request` is the challenge's `SessionRequest`, `salt` the channel salt -//! the client's builder takes; `server` / `challenge` are for the judge +//! the client's builder takes, `deposit` the deposit its caller +//! authorizes; `server` / `challenge` are for the judge //! only. `signerSecretKey` is the payer, `sessionSignerSecretKey` the //! voucher key the client authorizes. //! @@ -34,12 +35,14 @@ use solana_hash::Hash; use solana_instruction::{AccountMeta, Instruction}; use solana_pay_kit::core::payment_channels as pc; use solana_pay_kit::core::store::{ - ChannelState, ChannelStore, MemoryChannelStore, CHANNEL_STATE_SCHEMA_VERSION, + ChannelState, ChannelStore, MemoryChannelStore, ObservedLifecycle, OnchainObservation, + CHANNEL_STATE_SCHEMA_VERSION, }; use solana_pay_kit::core::tx::{ComputeBudget, TxV1Mode, TxVersion}; use solana_pay_kit::mpp::client::session::{ create_payment_channel_session_opener, derive_payment_channel_open, - DerivePaymentChannelOpenParams, PaymentChannelOpenOptions, PaymentChannelSessionOpenOptions, + DerivePaymentChannelOpenParams, OpenBlockhash, PaymentChannelOpenOptions, + PaymentChannelSessionOpenOptions, SessionOpenAuthorization, }; use solana_pay_kit::mpp::protocol::intents::session::{ SessionAction, SessionAuthentication, SessionRequest, SignedVoucher, UsePayload, VoucherData, @@ -486,7 +489,7 @@ pub fn stored_channel(channel: &Value) -> Result { }; let highest = channel.get("highestVoucher"); let proof = channel.get("authentication").filter(|v| !v.is_null()); - Ok(ChannelState { + let mut state = ChannelState { channel_id: text("channelId")?, authorized_signer: text("authorizedSigner")?, deposit: number("escrowedAmount")?, @@ -537,7 +540,26 @@ pub fn stored_channel(channel: &Value) -> Result { lifecycle: None, schema_version: CHANNEL_STATE_SCHEMA_VERSION, extra: Default::default(), - }) + }; + // The record is the server's view of a channel it confirmed onchain just + // now: `status` and `closureStartedAt` are what that read showed. + let now = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .map_err(|e| e.to_string())? + .as_secs(); + let lifecycle = match (state.sealed, state.close_requested_at) { + (true, started_at) => ObservedLifecycle::Terminal { started_at }, + (false, Some(started_at)) => ObservedLifecycle::Closing { started_at }, + (false, None) => ObservedLifecycle::Open, + }; + state.record_onchain_observation( + OnchainObservation { + slot: None, + lifecycle, + }, + now, + ); + Ok(state) } /// A signed voucher JSON (`SignedVoucher` on the wire). @@ -737,9 +759,27 @@ async fn open_for_request(request: &SessionRequest, build: &OpenBuild) -> Result }; let session = MemorySigner::from_bytes(&keys::keypair_bytes(voucher_seed)).map_err(|e| e.to_string())?; + // The harness client deposits what the server suggests unless the case + // picks a deposit, and trusts the kit server's operator. + let deposit = match build.deposit { + Some(deposit) => deposit, + None => request + .suggested_deposit + .as_deref() + .or(request.minimum_deposit.as_deref()) + .ok_or("challenge without a deposit")? + .parse() + .map_err(|e| format!("suggestedDeposit: {e}"))?, + }; + let authorization = match request.method_details.operator.as_deref() { + Some(operator) => SessionOpenAuthorization::operator_signed( + deposit, + Pubkey::from_str(operator).map_err(|e| e.to_string())?, + ), + None => SessionOpenAuthorization::client_signed(deposit), + }; let open_options = PaymentChannelOpenOptions { salt: Some(SALT), - deposit: build.deposit, open_slot: build.open_slot, compute_budget: build .budget @@ -758,6 +798,7 @@ async fn open_for_request(request: &SessionRequest, build: &OpenBuild) -> Result request, payer: client(), authorized_signer: Pubkey::from_str(operator_key).map_err(|e| e.to_string())?, + authorization: &authorization, options: open_options.clone(), }) .map_err(|e| format!("derive open: {e}"))?; @@ -771,11 +812,15 @@ async fn open_for_request(request: &SessionRequest, build: &OpenBuild) -> Result ) } }; + // The kit server's challenge carries the pinned blockhash. + let blockhash = + OpenBlockhash::from_client_cluster(Hash::from_str(BLOCKHASH).map_err(|e| e.to_string())?); let opened = create_payment_channel_session_opener( request, &payer, Box::new(session), - None, + blockhash, + &authorization, PaymentChannelSessionOpenOptions { open: open_options, authentication, @@ -1593,6 +1638,9 @@ pub struct BuildRecipe { pub authorized: Authorized, /// Edits of the challenge `SessionRequest` JSON. pub edits: Vec, + /// The latest blockhash of the client's cluster (`rpcFixtures`), when it + /// is not the challenged one. + pub client_blockhash: Option<&'static str>, } pub fn build_input(recipe: &BuildRecipe) -> Result { @@ -1611,6 +1659,15 @@ pub fn build_input(recipe: &BuildRecipe) -> Result { "sessionOpenBuild": { "request": request, "salt": SALT.to_string(), + // The deposit the caller authorizes (draft-solana-session-00 + // leaves it to the client); the harness client takes the + // server's suggestion. + "deposit": recipe + .server + .suggested_deposit + .or(recipe.server.minimum_deposit) + .unwrap_or(1_000) + .to_string(), "server": recipe.server.json(), "challenge": { "id": CHALLENGE_ID, @@ -1622,6 +1679,9 @@ pub fn build_input(recipe: &BuildRecipe) -> Result { if recipe.server.sponsored { input["sessionServerFeePayerSecretKey"] = keys::secret_json(OPERATOR_SEED); } + if let Some(blockhash) = recipe.client_blockhash { + input["rpcFixtures"] = json!({ "recentBlockhash": blockhash }); + } Ok(input) } @@ -1683,11 +1743,19 @@ pub async fn build(input: &Value) -> Result { let payer = signer_from(input, "signerSecretKey")?; let session = signer_from(input, "sessionSignerSecretKey")?; let salt = u64_field(params, "salt")?; + let deposit = u64_field(params, "deposit")?.ok_or("sessionOpenBuild.deposit missing")?; + let fixtures = crate::fixture_rpc::Fixtures::from_input(input)?; + let (rpc, _log) = crate::fixture_rpc::rpc_client(&fixtures); + let blockhash = match OpenBlockhash::verify(&rpc, &request).await { + Ok(blockhash) => blockhash, + Err(e) => return Ok(reject_build(e.to_string())), + }; let opened = create_payment_channel_session_opener( &request, &payer, Box::new(session), - None, + blockhash, + &SessionOpenAuthorization::client_signed(deposit), PaymentChannelSessionOpenOptions { open: PaymentChannelOpenOptions { salt, diff --git a/rust/crates/conformance/src/realize/session_open.rs b/rust/crates/conformance/src/realize/session_open.rs index bb2840e9a..fa85f2062 100644 --- a/rust/crates/conformance/src/realize/session_open.rs +++ b/rust/crates/conformance/src/realize/session_open.rs @@ -15,8 +15,8 @@ use serde_json::{json, Value}; use solana_pay_kit::core::store::MemoryChannelStore; use solana_pay_kit::core::tx::{TxV1Mode, TxVersion}; use solana_pay_kit::mpp::client::session::{ - create_payment_channel_session_opener, PaymentChannelOpenOptions, - PaymentChannelSessionOpenOptions, + create_payment_channel_session_opener, OpenBlockhash, PaymentChannelOpenOptions, + PaymentChannelSessionOpenOptions, SessionOpenAuthorization, }; use solana_pay_kit::mpp::protocol::intents::session::{OpenPayload, SessionAction}; use solana_pay_kit::mpp::server::session::{SessionConfig, SessionServer, VoucherSigner}; @@ -104,11 +104,25 @@ async fn build_open(server_value: &Value) -> Result { .map_err(|e| e.to_string())?; let session = MemorySigner::from_bytes(&keys::keypair_bytes(SESSION_SIGNER_SEED)) .map_err(|e| e.to_string())?; + // The kit server's challenge carries the pinned blockhash. + let blockhash = OpenBlockhash::from_client_cluster( + BLOCKHASH.parse().map_err(|e| format!("blockhash: {e:?}"))?, + ); let opened = create_payment_channel_session_opener( &request, &payer, Box::new(session), - None, + blockhash, + // The harness client deposits what the server suggests. + &SessionOpenAuthorization::client_signed( + request + .suggested_deposit + .as_deref() + .or(request.minimum_deposit.as_deref()) + .ok_or("challenge without a deposit")? + .parse() + .map_err(|e| format!("suggestedDeposit: {e}"))?, + ), PaymentChannelSessionOpenOptions { open: PaymentChannelOpenOptions { salt: Some(SALT), diff --git a/rust/crates/harness-bins/src/bin/mpp_harness_client.rs b/rust/crates/harness-bins/src/bin/mpp_harness_client.rs index d05ee6d59..becf8ea5d 100644 --- a/rust/crates/harness-bins/src/bin/mpp_harness_client.rs +++ b/rust/crates/harness-bins/src/bin/mpp_harness_client.rs @@ -22,7 +22,7 @@ fn write_stdout_line(line: &str) { } } use solana_pay_kit::mpp::client::{ - build_credential_header_with_options, BuildChargeTransactionOptions, + build_credential_header_with_options, BuildChargeTransactionOptions, PayerFundedAtaCreation, }; use solana_pay_kit::mpp::solana_rpc_client::rpc_client::RpcClient; use solana_pay_kit::mpp::{ @@ -58,10 +58,12 @@ async fn main() -> Result<(), Box> { let rpc = RpcClient::new(rpc_url); // The client's configuration: the cluster it pays on, the amount it was // asked to pay and who it pays. The kit refuses a challenge that - // disagrees with any of them. Split ATA rent is funded from the client - // wallet on servers without a fee payer, which is the kit's default (the - // spec requires it). + // disagrees with any of them. The harness server is trusted to name split + // recipients, so split ATA rent is funded from the client wallet on + // servers without a fee payer (the spec requires it; the kit declines it + // unless asked). let options = BuildChargeTransactionOptions { + payer_funded_ata_creation: PayerFundedAtaCreation::Include, expected_network: env::var("MPP_HARNESS_NETWORK").ok(), max_amount_base_units: env::var("MPP_HARNESS_AMOUNT") .ok() diff --git a/rust/crates/kit/examples/vector_runner.rs b/rust/crates/kit/examples/vector_runner.rs index d66eabf02..57e96b175 100644 --- a/rust/crates/kit/examples/vector_runner.rs +++ b/rust/crates/kit/examples/vector_runner.rs @@ -43,6 +43,7 @@ use solana_pay_kit::core::store::{ use solana_pay_kit::core::tx::{accepted_versions, TxVersion}; use solana_pay_kit::mpp::client::{ build_charge_transaction_with_options, BuildChargeTransactionOptions, ComputeBudgetOptions, + PayerFundedAtaCreation, }; use solana_pay_kit::mpp::protocol::core::{base64url_decode, compute_challenge_id, Base64UrlJson}; use solana_pay_kit::mpp::protocol::intents::session::{ @@ -335,6 +336,9 @@ async fn charge_build(input: &Value) -> Result { let mut options = BuildChargeTransactionOptions { external_id: charge.external_id.clone(), max_tx_version: signer_max_version(input)?, + // The vectors pin the spec's client-paid shape, which includes split + // ATA creation (RULINGS C5); the kit declines it by default. + payer_funded_ata_creation: PayerFundedAtaCreation::Include, ..Default::default() }; let mut budget = ComputeBudgetOptions::default(); diff --git a/rust/crates/kit/examples/vector_runner/session.rs b/rust/crates/kit/examples/vector_runner/session.rs index d62dcf023..5ae6ebde1 100644 --- a/rust/crates/kit/examples/vector_runner/session.rs +++ b/rust/crates/kit/examples/vector_runner/session.rs @@ -21,12 +21,13 @@ use std::str::FromStr; use serde_json::{json, Map, Value}; use solana_pay_kit::core::store::{ - ChannelState, ChannelStore, MemoryChannelStore, ProcessedUse, CHANNEL_STATE_SCHEMA_VERSION, + ChannelState, ChannelStore, MemoryChannelStore, ObservedLifecycle, OnchainObservation, + ProcessedUse, CHANNEL_STATE_SCHEMA_VERSION, }; use solana_pay_kit::core::tx::{TxV1Mode, TxVersion}; use solana_pay_kit::mpp::client::session::{ - create_payment_channel_session_opener, PaymentChannelOpenOptions, - PaymentChannelSessionOpenOptions, + create_payment_channel_session_opener, OpenBlockhash, PaymentChannelOpenOptions, + PaymentChannelSessionOpenOptions, SessionOpenAuthorization, }; use solana_pay_kit::mpp::protocol::intents::session::{ SessionAction, SessionAuthentication, SessionRequest, SignedVoucher, UsePayload, @@ -232,7 +233,7 @@ fn stored_channel(channel: &Value) -> Result { }; let highest = channel.get("highestVoucher"); let proof = channel.get("authentication").filter(|v| !v.is_null()); - Ok(ChannelState { + let mut state = ChannelState { channel_id: text("channelId")?, authorized_signer: text("authorizedSigner")?, deposit: number("escrowedAmount")?, @@ -283,7 +284,26 @@ fn stored_channel(channel: &Value) -> Result { lifecycle: None, schema_version: CHANNEL_STATE_SCHEMA_VERSION, extra: Default::default(), - }) + }; + // The record is the server's view of a channel it confirmed onchain just + // now: `status` and `closureStartedAt` are what that read showed. + let now = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .map_err(|e| e.to_string())? + .as_secs(); + let lifecycle = match (state.sealed, state.close_requested_at) { + (true, started_at) => ObservedLifecycle::Terminal { started_at }, + (false, Some(started_at)) => ObservedLifecycle::Closing { started_at }, + (false, None) => ObservedLifecycle::Open, + }; + state.record_onchain_observation( + OnchainObservation { + slot: None, + lifecycle, + }, + now, + ); + Ok(state) } /// The shared code for a kit session server error (mirrors `code_for` in @@ -548,11 +568,21 @@ async fn build(input: &Value) -> Result { .map_err(|e| refuse(format!("invalid challenge: {e}")))?; let payer = signer_from(input, "signerSecretKey")?; let session = signer_from(input, "sessionSignerSecretKey")?; + let rpc_url = input + .get("rpcUrl") + .and_then(Value::as_str) + .ok_or("driver did not inject input.rpcUrl")?; + let rpc = solana_rpc_client::rpc_client::RpcClient::new(rpc_url.to_string()); + let blockhash = OpenBlockhash::verify(&rpc, &request) + .await + .map_err(|e| refuse(e.to_string()))?; + let deposit = u64_field(params, "deposit")?.ok_or("sessionOpenBuild.deposit missing")?; let opened = create_payment_channel_session_opener( &request, &payer, Box::new(session), - None, + blockhash, + &SessionOpenAuthorization::client_signed(deposit), PaymentChannelSessionOpenOptions { open: PaymentChannelOpenOptions { salt: u64_field(params, "salt")?, diff --git a/rust/crates/kit/src/client/mod.rs b/rust/crates/kit/src/client/mod.rs index e84562085..e3f63296f 100644 --- a/rust/crates/kit/src/client/mod.rs +++ b/rust/crates/kit/src/client/mod.rs @@ -156,8 +156,10 @@ impl PayKitClient { } let origin = response_url.origin().ascii_serialization(); let headers = response_headers(response.headers()); - let body = response.bytes().await?; - let body = std::str::from_utf8(&body).ok(); + let body = read_challenge_body(response).await?; + let body = body + .as_deref() + .and_then(|body| std::str::from_utf8(body).ok()); let (offers, mut rejections) = self.collect_offers(&headers, body, &origin); if offers.is_empty() { return if rejections.is_empty() { @@ -286,6 +288,31 @@ impl PayKitClient { } } +/// Largest 402 body the client reads, after content decoding. Only x402 v1 +/// carries its offers in the body, and a challenge set is a few KiB; a body +/// past this is dropped unread and the offers in the headers still apply. +const MAX_CHALLENGE_BODY_BYTES: usize = 64 * 1024; + +/// The 402 body, or `None` when it is larger than +/// [`MAX_CHALLENGE_BODY_BYTES`]. Counting decoded chunks bounds a compressed +/// body by what it inflates to, not by what crossed the wire. +async fn read_challenge_body(mut response: Response) -> Result>, reqwest::Error> { + if response + .content_length() + .is_some_and(|length| length > MAX_CHALLENGE_BODY_BYTES as u64) + { + return Ok(None); + } + let mut body = Vec::new(); + while let Some(chunk) = response.chunk().await? { + if body.len() + chunk.len() > MAX_CHALLENGE_BODY_BYTES { + return Ok(None); + } + body.extend_from_slice(&chunk); + } + Ok(Some(body)) +} + /// Builder for [`PayKitClient`]. #[derive(Default)] pub struct PayKitClientBuilder { @@ -1452,6 +1479,120 @@ mod tests { task.abort(); } + /// A response body that never ends. + struct EndlessBody; + + impl http_body::Body for EndlessBody { + type Data = axum::body::Bytes; + type Error = std::convert::Infallible; + + fn poll_frame( + self: std::pin::Pin<&mut Self>, + _cx: &mut std::task::Context<'_>, + ) -> std::task::Poll, Self::Error>>> { + std::task::Poll::Ready(Some(Ok(http_body::Frame::data( + axum::body::Bytes::from_static(&[b' '; 16 * 1024]), + )))) + } + } + + /// Serve a 402 whose body is `body`, plus the x402 offer in the + /// `PAYMENT-REQUIRED` header when `header` is set. + async fn challenge_body_server( + header: Option, + body: fn() -> axum::body::Body, + ) -> (String, Arc) { + let saw_payment = Arc::new(AtomicBool::new(false)); + let seen = saw_payment.clone(); + let app = Router::new().route( + "/report", + get(move |headers: HeaderMap| { + let header = header.clone(); + let seen = seen.clone(); + async move { + if headers.contains_key("payment-signature") { + seen.store(true, Ordering::SeqCst); + return (StatusCode::OK, "paid").into_response(); + } + let mut response = axum::response::Response::new(body()); + *response.status_mut() = StatusCode::PAYMENT_REQUIRED; + if let Some(header) = header { + response + .headers_mut() + .insert("payment-required", header.parse().unwrap()); + } + response + } + }), + ); + (format!("{}/report", serve(app).await), saw_payment) + } + + async fn x402_test_client() -> PayKitClient { + PayKitClient::builder() + .signer(test_signer()) + .rpc_url(live_rpc().await) + .accept([ClientProtocol::X402]) + .build() + .unwrap() + } + + fn endless() -> axum::body::Body { + axum::body::Body::new(EndlessBody) + } + + #[tokio::test] + async fn an_endless_challenge_body_is_not_buffered() { + let (url, saw_payment) = challenge_body_server(None, endless).await; + let client = x402_test_client().await; + let result = + tokio::time::timeout(std::time::Duration::from_secs(10), client.get(url).send()) + .await + .expect("the client stops reading an oversized 402 body"); + assert!(matches!(result, Err(ClientError::NoSupportedChallenge))); + assert!(!saw_payment.load(Ordering::SeqCst)); + } + + #[tokio::test] + async fn header_offers_are_paid_past_an_oversized_body() { + let (url, saw_payment) = + challenge_body_server(Some(x402_challenge_header()), endless).await; + let client = x402_test_client().await; + let response = + tokio::time::timeout(std::time::Duration::from_secs(10), client.get(url).send()) + .await + .expect("the client stops reading an oversized 402 body") + .unwrap(); + assert_eq!(response.status(), StatusCode::OK); + assert!(saw_payment.load(Ordering::SeqCst)); + } + + #[tokio::test] + async fn an_oversized_body_offer_is_ignored_and_a_small_one_is_paid() { + fn body_offer(padding: usize) -> axum::body::Body { + let header = x402_challenge_header(); + let decoded = base64::engine::general_purpose::STANDARD + .decode(header) + .unwrap(); + let mut envelope: serde_json::Value = serde_json::from_slice(&decoded).unwrap(); + envelope["padding"] = serde_json::json!(" ".repeat(padding)); + axum::body::Body::from(serde_json::to_vec(&envelope).unwrap()) + } + let (url, saw_payment) = challenge_body_server(None, || body_offer(0)).await; + let response = x402_test_client().await.get(url).send().await.unwrap(); + assert_eq!(response.status(), StatusCode::OK); + assert!(saw_payment.load(Ordering::SeqCst)); + + let (url, saw_payment) = + challenge_body_server(None, || body_offer(MAX_CHALLENGE_BODY_BYTES)).await; + let error = x402_test_client().await.get(url).send().await.unwrap_err(); + assert!( + matches!(error, ClientError::NoSupportedChallenge), + "{error}" + ); + assert!(!saw_payment.load(Ordering::SeqCst)); + } + /// Serve a single-offer x402 402 whose paid retry is recorded. async fn x402_offer_server( accept: serde_json::Value, diff --git a/rust/crates/kit/src/core/batch_verify.rs b/rust/crates/kit/src/core/batch_verify.rs index 4297c6679..edc7c916f 100644 --- a/rust/crates/kit/src/core/batch_verify.rs +++ b/rust/crates/kit/src/core/batch_verify.rs @@ -20,10 +20,12 @@ //! message under any key whose scalar the signer knows, no crafted key //! needed, while `verify_strict` rejects it outright. A mixed-order `R` can //! also pass when its deterministic batch coefficient annihilates the torsion -//! component. [`is_degenerate`] therefore screens every batch input for weak -//! keys and requires `R` to be torsion-free before the batch equation runs at -//! all. The per-signature fallback on a failing batch restores `verify_strict` -//! too. +//! component, and so can any signature under a mixed-order verifying key +//! `A = a·B + T` once its coefficient annihilates `T`. [`is_degenerate`] +//! therefore requires both the key and `R` to be torsion-free before the batch +//! equation runs at all; anything else is decided by `verify_strict` alone, +//! the check the onchain Ed25519 precompile applies. The per-signature +//! fallback on a failing batch restores `verify_strict` too. use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::mpsc; @@ -147,14 +149,17 @@ fn worker_loop(rx: mpsc::Receiver, max_batch: usize, window: Duration) { } /// Whether `job` can pass the raw batch equation while failing -/// `verify_strict`: a non-prime-order `R` or a small-order verifying key. +/// `verify_strict`: a non-prime-order `R`, or a verifying key with a torsion +/// component (small-order or mixed-order). /// /// `ed25519_dalek::verify_batch` checks one randomly weighted aggregate /// equation. `R = identity` (order 1, small-order) and /// `s = H(R‖A‖M)·a mod L` satisfies that equation /// for *any* message M, for any key whose private scalar `a` the signer knows /// — no weak/crafted key required. A mixed-order `R` can likewise pass when -/// the transcript-derived coefficient kills its torsion component. +/// the transcript-derived coefficient kills its torsion component, and so can +/// a signature under a mixed-order key `A = a·B + T`, whose residual is a +/// multiple of `T`. /// `verify_strict` rejects these through its small-order checks or exact /// per-signature equation; batching must exclude them before trusting the /// aggregate equation, or a holder of a legitimate signing key (e.g. the payer, in @@ -166,6 +171,12 @@ fn is_degenerate(key: &VerifyingKey, signature: &Signature) -> bool { if key.is_weak() { return true; } + if !CompressedEdwardsY(key.to_bytes()) + .decompress() + .is_some_and(|point| point.is_torsion_free()) + { + return true; + } match CompressedEdwardsY(*signature.r_bytes()).decompress() { Some(point) => point.is_small_order() || !point.is_torsion_free(), // Doesn't even decompress to a curve point; verify_strict would also @@ -184,13 +195,15 @@ fn verify_and_reply(batch: Vec) { return; } - // Reject degenerate jobs before batch verification runs, so one can never - // ride a passing batch to acceptance. Cheap relative to the multiscalar - // multiplication it guards: one point decompression per job. + // Decide degenerate jobs with `verify_strict` alone before batch + // verification runs, so one can never ride a passing batch to acceptance. + // Cheap relative to the multiscalar multiplication it guards: two point + // decompressions per job. let mut candidates = Vec::with_capacity(batch.len()); for job in batch { if is_degenerate(&job.key, &job.signature) { - let _ = job.reply.send(false); + let ok = job.key.verify_strict(&job.message, &job.signature).is_ok(); + let _ = job.reply.send(ok); } else { candidates.push(job); } @@ -313,6 +326,99 @@ mod tests { Signature::from_components(r_bytes, s.to_bytes()) } + /// A verifying key `A = a·B + T` with an order-2 component `T`, and a + /// signature under it with an honest `R = r·B` and `s = r + k·a`. The + /// exact equation leaves `k·T`, so `verify_strict` (and the onchain + /// precompile) reject it exactly when `k` is odd. + fn mixed_order_key_signature( + scalar: Scalar, + message: &[u8], + nonce: u64, + ) -> (VerifyingKey, Signature) { + let point = scalar * ED25519_BASEPOINT_POINT + EIGHT_TORSION[4]; + let key = VerifyingKey::from_bytes(&point.compress().to_bytes()) + .expect("a mixed-order point is a valid key encoding"); + let r = Scalar::from(nonce); + let r_bytes = (r * ED25519_BASEPOINT_POINT).compress().to_bytes(); + let mut hasher = Sha512::new(); + hasher.update(r_bytes); + hasher.update(key.as_bytes()); + hasher.update(message); + let h = Scalar::from_bytes_mod_order_wide(&hasher.finalize().into()); + let s = r + h * scalar; + (key, Signature::from_components(r_bytes, s.to_bytes())) + } + + fn reply_for(jobs: Vec<(Vec, VerifyingKey, Signature)>) -> Vec { + let mut replies = Vec::new(); + let batch = jobs + .into_iter() + .map(|(message, key, signature)| { + let (reply, rx) = oneshot::channel(); + replies.push(rx); + Job { + message, + key, + signature, + reply, + } + }) + .collect(); + verify_and_reply(batch); + replies + .into_iter() + .map(|mut rx| rx.try_recv().expect("every job is answered")) + .collect() + } + + #[test] + fn mixed_order_key_never_rides_a_passing_batch() { + let honest_signer = keypair(11); + let honest_message = b"paid request".to_vec(); + let honest = honest_signer.sign(&honest_message); + let scalar = Scalar::from(0x5eed_u64); + let message = b"free request".to_vec(); + let (key, forged) = (1..=4096) + .map(|nonce| mixed_order_key_signature(scalar, &message, nonce)) + .find(|(key, signature)| { + key.verify_strict(&message, signature).is_err() + && ed25519_dalek::verify_batch( + &[honest_message.as_slice(), message.as_slice()], + &[honest, *signature], + &[honest_signer.verifying_key(), *key], + ) + .is_ok() + }) + .expect("a batch coefficient should annihilate the key's torsion"); + assert!(!key.is_weak()); + assert!(is_degenerate(&key, &forged)); + + let replies = reply_for(vec![ + (honest_message, honest_signer.verifying_key(), honest), + (message, key, forged), + ]); + assert_eq!(replies, [true, false]); + } + + #[test] + fn mixed_order_key_signature_valid_under_verify_strict_still_passes() { + let honest_signer = keypair(12); + let honest_message = b"paid request".to_vec(); + let honest = honest_signer.sign(&honest_message); + let scalar = Scalar::from(0x5eed_u64); + let message = b"also paid".to_vec(); + let (key, valid) = (1..=64) + .map(|nonce| mixed_order_key_signature(scalar, &message, nonce)) + .find(|(key, signature)| key.verify_strict(&message, signature).is_ok()) + .expect("an even challenge leaves no torsion residual"); + + let replies = reply_for(vec![ + (honest_message, honest_signer.verifying_key(), honest), + (message, key, valid), + ]); + assert_eq!(replies, [true, true]); + } + #[test] fn forged_signature_is_internally_consistent() { // Sanity check on the forgery construction itself: R really is the diff --git a/rust/crates/kit/src/core/payment_channel/mod.rs b/rust/crates/kit/src/core/payment_channel/mod.rs index 17fcc3cdc..f4fcf5c17 100644 --- a/rust/crates/kit/src/core/payment_channel/mod.rs +++ b/rust/crates/kit/src/core/payment_channel/mod.rs @@ -1,5 +1,7 @@ //! Versioned payment-channel ABIs and instruction builders. +pub mod payer_refund; +pub(crate) mod token_account; pub mod v1; pub mod v2; diff --git a/rust/crates/kit/src/core/payment_channel/payer_refund.rs b/rust/crates/kit/src/core/payment_channel/payer_refund.rs new file mode 100644 index 000000000..504f6c9ac --- /dev/null +++ b/rust/crates/kit/src/core/payment_channel/payer_refund.rs @@ -0,0 +1,334 @@ +//! Whether a sealed `distribute` refunds the payer or forfeits the refund. +//! +//! On a sealed channel the payment-channels program pays `deposit - settled` +//! back to the payer's associated token account, unless the payer already +//! withdrew it. It never fails on an unusable refund account: a missing, +//! uninitialized, frozen, reassigned or extension-bearing one has the refund +//! redirected to the protocol treasury, and the channel closes in the same +//! instruction. A server cranking that `distribute` checks the account first +//! and, when it cannot be paid, lands only the seal and defers the +//! distribute: the payer can still `withdraw_payer` or repair the account, +//! and a later pass distributes once it can be paid. +//! +//! The deferral is bounded. A payer must not hold the merchant's settled +//! revenue and the sponsor's rent in escrow by keeping its account unusable, +//! so once the channel has been sealed for its grace period the distribute +//! runs anyway and the program's redirect to the treasury is accepted. + +use solana_pubkey::Pubkey; + +use super::token_account::{decode_token_account, TOKEN_ACCOUNT_FROZEN, TOKEN_ACCOUNT_INITIALIZED}; +use super::v1::find_associated_token_address; + +/// Evidence that a sealed `distribute` of [`Self::channel`] may run: no +/// refund is due, the payer's token account can take it, or the deferral +/// deadline passed. Only [`payer_refund`] issues one. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct DistributeClearance { + channel: Pubkey, +} + +impl DistributeClearance { + /// The channel this clearance was issued for. + pub fn channel(&self) -> &Pubkey { + &self.channel + } +} + +/// What to do with a sealed channel's `distribute`. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum PayerRefund { + /// Distribute: the payer's refund, if any, is paid. + Clear(DistributeClearance), + /// A refund is due and `payer_token_account` cannot receive it: land only + /// the seal and distribute on a later pass, at the latest at `until` + /// (unix seconds). + Deferred { + refund: u64, + payer_token_account: Pubkey, + reason: String, + until: i64, + }, + /// The deferral deadline passed with the account still unusable: + /// distribute anyway, and the program redirects `refund` to the treasury. + Forfeit { + clearance: DistributeClearance, + refund: u64, + payer_token_account: Pubkey, + reason: String, + }, +} + +impl PayerRefund { + /// The clearance to distribute now, `None` while deferred. + pub fn clearance(self) -> Option { + match self { + Self::Clear(clearance) | Self::Forfeit { clearance, .. } => Some(clearance), + Self::Deferred { .. } => None, + } + } +} + +/// When a deferred distribute stops waiting for the payer's account. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct RefundDeadline { + /// When the channel was sealed (unix seconds); the time of this close for + /// a channel it seals. The program records no seal time, so a server + /// keeps the one it observed first. + pub sealed_at: i64, + /// The channel's grace period, in seconds. + pub grace_period: u32, +} + +impl RefundDeadline { + /// The first time the distribute runs whatever the account's state. + pub fn until(&self) -> i64 { + self.sealed_at.saturating_add(i64::from(self.grace_period)) + } +} + +/// An account as fetched from the cluster. +#[derive(Debug, Clone, Copy)] +pub struct ObservedAccount<'a> { + /// The program that owns the account. + pub owner: Pubkey, + pub data: &'a [u8], +} + +/// The channel fields a sealed `distribute` decides the refund from. +#[derive(Debug, Clone, Copy)] +pub struct SealedRefundTerms { + pub channel: Pubkey, + pub payer: Pubkey, + pub mint: Pubkey, + pub token_program: Pubkey, + pub deposit: u64, + /// The watermark the channel is sealed at. + pub settled: u64, + pub payer_withdrawn_at: i64, +} + +impl SealedRefundTerms { + /// The payer's refund account, which `payer_token_account` must be the + /// fetch of. + pub fn payer_token_account(&self) -> Pubkey { + find_associated_token_address(&self.payer, &self.mint, &self.token_program).0 + } + + /// The refund a sealed `distribute` pays the payer: zero once the payer + /// withdrew it or the deposit is fully settled. + pub fn refund_due(&self) -> u64 { + if self.payer_withdrawn_at != 0 { + return 0; + } + self.deposit.saturating_sub(self.settled) + } +} + +/// Decide what a sealed `distribute` under `terms` may do at `now` (unix +/// seconds). `payer_token_account` is the account at +/// [`SealedRefundTerms::payer_token_account`], `None` when it does not exist. +pub fn payer_refund( + terms: &SealedRefundTerms, + payer_token_account: Option>, + deadline: RefundDeadline, + now: i64, +) -> PayerRefund { + let clearance = DistributeClearance { + channel: terms.channel, + }; + let refund = terms.refund_due(); + let Some(reason) = (refund > 0) + .then(|| unpayable_reason(terms, payer_token_account)) + .flatten() + else { + return PayerRefund::Clear(clearance); + }; + let payer_token_account = terms.payer_token_account(); + let until = deadline.until(); + if now >= until { + return PayerRefund::Forfeit { + clearance, + refund, + payer_token_account, + reason: reason.to_string(), + }; + } + PayerRefund::Deferred { + refund, + payer_token_account, + reason: reason.to_string(), + until, + } +} + +/// Why the payer's refund account cannot take a refund, `None` when it can. +fn unpayable_reason( + terms: &SealedRefundTerms, + payer_token_account: Option>, +) -> Option<&'static str> { + let blocked = Some; + let Some(account) = payer_token_account else { + return blocked("does not exist"); + }; + if account.owner != terms.token_program { + return blocked("is not owned by the channel's token program"); + } + let Some(decoded) = decode_token_account(account.data) else { + return blocked("is not an initialized token account"); + }; + if decoded.state == TOKEN_ACCOUNT_FROZEN { + return blocked("is frozen"); + } + if decoded.state != TOKEN_ACCOUNT_INITIALIZED { + return blocked("is not initialized"); + } + if decoded.mint != terms.mint || decoded.owner != terms.payer { + return blocked("is not held by the payer for the channel's mint"); + } + if decoded.unsupported_extension.is_some() { + return blocked("carries a token account extension the program will not pay into"); + } + None +} + +#[cfg(test)] +mod tests { + use super::super::token_account::TOKEN_ACCOUNT_LEN; + use super::*; + + fn terms() -> SealedRefundTerms { + SealedRefundTerms { + channel: Pubkey::new_unique(), + payer: Pubkey::new_unique(), + mint: Pubkey::new_unique(), + token_program: Pubkey::new_unique(), + deposit: 1_000, + settled: 400, + payer_withdrawn_at: 0, + } + } + + fn token_account(mint: &Pubkey, owner: &Pubkey, state: u8) -> Vec { + let mut data = vec![0u8; TOKEN_ACCOUNT_LEN]; + data[..32].copy_from_slice(mint.as_ref()); + data[32..64].copy_from_slice(owner.as_ref()); + data[108] = state; + data + } + + const SEALED_AT: i64 = 1_000_000; + const GRACE: u32 = 900; + const DEADLINE: RefundDeadline = RefundDeadline { + sealed_at: SEALED_AT, + grace_period: GRACE, + }; + + fn decide(terms: &SealedRefundTerms, account: Option>) -> PayerRefund { + payer_refund(terms, account, DEADLINE, SEALED_AT) + } + + fn observed(terms: &SealedRefundTerms, data: &[u8]) -> PayerRefund { + decide( + terms, + Some(ObservedAccount { + owner: terms.token_program, + data, + }), + ) + } + + #[test] + fn an_unusable_refund_account_defers_a_due_refund() { + let terms = terms(); + let blocked = |outcome: PayerRefund| { + assert!( + matches!( + outcome, + PayerRefund::Deferred { refund: 600, until, .. } + if until == SEALED_AT + i64::from(GRACE) + ), + "{outcome:?}" + ) + }; + blocked(decide(&terms, None)); + blocked(observed( + &terms, + &token_account(&terms.mint, &terms.payer, TOKEN_ACCOUNT_FROZEN), + )); + blocked(observed( + &terms, + &token_account(&terms.mint, &terms.payer, 0), + )); + blocked(observed( + &terms, + &token_account( + &terms.mint, + &Pubkey::new_unique(), + TOKEN_ACCOUNT_INITIALIZED, + ), + )); + blocked(observed(&terms, &[])); + blocked(decide( + &terms, + Some(ObservedAccount { + owner: Pubkey::new_unique(), + data: &token_account(&terms.mint, &terms.payer, TOKEN_ACCOUNT_INITIALIZED), + }), + )); + } + + #[test] + fn a_live_account_or_no_refund_clears_the_distribute() { + let terms = terms(); + let live = token_account(&terms.mint, &terms.payer, TOKEN_ACCOUNT_INITIALIZED); + assert!( + matches!(observed(&terms, &live), PayerRefund::Clear(c) if c.channel == terms.channel) + ); + for terms in [ + SealedRefundTerms { + settled: 1_000, + ..terms + }, + SealedRefundTerms { + payer_withdrawn_at: 1, + ..terms + }, + ] { + assert!(matches!(decide(&terms, None), PayerRefund::Clear(_))); + } + } + + /// The deferral is bounded: from the deadline on, an account still + /// unusable no longer holds the payout, and the refund is forfeited. + #[test] + fn a_deferral_ends_at_the_grace_deadline() { + let terms = terms(); + let until = DEADLINE.until(); + let at = |now: i64| payer_refund(&terms, None, DEADLINE, now); + assert!(matches!(at(until - 1), PayerRefund::Deferred { .. })); + assert!(at(until - 1).clearance().is_none()); + match at(until) { + PayerRefund::Forfeit { + clearance, refund, .. + } => { + assert_eq!(clearance.channel, terms.channel); + assert_eq!(refund, 600); + } + other => panic!("expected forfeit, got {other:?}"), + } + assert!(at(until + 10).clearance().is_some()); + // A payable account clears at any time, before or after the deadline. + let live = token_account(&terms.mint, &terms.payer, TOKEN_ACCOUNT_INITIALIZED); + let account = Some(ObservedAccount { + owner: terms.token_program, + data: &live, + }); + for now in [SEALED_AT, until + 10] { + assert!(matches!( + payer_refund(&terms, account, DEADLINE, now), + PayerRefund::Clear(_) + )); + } + } +} diff --git a/rust/crates/kit/src/core/payment_channel/token_account.rs b/rust/crates/kit/src/core/payment_channel/token_account.rs new file mode 100644 index 000000000..c174a24cb --- /dev/null +++ b/rust/crates/kit/src/core/payment_channel/token_account.rs @@ -0,0 +1,93 @@ +//! The SPL token account layout shared by Token and Token-2022, read as the +//! payment-channels program reads a payout destination. + +use solana_pubkey::Pubkey; + +/// Base length of an SPL token account. Token-2022 appends its extensions +/// after the same fixed layout, so one decoder covers both programs. +pub(crate) const TOKEN_ACCOUNT_LEN: usize = 165; + +/// `AccountState::Initialized`, at offset 108. +pub(crate) const TOKEN_ACCOUNT_INITIALIZED: u8 = 1; + +/// `AccountState::Frozen`: the account cannot receive or send. +pub(crate) const TOKEN_ACCOUNT_FROZEN: u8 = 2; + +/// `AccountType::Account`, the discriminant a Token-2022 account carries at +/// offset 165 before its extensions. +pub(crate) const TOKEN_ACCOUNT_TYPE: u8 = 2; + +/// `ExtensionType::ImmutableOwner`. +/// +/// The only account extension a settlement destination may carry. It is inert +/// — it fixes the owner, nothing else — and every associated token account has +/// it, so requiring its absence would reject ordinary ATAs. +pub(crate) const EXTENSION_IMMUTABLE_OWNER: u16 = 7; + +/// The fields of an SPL token account this server cares about. +pub(crate) struct TokenAccount { + pub(crate) mint: Pubkey, + pub(crate) owner: Pubkey, + pub(crate) state: u8, + /// An account extension this server will not settle through, if any. + pub(crate) unsupported_extension: Option, +} + +/// Decode a token account, or `None` when the data is too short to be one — +/// which is what an uninitialized (or non-token) account looks like. +/// +/// Token-2022 appends a type byte and a TLV extension list after the same +/// 165-byte base. Those extensions are not cosmetic: one can withhold part of a +/// transfer, require a memo to precede it, block it from a CPI, or move the +/// balance out of the classic ledger entirely — so an account carrying one is +/// reported rather than silently accepted as a payout destination. +pub(crate) fn decode_token_account(data: &[u8]) -> Option { + if data.len() < TOKEN_ACCOUNT_LEN { + return None; + } + Some(TokenAccount { + mint: Pubkey::try_from(&data[0..32]).ok()?, + owner: Pubkey::try_from(&data[32..64]).ok()?, + state: data[108], + unsupported_extension: unsupported_account_extension(data), + }) +} + +/// The first account extension outside the allowlist, if the account has one. +/// +/// A malformed or truncated TLV is reported as unsupported rather than skipped: +/// this decides whether to accept an escrow, so anything it cannot read is +/// something it should not settle through. +fn unsupported_account_extension(data: &[u8]) -> Option { + // A classic SPL Token account is exactly the base length and has no + // extension list at all. + if data.len() == TOKEN_ACCOUNT_LEN { + return None; + } + if data[TOKEN_ACCOUNT_LEN] != TOKEN_ACCOUNT_TYPE { + return Some(u16::from(data[TOKEN_ACCOUNT_LEN])); + } + let mut cursor = TOKEN_ACCOUNT_LEN + 1; + while cursor < data.len() { + // A run of zero padding is the end of the list, not an extension. + if data[cursor..].iter().all(|byte| *byte == 0) { + return None; + } + let Some(header) = data.get(cursor..cursor + 4) else { + return Some(u16::MAX); + }; + let extension = u16::from_le_bytes([header[0], header[1]]); + let length = usize::from(u16::from_le_bytes([header[2], header[3]])); + if extension != EXTENSION_IMMUTABLE_OWNER { + return Some(extension); + } + let Some(next) = cursor.checked_add(4).and_then(|c| c.checked_add(length)) else { + return Some(u16::MAX); + }; + if next > data.len() { + return Some(u16::MAX); + } + cursor = next; + } + None +} diff --git a/rust/crates/kit/src/core/payment_channel/v1.rs b/rust/crates/kit/src/core/payment_channel/v1.rs index d246050fa..3594fb60f 100644 --- a/rust/crates/kit/src/core/payment_channel/v1.rs +++ b/rust/crates/kit/src/core/payment_channel/v1.rs @@ -1000,6 +1000,10 @@ impl MemoPolicy<'_> { /// 1. An optional ComputeBudget prefix: at most one `SetComputeUnitLimit` and /// at most one `SetComputeUnitPrice`, limit before price, each within /// [`OPEN_MAX_COMPUTE_UNIT_LIMIT`] / [`MAX_COMPUTE_UNIT_PRICE_MICROLAMPORTS`]. +/// The sponsor pays the priority fee, so the fee itself (limit times price, +/// the runtime default limit when none is declared, or the version-1 +/// header fee) is held to +/// [`MAX_SPONSORED_PRIORITY_FEE_LAMPORTS`](crate::core::tx::MAX_SPONSORED_PRIORITY_FEE_LAMPORTS). /// 2. Exactly one instruction on `program_id` whose first data byte is /// `discriminator`. /// 3. A suffix of at most [`OPEN_MAX_LIGHTHOUSE_INSTRUCTIONS`] Lighthouse @@ -1194,6 +1198,18 @@ pub fn scan_channel_tx_layout<'tx>( "{label} transaction must carry exactly one binding Memo" ))); } + // Each field within its ceiling still lets the largest limit pair with the + // largest price, and an undeclared limit is priced at the runtime default + // for every instruction. Checked once the layout is known to be canonical. + crate::core::tx::check_priority_fee( + &tx.message, + crate::core::tx::MAX_SPONSORED_PRIORITY_FEE_LAMPORTS, + ) + .map_err(|e| { + Error::Other(format!( + "{label} transaction compute unit price exceeds the sponsored fee maximum: {e}" + )) + })?; Ok(primary) } diff --git a/rust/crates/kit/src/core/settlement/worker.rs b/rust/crates/kit/src/core/settlement/worker.rs index 3ab852be3..c12f5a23d 100644 --- a/rust/crates/kit/src/core/settlement/worker.rs +++ b/rust/crates/kit/src/core/settlement/worker.rs @@ -12,6 +12,8 @@ //! Each flush signs with the **operator** (fee-payer + Delegated authority), //! **sends without preflight** (does not wait for confirmation — the signature //! is returned to callers immediately), then a background task confirms/retries. +//! A packed transaction that fails on-chain applied nothing, so its channels +//! are re-sent one per transaction: one failing channel cannot fail the rest. //! Un-settled channels remain the caller's store's responsibility to reconcile. //! //! Broadcast is behind the [`Broadcaster`] trait so the actor is unit-testable @@ -256,7 +258,7 @@ fn spawn_flush( .acquire_owned() .await .expect("settlement semaphore is never closed"); - settle_group(group, &cfg, broadcaster.clone(), trigger).await; + settle_group(group, &cfg, broadcaster.clone(), &sem, trigger).await; } }); } @@ -301,8 +303,9 @@ fn regroup( async fn settle_group( group: Vec, - cfg: &SettlementConfig, + cfg: &Arc, broadcaster: Arc, + sem: &Arc, trigger: &'static str, ) { let started = Instant::now(); @@ -344,26 +347,7 @@ async fn settle_group( .unwrap_or(0), ); - // Build + sign + broadcast. - let result: SettlementResult = async { - let blockhash = broadcaster.latest_blockhash().await?; - let mut tx = build_unsigned( - cfg.tx_version, - &cfg.operator, - &flat, - blockhash, - cfg.compute_budget.as_ref(), - ) - .map_err(|e| format!("settle build failed: {e}"))?; - crate::core::signing::sign_versioned_transaction_slot( - cfg.operator_signer.as_ref(), - &mut tx, - ) - .await - .map_err(|e| format!("settle signing failed: {e}"))?; - broadcaster.send(&tx).await - } - .await; + let result = sign_and_send(cfg, broadcaster.as_ref(), &flat).await; match &result { Ok(sig) => { @@ -398,20 +382,67 @@ async fn settle_group( // Reply to every channel in the group with the (shared) tx signature; // units awaiting confirmation get the confirmation outcome instead. + let packed = group.len() > 1; let (confirming, immediate): (Vec<_>, Vec<_>) = group .into_iter() .partition(|u| u.await_confirmation && result.is_ok()); + // Kept to re-send alone should the packed transaction fail on-chain. + let replied: Vec<(String, Vec)> = if packed && result.is_ok() { + immediate + .iter() + .map(|u| (u.channel_id.clone(), u.instructions.clone())) + .collect() + } else { + Vec::new() + }; for u in immediate { let _ = u.reply.send(result.clone()); } // Background confirm (best-effort; store is the durable source of truth). if let Ok(sig) = result { - let attempts = cfg.confirm_attempts; + let cfg = Arc::clone(cfg); + let sem = Arc::clone(sem); tokio::spawn(async move { - let outcome = confirm_settlement(broadcaster.as_ref(), &sig, attempts).await; - for u in confirming { - let _ = u.reply.send(outcome.clone()); + let outcome = + confirm_settlement(broadcaster.as_ref(), &sig, cfg.confirm_attempts).await; + match outcome { + // A transaction is atomic, so nothing in it applied: one + // unit failing deterministically (a channel its payer + // already closed, an unredeemable voucher) must not fail + // the others packed with it. Each is re-sent alone and + // answers with its own outcome. + Err(ConfirmFailure::OnChain(error)) if packed => { + tracing::warn!( + tx = %sig, + error = %error, + channels = confirming.len() + replied.len(), + "packed settlement failed on-chain; settling each channel alone", + ); + for unit in confirming { + let outcome = + settle_alone(&cfg, broadcaster.as_ref(), &sem, &unit.instructions) + .await; + let _ = unit.reply.send(outcome); + } + for (channel_id, instructions) in replied { + if let Err(error) = + settle_alone(&cfg, broadcaster.as_ref(), &sem, &instructions).await + { + tracing::warn!( + channel = %channel_id, + error = %error, + "settlement failed alone (store will reconcile)", + ); + } + } + } + outcome => { + let outcome = outcome.map_err(ConfirmFailure::into_message); + for u in confirming { + let _ = u.reply.send(outcome.clone()); + } + } } }); } @@ -420,12 +451,70 @@ async fn settle_group( .await } +/// Build, sign and broadcast one settlement transaction. +async fn sign_and_send( + cfg: &SettlementConfig, + broadcaster: &dyn Broadcaster, + instructions: &[Instruction], +) -> SettlementResult { + let blockhash = broadcaster.latest_blockhash().await?; + let mut tx = build_unsigned( + cfg.tx_version, + &cfg.operator, + instructions, + blockhash, + cfg.compute_budget.as_ref(), + ) + .map_err(|e| format!("settle build failed: {e}"))?; + crate::core::signing::sign_versioned_transaction_slot(cfg.operator_signer.as_ref(), &mut tx) + .await + .map_err(|e| format!("settle signing failed: {e}"))?; + broadcaster.send(&tx).await +} + +/// Settle one unit in its own transaction and wait for its outcome. Its send +/// holds an in-flight permit, like every flush transaction's. +async fn settle_alone( + cfg: &SettlementConfig, + broadcaster: &dyn Broadcaster, + sem: &Arc, + instructions: &[Instruction], +) -> SettlementResult { + let sig = { + let _permit = sem + .clone() + .acquire_owned() + .await + .expect("settlement semaphore is never closed"); + sign_and_send(cfg, broadcaster, instructions).await? + }; + confirm_settlement(broadcaster, &sig, cfg.confirm_attempts) + .await + .map_err(ConfirmFailure::into_message) +} + +/// Why a sent settlement did not confirm. +enum ConfirmFailure { + /// It landed and failed: none of its instructions applied. + OnChain(String), + /// Not confirmed within the window; it may still land. + Unconfirmed(String), +} + +impl ConfirmFailure { + fn into_message(self) -> String { + match self { + Self::OnChain(message) | Self::Unconfirmed(message) => message, + } + } +} + /// Poll `sig` until it is confirmed, fails on-chain, or `attempts` run out. async fn confirm_settlement( broadcaster: &dyn Broadcaster, sig: &str, attempts: u32, -) -> SettlementResult { +) -> Result { let send_policy = SKIP_PREFLIGHT_SEND; for _ in 0..attempts { match broadcaster.confirm(sig).await { @@ -450,7 +539,9 @@ async fn confirm_settlement( error = %err, "settlement failed on-chain (store will reconcile)", ); - return Err(format!("settlement {sig} failed on-chain: {err}")); + return Err(ConfirmFailure::OnChain(format!( + "settlement {sig} failed on-chain: {err}" + ))); } Err(e) => { tracing::debug!(tx = %sig, error = %e, "confirm poll error"); @@ -465,7 +556,9 @@ async fn confirm_settlement( skip_preflight = send_policy.skip_preflight, "settlement not confirmed in window", ); - Err(format!("settlement {sig} was not confirmed in its window")) + Err(ConfirmFailure::Unconfirmed(format!( + "settlement {sig} was not confirmed in its window" + ))) } /// Production broadcaster backed by the shared asynchronous RPC pipeline. @@ -563,6 +656,14 @@ mod tests { seq: Mutex, /// When set, every confirmation reports this on-chain failure. confirm_failure: Mutex>, + /// A transaction touching this account fails on-chain. + poison: Mutex>, + /// Sends in progress, and the most seen at once. + sending: std::sync::atomic::AtomicUsize, + max_sending: std::sync::atomic::AtomicUsize, + /// How long each send takes. + send_delay: Mutex, + failing: Mutex>, } #[async_trait] impl Broadcaster for MockBroadcaster { @@ -570,15 +671,35 @@ mod tests { Ok(Hash::new_from_array([9u8; 32])) } async fn send(&self, tx: &VersionedTransaction) -> Result { + use std::sync::atomic::Ordering::SeqCst; + let now = self.sending.fetch_add(1, SeqCst) + 1; + self.max_sending.fetch_max(now, SeqCst); + let delay = *self.send_delay.lock().unwrap(); + tokio::time::sleep(delay).await; + self.sending.fetch_sub(1, SeqCst); self.sent .lock() .unwrap() .push(tx.message.instructions().len()); let mut seq = self.seq.lock().unwrap(); *seq += 1; - Ok(format!("sig{seq}")) + let sig = format!("sig{seq}"); + let keys = tx.message.static_account_keys(); + if self + .poison + .lock() + .unwrap() + .iter() + .any(|poison| keys.contains(poison)) + { + self.failing.lock().unwrap().insert(sig.clone()); + } + Ok(sig) } - async fn confirm(&self, _sig: &str) -> Result { + async fn confirm(&self, sig: &str) -> Result { + if self.failing.lock().unwrap().contains(sig) { + return Ok(ConfirmOutcome::Failed("InstructionError(0)".to_string())); + } Ok(match self.confirm_failure.lock().unwrap().clone() { Some(error) => ConfirmOutcome::Failed(error), None => ConfirmOutcome::Confirmed, @@ -655,6 +776,99 @@ mod tests { ); } + /// One channel whose settlement fails on-chain fails the transaction it + /// was packed into; the others are re-sent alone and land. + #[tokio::test] + async fn a_failing_channel_does_not_fail_the_channels_packed_with_it() { + let (h, bc) = handle(4, 50); + let poison = unit_instructions(1)[0].accounts[0].pubkey; + *bc.poison.lock().unwrap() = vec![poison]; + + let mut tasks = Vec::new(); + for i in 0..3u64 { + let h = h.clone(); + tasks.push(tokio::spawn(async move { + h.settle_confirmed(format!("c{i}"), unit_instructions(i)) + .await + })); + } + let outcomes: Vec<_> = join_settlements(tasks).await; + assert!(outcomes[0].is_ok(), "{:?}", outcomes[0]); + assert!( + outcomes[1] + .as_ref() + .is_err_and(|e| e.contains("failed on-chain")), + "{:?}", + outcomes[1] + ); + assert!(outcomes[2].is_ok(), "{:?}", outcomes[2]); + // The packed attempt, then one transaction per channel. + assert_eq!(bc.sent.lock().unwrap().clone(), vec![3, 1, 1, 1]); + + // Positive control: without a failing channel the pack lands as one. + bc.poison.lock().unwrap().clear(); + bc.sent.lock().unwrap().clear(); + let mut tasks = Vec::new(); + for i in 10..13u64 { + let h = h.clone(); + tasks.push(tokio::spawn(async move { + h.settle_confirmed(format!("c{i}"), unit_instructions(i)) + .await + })); + } + assert!(join_settlements(tasks).await.iter().all(Result::is_ok)); + assert_eq!(bc.sent.lock().unwrap().clone(), vec![3]); + } + + /// Re-sending each channel of a failed pack alone still counts against + /// `max_in_flight_tx`: two packs failing at once never send more than + /// the bound together. + #[tokio::test] + async fn settling_alone_stays_within_the_in_flight_bound() { + let bc = Arc::new(MockBroadcaster::default()); + *bc.send_delay.lock().unwrap() = Duration::from_millis(30); + let mut cfg = SettlementConfig::new( + Pubkey::new_from_array([0xAA; 32]), + Arc::new(TestSigner(Pubkey::new_from_array([0xAA; 32]))), + ); + cfg.max_voucher_settlements_per_tx = 2; + cfg.linger = Duration::from_millis(5_000); + cfg.max_in_flight_tx = 1; + let h = spawn(cfg, bc.clone()); + // One failing channel in each of two packs. + *bc.poison.lock().unwrap() = vec![ + unit_instructions(0)[0].accounts[0].pubkey, + unit_instructions(2)[0].accounts[0].pubkey, + ]; + let mut tasks = Vec::new(); + for i in 0..4u64 { + let h = h.clone(); + tasks.push(tokio::spawn(async move { + h.settle_confirmed(format!("c{i}"), unit_instructions(i)) + .await + })); + } + let outcomes = join_settlements(tasks).await; + assert!(outcomes[1].is_ok() && outcomes[3].is_ok(), "{outcomes:?}"); + // Two packs, then each of the four channels alone. + assert_eq!(bc.sent.lock().unwrap().len(), 6); + assert_eq!( + bc.max_sending.load(std::sync::atomic::Ordering::SeqCst), + 1, + "never more sends at once than max_in_flight_tx" + ); + } + + async fn join_settlements( + tasks: Vec>, + ) -> Vec { + let mut out = Vec::new(); + for task in tasks { + out.push(task.await.unwrap()); + } + out + } + #[tokio::test] async fn timer_flushes_partial_batch() { let (h, bc) = handle(10, 120); // cap high → only the timer flushes diff --git a/rust/crates/kit/src/core/store.rs b/rust/crates/kit/src/core/store.rs index 2f9cf13e7..55aa3fc84 100644 --- a/rust/crates/kit/src/core/store.rs +++ b/rust/crates/kit/src/core/store.rs @@ -401,8 +401,10 @@ pub enum PendingClaim { /// /// It is also the floor for how long a [`Store`] keeps charge records and /// [`ConsumedSignatures`] claims: an MPP server accepting push credentials -/// refuses any challenge that expires later than this from now, so a paid -/// signature cannot outlive its replay record. +/// refuses any challenge that expires later than this from now, and any +/// pushed transaction confirmed longer ago than this, so a paid signature +/// cannot outlive its replay record. A store that loses its records (an +/// in-memory store across a restart) still reopens that window. pub const DEFAULT_CHARGE_RECORD_RETENTION: Duration = Duration::from_secs(24 * 60 * 60); /// How long a charge record may sit in [`ChargeRecordState::Reserved`] @@ -1331,6 +1333,23 @@ pub enum ObservedLifecycle { Terminal { started_at: Option }, } +impl ObservedLifecycle { + /// The lifecycle a confirmed read of a payment-channel account shows, + /// from its `status` and `closure_started_at` fields. `now` stands in + /// for a close the account reports without a start time. + pub fn of_channel(status: u8, closure_started_at: i64, now: u64) -> Self { + const OPEN: u8 = 0; + const CLOSING: u8 = 2; + let started_at = (closure_started_at != 0 || status != OPEN) + .then(|| u64::try_from(closure_started_at).unwrap_or(now).max(1)); + match (status, started_at) { + (OPEN | CLOSING, Some(started_at)) => Self::Closing { started_at }, + (OPEN, None) => Self::Open, + (_, started_at) => Self::Terminal { started_at }, + } + } +} + /// One onchain read of a channel; see [`ChannelState::record_onchain_observation`]. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct OnchainObservation { diff --git a/rust/crates/kit/src/core/tx_pipeline.rs b/rust/crates/kit/src/core/tx_pipeline.rs index 853ab368f..36b48f4ce 100644 --- a/rust/crates/kit/src/core/tx_pipeline.rs +++ b/rust/crates/kit/src/core/tx_pipeline.rs @@ -99,6 +99,13 @@ pub enum TxPipelineError { FinalizationTimeout { signature: Signature }, #[error("RPC submission and confirmation failed for transaction {signature}")] SubmissionFailed { signature: Signature }, + #[error("transaction {signature} failed simulation: {reason}")] + SimulationFailed { + signature: Signature, + reason: String, + }, + #[error("simulation of transaction {signature} could not be completed")] + SimulationUnavailable { signature: Signature }, #[error("transaction submission guard rejected the attempt")] SubmissionGuardRejected, #[error("confirmed account read failed after bounded retries")] @@ -201,7 +208,9 @@ impl TxPipeline { /// already been verified locally, then await confirmed commitment. /// /// Only this API skips preflight. Callers must not pass arbitrary client - /// transactions without first performing byte-exact validation. + /// transactions without first performing byte-exact validation, and a + /// client transaction the server pays the fee for goes through + /// [`Self::simulate`] and [`Self::submit_simulated`] instead. pub async fn submit_verified( &self, transaction: &VersionedTransaction, @@ -376,6 +385,32 @@ impl TxPipeline { min_context_slot: u64, expected_owner: Pubkey, ) -> PipelineResult>> { + self.read_owned_account_at(address, "finalized", min_context_slot, expected_owner) + .await + .map(|(data, _)| data) + } + + /// Read program state at confirmed commitment from a bank at or after + /// `min_context_slot`, with the slot of the bank that answered, so the + /// caller can refuse to let an older view replace a newer one. Ownership + /// is checked on the same observation; a missing account returns `None`. + pub async fn read_confirmed_owned_account_data_at( + &self, + address: Pubkey, + min_context_slot: u64, + expected_owner: Pubkey, + ) -> PipelineResult<(Option>, u64)> { + self.read_owned_account_at(address, "confirmed", min_context_slot, expected_owner) + .await + } + + async fn read_owned_account_at( + &self, + address: Pubkey, + commitment: &str, + min_context_slot: u64, + expected_owner: Pubkey, + ) -> PipelineResult<(Option>, u64)> { let response: solana_rpc_client_api::response::Response< Option, > = self @@ -385,7 +420,7 @@ impl TxPipeline { RpcRequest::GetAccountInfo, serde_json::json!([ address.to_string(), { - "commitment": "finalized", + "commitment": commitment, "minContextSlot": min_context_slot, "encoding": "base64", } @@ -393,11 +428,12 @@ impl TxPipeline { ) .await .map_err(|_| TxPipelineError::AccountReadFailed)?; - if response.context.slot < min_context_slot { + let slot = response.context.slot; + if slot < min_context_slot { return Err(TxPipelineError::AccountReadFailed); } let Some(account) = response.value else { - return Ok(None); + return Ok((None, slot)); }; let account = account .to_account() @@ -405,7 +441,7 @@ impl TxPipeline { if account.owner.to_bytes() != expected_owner.to_bytes() { return Err(TxPipelineError::AccountOwnerMismatch { address }); } - Ok(Some(account.data)) + Ok((Some(account.data), slot)) } /// Read one account at confirmed commitment, optionally requiring the RPC @@ -590,6 +626,82 @@ impl TxPipeline { } } +/// A signed transaction whose exact bytes executed successfully in a +/// simulation against confirmed state, or whose signature already landed. +/// +/// Only [`TxPipeline::simulate`] issues one and +/// [`TxPipeline::submit_simulated`] takes it. A sponsor that co-signs a +/// client's transaction pays its fee even when it fails on-chain, and a +/// shape check cannot show that the client can fund it, so such a +/// transaction is broadcast only through this proof. +#[derive(Debug, Clone)] +pub struct SimulatedTransaction { + transaction: VersionedTransaction, +} + +impl SimulatedTransaction { + /// The simulated transaction. + pub fn transaction(&self) -> &VersionedTransaction { + &self.transaction + } +} + +impl TxPipeline { + /// Simulate the fully signed `transaction` at confirmed commitment with + /// signature verification and its own recent blockhash. + /// + /// A failed simulation of a transaction whose signature has already + /// landed (a retry whose first response was lost) still yields the proof: + /// rebroadcasting it cannot charge its fee payer again. + pub async fn simulate( + &self, + transaction: VersionedTransaction, + ) -> PipelineResult { + let signature = *transaction + .signatures + .first() + .ok_or(TxPipelineError::MissingSignature)?; + let unavailable = TxPipelineError::SimulationUnavailable { signature }; + let encoded = crate::core::tx::encode(&transaction).map_err(|_| unavailable.clone())?; + let response: serde_json::Value = self + .inner + .rpc + .send( + RpcRequest::SimulateTransaction, + serde_json::json!([encoded, { + "encoding": "base64", + "commitment": "confirmed", + "sigVerify": true, + "replaceRecentBlockhash": false, + }]), + ) + .await + .map_err(|_| unavailable.clone())?; + let value = response.get("value").ok_or(unavailable)?; + match value.get("err") { + None | Some(serde_json::Value::Null) => Ok(SimulatedTransaction { transaction }), + Some(error) => { + if self.landed_slot(signature).await?.is_some() { + return Ok(SimulatedTransaction { transaction }); + } + Err(TxPipelineError::SimulationFailed { + signature, + reason: error.to_string(), + }) + } + } + } + + /// [`Self::submit_verified`] for a transaction that passed + /// [`Self::simulate`]. + pub async fn submit_simulated( + &self, + simulated: &SimulatedTransaction, + ) -> PipelineResult { + self.submit_verified(&simulated.transaction).await + } +} + async fn run_confirmation_tracker( rpc: Arc, config: TxPipelineConfig, @@ -1357,4 +1469,91 @@ mod tests { rpc.abort(); } } + + mod simulation { + use super::*; + + /// `simulateTransaction` reports `simulation_err`; the signature has + /// landed when `landed` is set. Counts every `sendTransaction`. + async fn simulating_rpc( + simulation_err: Value, + landed: bool, + ) -> (String, Arc, tokio::task::JoinHandle<()>) { + let sends = Arc::new(AtomicUsize::new(0)); + let counter = Arc::clone(&sends); + let app = Router::new().route( + "/", + post(move |Json(request): Json| { + let simulation_err = simulation_err.clone(); + let counter = Arc::clone(&counter); + async move { + let result = match request["method"].as_str().unwrap() { + "simulateTransaction" => { + assert_eq!(request["params"][1]["sigVerify"], true); + assert_eq!(request["params"][1]["replaceRecentBlockhash"], false); + json!({ "context": { "slot": 9 }, "value": { "err": simulation_err } }) + } + "getSignatureStatuses" => { + let status = landed.then(|| { + json!({ + "slot": 8, "confirmations": null, "err": null, + "confirmationStatus": "finalized", "status": { "Ok": null } + }) + }); + json!({ "context": { "slot": 9 }, "value": [status] }) + } + "sendTransaction" => { + counter.fetch_add(1, Ordering::SeqCst); + json!(Signature::default().to_string()) + } + method => panic!("unexpected RPC method {method}"), + }; + Json(json!({ "jsonrpc": "2.0", "id": request["id"], "result": result })) + } + }), + ); + let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); + let url = format!("http://{}", listener.local_addr().unwrap()); + let server = tokio::spawn(async move { axum::serve(listener, app).await.unwrap() }); + (url, sends, server) + } + + fn transaction() -> VersionedTransaction { + VersionedTransaction { + signatures: vec![Signature::new_unique()], + message: solana_message::VersionedMessage::Legacy(solana_message::Message::new( + &[], + Some(&Pubkey::new_unique()), + )), + } + } + + #[tokio::test] + async fn a_failing_simulation_yields_no_proof() { + let failure = json!({ "InstructionError": [0, { "Custom": 1 }] }); + let (url, sends, rpc) = simulating_rpc(failure, false).await; + let pipeline = TxPipeline::new(url, test_config()); + let error = pipeline.simulate(transaction()).await.unwrap_err(); + assert!( + matches!(error, TxPipelineError::SimulationFailed { .. }), + "{error:?}" + ); + assert_eq!(sends.load(Ordering::SeqCst), 0); + rpc.abort(); + } + + #[tokio::test] + async fn a_clean_or_already_landed_simulation_is_a_proof() { + for (simulation_err, landed) in + [(Value::Null, false), (json!("AlreadyProcessed"), true)] + { + let (url, _, rpc) = simulating_rpc(simulation_err, landed).await; + let pipeline = TxPipeline::new(url, test_config()); + let tx = transaction(); + let simulated = pipeline.simulate(tx.clone()).await.unwrap(); + assert_eq!(simulated.transaction().signatures, tx.signatures); + rpc.abort(); + } + } + } } diff --git a/rust/crates/kit/src/gate.rs b/rust/crates/kit/src/gate.rs index af57a449c..48b33b0c1 100644 --- a/rust/crates/kit/src/gate.rs +++ b/rust/crates/kit/src/gate.rs @@ -31,7 +31,7 @@ use std::sync::{Arc, Mutex}; -use axum::body::{to_bytes, Body, HttpBody}; +use axum::body::{to_bytes, Body}; use axum::extract::{FromRequestParts, Request, State}; use axum::handler::Handler; use axum::http::request::Parts; @@ -62,9 +62,6 @@ const PAYMENT_RECEIPT_HEADER: &str = "Payment-Receipt"; /// Marks a response whose authorization was already charged and served. const PAYMENT_REPLAY_HEADER: HeaderName = HeaderName::from_static("payment-replay"); -/// Avoid turning the channel store into an unbounded response-body cache. -const MAX_CACHED_RESPONSE_BYTES: u64 = 1024 * 1024; - /// Error returned when a [`PayKit`] can't be built from its config. #[derive(Debug)] pub enum PayKitError { @@ -997,20 +994,96 @@ async fn upto_gate_middleware( reference: open.channel_id.to_string(), }); req.extensions_mut().insert(charge); + // The channel is open from here on: if this request future is dropped + // (a client disconnect, a timeout layer) before the settlement below is + // spawned, the guard settles what was metered so the escrow and the fee + // payer's rent are not left in an open channel nothing remembers. + let open = OpenedUpto::new(&upto, open, cell.clone(), UPTO_SETTLEMENT_RETRY); // A lazy body may meter while it is polled, after the handler future has // returned, so the charge is read only once the body is complete. let metered = buffer_metered_response(next.run(req).await).await; // Recover from poisoning so a handler that panicked *after* recording a // charge still settles the amount it consumed (not a silent zero refund). - let actual = (*cell.lock().unwrap_or_else(|e| e.into_inner())).unwrap_or(0); + let actual = metered_charge(&cell); let metered = metered.map(|mut resp| { prevent_shared_caching(&mut resp); resp }); - ServedUpto::settle(&upto, open, actual, metered, UPTO_SETTLEMENT_RETRY) - .respond(&upto) - .await + ServedUpto::settle( + &upto, + open.into_open(), + actual, + metered, + UPTO_SETTLEMENT_RETRY, + ) + .respond(&upto) + .await +} + +/// The amount a handler metered, zero when it metered nothing. +fn metered_charge(cell: &Mutex>) -> u64 { + (*cell.lock().unwrap_or_else(|e| e.into_inner())).unwrap_or(0) +} + +/// An `upto` channel opened for a request whose settlement is not yet +/// spawned. Dropped without [`OpenedUpto::into_open`], it spawns the +/// settlement of what was metered so far, so a cancelled request cannot +/// strand the channel. +struct OpenedUpto { + upto: Arc, + open: Option, + cell: Arc>>, + retry: UptoSettlementRetry, +} + +impl OpenedUpto { + fn new( + upto: &Arc, + open: crate::x402::server::VerifiedUptoOpen, + cell: Arc>>, + retry: UptoSettlementRetry, + ) -> Self { + Self { + upto: Arc::clone(upto), + open: Some(open), + cell, + retry, + } + } + + /// Hand the open to the caller, which now owns its settlement. + fn into_open(mut self) -> crate::x402::server::VerifiedUptoOpen { + self.open.take().expect("taken only here") + } +} + +impl Drop for OpenedUpto { + fn drop(&mut self) { + let Some(open) = self.open.take() else { + return; + }; + let actual = metered_charge(&self.cell); + let upto = Arc::clone(&self.upto); + let retry = self.retry; + let channel = open.channel_id; + match tokio::runtime::Handle::try_current() { + Ok(runtime) => { + tracing::warn!( + channel = %channel, + actual, + "upto request dropped before settlement; settling what was metered" + ); + runtime.spawn(async move { + settle_served_upto(&upto, open, actual, retry).await; + }); + } + Err(_) => tracing::error!( + channel = %channel, + "upto request dropped outside a runtime; the channel is left open" + ), + } + } } /// A served `upto` request whose settlement already runs on its own task, so @@ -1567,35 +1640,15 @@ fn exact_memo(method: &Method, resource: &str) -> String { format!("{method} {}", bs58::encode(digest).into_string()) } -/// Answer a request whose authorization was already charged and served. -/// -/// The payment result is authoritative and is returned verbatim. When the -/// original resource response was cached, restore that representation too. +/// Answer a request whose authorization was already charged and served with +/// its settlement result only. The resource is never replayed: the voucher +/// that reaches this path is public once a claim publishes it or a corrective +/// 402 returns it, so it proves nothing about who sent the original request. fn replayed_response( batch: &X402BatchSettlement, settlement: &crate::x402::batch_settlement::BatchSettlementResponse, - cached: Option<&crate::core::store::CachedUpstreamResponse>, ) -> Response { - let mut resp = if let Some(cached) = cached { - let status = StatusCode::from_u16(cached.status).unwrap_or(StatusCode::OK); - let mut response = (status, cached.body.clone()).into_response(); - if let Some(content_type) = &cached.content_type { - if let Ok(value) = HeaderValue::from_str(content_type) { - response.headers_mut().insert(header::CONTENT_TYPE, value); - } - } - for (name, value) in &cached.headers { - if let (Ok(name), Ok(value)) = ( - HeaderName::from_bytes(name.as_bytes()), - HeaderValue::from_str(value), - ) { - response.headers_mut().append(name, value); - } - } - response - } else { - StatusCode::OK.into_response() - }; + let mut resp = StatusCode::OK.into_response(); prevent_shared_caching(&mut resp); resp.headers_mut() .insert(PAYMENT_REPLAY_HEADER, HeaderValue::from_static("true")); @@ -1603,80 +1656,6 @@ fn replayed_response( resp } -/// Headers whose meaning belongs to the stored representation rather than to -/// this particular transport hop or payment attempt. -fn is_replayable_response_header(name: &HeaderName) -> bool { - matches!( - name.as_str(), - "accept-ranges" - | "cache-control" - | "content-security-policy" - | "content-security-policy-report-only" - | "content-disposition" - | "content-encoding" - | "content-language" - | "content-location" - | "content-range" - | "cross-origin-embedder-policy" - | "cross-origin-opener-policy" - | "cross-origin-resource-policy" - | "etag" - | "expires" - | "last-modified" - | "location" - | "permissions-policy" - | "referrer-policy" - | "reporting-endpoints" - | "strict-transport-security" - | "vary" - | "x-content-type-options" - | "x-frame-options" - | "x-permitted-cross-domain-policies" - | "x-xss-protection" - ) -} - -/// Buffer a small, finite handler response so an authorization replay can -/// return the same representation. Streaming and large responses pass through -/// untouched and retain settlement-only replay semantics. -async fn cacheable_response( - response: Response, -) -> Result<(Response, Option), axum::Error> { - let size = response.body().size_hint(); - if size - .upper() - .is_none_or(|upper| upper > MAX_CACHED_RESPONSE_BYTES) - { - return Ok((response, None)); - } - - let (parts, body) = response.into_parts(); - let bytes = to_bytes(body, MAX_CACHED_RESPONSE_BYTES as usize).await?; - let content_type = parts - .headers - .get(header::CONTENT_TYPE) - .and_then(|value| value.to_str().ok()) - .map(ToOwned::to_owned); - let headers = parts - .headers - .iter() - .filter(|(name, _)| is_replayable_response_header(name)) - .filter_map(|(name, value)| { - value - .to_str() - .ok() - .map(|value| (name.as_str().to_owned(), value.to_owned())) - }) - .collect(); - let cached = crate::core::store::CachedUpstreamResponse { - status: parts.status.as_u16(), - content_type, - headers, - body: bytes.to_vec(), - }; - Ok((Response::from_parts(parts, Body::from(bytes)), Some(cached))) -} - /// High-throughput gate for x402 `batch-settlement`, under the scheme's /// `authorization` payment flow. /// @@ -1749,8 +1728,8 @@ async fn batch_gate_middleware( // Already charged and served. The client lost the response, not the // payment, so it gets the original result — never a second charge and // never a second execution. - BatchAccess::Replay(settlement, cached) => { - return replayed_response(&batch, &settlement, cached.as_ref()); + BatchAccess::Replay(settlement, _) => { + return replayed_response(&batch, &settlement); } // Another in-flight request owns this authorization. The retryable @@ -1771,7 +1750,7 @@ async fn batch_gate_middleware( // unfinished. Finishing it is the one safe continuation. BatchAccess::Resume(outcome) => { return match batch.finish_commit(&outcome).await { - Ok(settlement) => replayed_response(&batch, &settlement, None), + Ok(settlement) => replayed_response(&batch, &settlement), Err(e) => { tracing::error!(error = %e, "batch-settlement commit could not be resumed"); ( @@ -1834,17 +1813,6 @@ async fn batch_gate_middleware( return resp; } - let (mut resp, cached) = match cacheable_response(resp).await { - Ok(response) => response, - Err(error) => { - tracing::warn!(channel = %channel_id, error = %error, "could not buffer handler response for replay"); - ( - (StatusCode::BAD_GATEWAY, "resource response body failed").into_response(), - None, - ) - } - }; - // The crash boundary: past this point a retry may only finish the charge. // // A marker that fails to write is not a reason to abandon the charge. This @@ -1863,15 +1831,6 @@ async fn batch_gate_middleware( match commit_served_request(&batch, &outcome, &channel_id).await { Ok(settlement) => { - if let Some(cached) = cached { - if let Err(error) = batch.cache_response(&outcome, cached).await { - tracing::warn!( - channel = %channel_id, - error = %error, - "batch-settlement response cache write failed" - ); - } - } attach_settlement_header(&batch, &settlement, &mut resp); resp } @@ -2006,7 +1965,7 @@ where #[cfg(test)] mod tests { use super::*; - use axum::body::Body; + use axum::body::{Body, HttpBody}; use axum::Router; use tower::ServiceExt; // oneshot @@ -2981,6 +2940,50 @@ mod tests { ); } + /// A request dropped after its channel opened but before its settlement + /// was spawned still settles: the channel stays reserved by the spawned + /// settlement instead of being forgotten with the request future. + #[tokio::test(flavor = "multi_thread")] + async fn a_request_dropped_after_the_open_still_settles_its_channel() { + let pay = upto_paykit(); + let upto = pay.x402_upto().expect("signer enables upto").clone(); + let retry = UptoSettlementRetry { + inline_attempts: 2, + background_attempts: 1, + base_delay: std::time::Duration::from_millis(200), + }; + let channel = solana_pubkey::Pubkey::new_unique(); + let cell = Arc::new(Mutex::new(Some(300))); + drop(OpenedUpto::new( + &upto, + upto.test_open(channel, 1_000), + cell, + retry, + )); + assert!( + upto.is_in_flight(&channel), + "the dropped request's settlement holds the channel" + ); + for _ in 0..100 { + if !upto.is_in_flight(&channel) { + break; + } + tokio::time::sleep(std::time::Duration::from_millis(50)).await; + } + assert!(!upto.is_in_flight(&channel)); + + // Positive control: handed on for settlement, the guard spawns nothing. + let channel = solana_pubkey::Pubkey::new_unique(); + let opened = OpenedUpto::new( + &upto, + upto.test_open(channel, 1_000), + Arc::new(Mutex::new(None)), + retry, + ); + drop(opened.into_open()); + assert!(!upto.is_in_flight(&channel)); + } + /// A client disconnect during the inline retries drops the request future; /// the settlement keeps running and keeps the channel reserved. #[tokio::test(flavor = "multi_thread")] @@ -3143,6 +3146,110 @@ mod tests { responses } + /// The latest voucher of a channel is public (a claim publishes it, a + /// corrective 402 returns it), so presenting it again must not return + /// the payer's response body, and text a client put in its channel + /// config must not be able to request the corrective snapshot. + #[tokio::test(flavor = "multi_thread")] + async fn batch_replay_and_corrective_402_do_not_leak_the_payers_response() { + use crate::x402::batch_settlement::errors as codes; + + // A fresh challenge reads a blockhash; the corrective one reads none. + let (rpc_url, _) = mock_rpc(false).await; + let pay = exact_paykit(rpc_url, Some(test_signer())); + let (channel_id, header) = batch_paid_request(&pay).await; + let handler = || async { "victim-secret" }; + let app: Router = Router::new().route("/orders", paid_batch_post(handler, "0.001", &pay)); + let post = |header: String| { + let app = app.clone(); + async move { + app.oneshot( + Request::builder() + .method("POST") + .uri("/orders") + .header(PAYMENT_SIGNATURE_HEADER, header) + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap() + } + }; + let body_of = |resp: Response| async move { + String::from_utf8(to_bytes(resp.into_body(), 1 << 20).await.unwrap().to_vec()).unwrap() + }; + let edited = |edit: &dyn Fn(&mut serde_json::Value)| { + use base64::Engine as _; + let engine = base64::engine::general_purpose::STANDARD; + let mut value: serde_json::Value = + serde_json::from_slice(&engine.decode(&header).unwrap()).unwrap(); + edit(&mut value); + engine.encode(serde_json::to_vec(&value).unwrap()) + }; + let challenge_of = |resp: &Response| -> serde_json::Value { + use base64::Engine as _; + let encoded = resp.headers()["payment-required"].to_str().unwrap(); + serde_json::from_slice( + &base64::engine::general_purpose::STANDARD + .decode(encoded) + .unwrap(), + ) + .unwrap() + }; + + let served = post(header.clone()).await; + assert_eq!(served.status(), StatusCode::OK); + assert_eq!(body_of(served).await, "victim-secret"); + + // Resending the committed voucher replays the settlement only. + let replay = post(header.clone()).await; + assert_eq!(replay.status(), StatusCode::OK); + assert_eq!(replay.headers()[PAYMENT_REPLAY_HEADER], "true"); + assert!(!body_of(replay).await.contains("victim-secret")); + + // A mismatch code planted in a client-supplied field is not the + // server's mismatch: no snapshot, and the raised code is reported. + let injected = post(edited(&|value| { + value["payload"]["channelConfig"]["receiver"] = + codes::INVALID_CUMULATIVE_AMOUNT_MISMATCH.into(); + })) + .await; + assert_eq!(injected.status(), StatusCode::PAYMENT_REQUIRED); + let challenge = challenge_of(&injected); + assert_eq!(challenge["error"], codes::INVALID_CHANNEL_STATE); + assert!(challenge["accepts"][0]["extra"] + .get("voucherState") + .is_none()); + + // Positive control: a genuine mismatch still resynchronizes the client. + let skipped = { + use ed25519_dalek::Signer as _; + let channel = channel_id.parse().unwrap(); + let message = crate::core::payment_channels::voucher_message_bytes( + &channel, + 5_000, + crate::x402::batch_settlement::VOUCHER_EXPIRES_AT, + ) + .unwrap(); + let key = ed25519_dalek::SigningKey::from_bytes(&[22u8; 32]); + bs58::encode(key.sign(&message).to_bytes()).into_string() + }; + let stale = post(edited(&|value| { + value["payload"]["voucher"]["maxClaimableAmount"] = "5000".into(); + value["payload"]["voucher"]["signature"] = skipped.clone().into(); + })) + .await; + assert_eq!(stale.status(), StatusCode::PAYMENT_REQUIRED); + let challenge = challenge_of(&stale); + assert_eq!( + challenge["error"], + codes::INVALID_CUMULATIVE_AMOUNT_MISMATCH + ); + assert!(challenge["accepts"][0]["extra"] + .get("channelState") + .is_some()); + } + /// A state-changing handler that answers with a redirect is charged, so /// the same voucher cannot run it a second time for free. #[tokio::test(flavor = "multi_thread")] @@ -3171,10 +3278,12 @@ mod tests { let responses = post_twice(app, &header).await; assert_eq!(responses[0].status(), StatusCode::SEE_OTHER); assert!(responses[0].headers().contains_key(PAYMENT_RESPONSE_HEADER)); - // The retry replays the committed redirect instead of re-running it. - assert_eq!(responses[1].status(), StatusCode::SEE_OTHER); + // The retry replays the committed settlement instead of re-running + // the handler; the representation itself is not replayed. + assert_eq!(responses[1].status(), StatusCode::OK); assert_eq!(responses[1].headers()[PAYMENT_REPLAY_HEADER], "true"); - assert_eq!(responses[1].headers()[header::LOCATION], "/orders/created"); + assert!(responses[1].headers().contains_key(PAYMENT_RESPONSE_HEADER)); + assert!(!responses[1].headers().contains_key(header::LOCATION)); assert_eq!(executions.load(Ordering::SeqCst), 1); let state = pay @@ -3209,9 +3318,7 @@ mod tests { let app: Router = Router::new().route("/orders", paid_batch_post(handler, "0.001", &pay)); let responses = post_twice(app, &header).await; - assert!(responses - .iter() - .all(|r| r.status() == StatusCode::SERVICE_UNAVAILABLE)); + assert_eq!(responses[0].status(), StatusCode::SERVICE_UNAVAILABLE); assert_eq!(responses[1].headers()[PAYMENT_REPLAY_HEADER], "true"); assert_eq!(executions.load(Ordering::SeqCst), 1); let state = pay @@ -4148,62 +4255,4 @@ mod tests { assert!(!resp.headers().contains_key(PAYMENT_RESPONSE_HEADER)); assert_eq!(served.load(std::sync::atomic::Ordering::SeqCst), 0); } - - #[tokio::test] - async fn batch_response_cache_keeps_representation_headers_only() { - let mut response = (StatusCode::TEMPORARY_REDIRECT, "moved").into_response(); - response - .headers_mut() - .insert(header::LOCATION, HeaderValue::from_static("/destination")); - response.headers_mut().insert( - header::CONTENT_DISPOSITION, - HeaderValue::from_static("attachment; filename=report.txt"), - ); - response.headers_mut().insert( - HeaderName::from_static("content-security-policy"), - HeaderValue::from_static("default-src 'none'"), - ); - response.headers_mut().insert( - HeaderName::from_static("x-content-type-options"), - HeaderValue::from_static("nosniff"), - ); - response.headers_mut().insert( - HeaderName::from_static("x-frame-options"), - HeaderValue::from_static("DENY"), - ); - response - .headers_mut() - .insert(header::CONNECTION, HeaderValue::from_static("close")); - response.headers_mut().insert( - HeaderName::from_static("payment-response"), - HeaderValue::from_static("attempt-specific"), - ); - - let (_, cached) = cacheable_response(response).await.unwrap(); - let cached = cached.expect("small finite response is cached"); - assert_eq!(cached.status, StatusCode::TEMPORARY_REDIRECT.as_u16()); - assert!(cached - .headers - .contains(&("location".to_string(), "/destination".to_string()))); - assert!(cached.headers.contains(&( - "content-disposition".to_string(), - "attachment; filename=report.txt".to_string() - ))); - assert!(cached.headers.contains(&( - "content-security-policy".to_string(), - "default-src 'none'".to_string() - ))); - assert!(cached - .headers - .contains(&("x-content-type-options".to_string(), "nosniff".to_string()))); - assert!(cached - .headers - .contains(&("x-frame-options".to_string(), "DENY".to_string()))); - assert!(!cached.headers.iter().any(|(name, _)| name == "connection")); - assert!(!cached - .headers - .iter() - .any(|(name, _)| name == "payment-response")); - assert_eq!(cached.body, b"moved"); - } } diff --git a/rust/crates/kit/src/mpp/client/charge.rs b/rust/crates/kit/src/mpp/client/charge.rs index 98a688582..a7bce44c4 100644 --- a/rust/crates/kit/src/mpp/client/charge.rs +++ b/rust/crates/kit/src/mpp/client/charge.rs @@ -86,10 +86,11 @@ pub struct BuildChargeTransactionOptions { pub expected_recipient: Option, /// What to do when the signer is the fee payer and a split sets /// `ataCreationRequired`. The charge spec says the client MUST include - /// the ATA creation, so the default funds it; [`PayerFundedAtaCreation::Decline`] - /// refuses the whole challenge instead (never a transaction without it). - /// The rent is not counted against `max_amount_base_units`, so callers - /// that auto-pay untrusted challenges should decline, as `PayKitClient` does. + /// the ATA creation, and the rent is spent on top of `amount`, outside + /// `max_amount_base_units`. The default, [`PayerFundedAtaCreation::Decline`], + /// refuses the whole challenge (never a transaction without the creation); + /// [`PayerFundedAtaCreation::Include`] funds it for a server the caller + /// trusts to name split recipients. pub payer_funded_ata_creation: PayerFundedAtaCreation, /// Bounded compute-unit price/limit for the prepared /// transaction. Defaults match the historical hardcoded budget (1 @@ -103,15 +104,15 @@ pub struct BuildChargeTransactionOptions { /// /// The charge spec obliges the client: when it pays the fees it "MUST include /// one for each split whose entry sets `ataCreationRequired: true`". The rent -/// is spent on top of the charged amount, so a wallet that will not fund it -/// declines the challenge. There is no variant that builds the transaction -/// without the creation instruction. +/// is spent on top of the charged amount and goes to accounts the challenge +/// names, so a wallet declines unless its caller opts in. There is no variant +/// that builds the transaction without the creation instruction. #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub enum PayerFundedAtaCreation { - /// Include the ATA creation instructions and fund their rent (spec default). - #[default] + /// Include the ATA creation instructions and fund their rent. Include, /// Refuse the challenge with [`Error::PayerFundedAtaCreationDeclined`]. + #[default] Decline, } @@ -2789,7 +2790,10 @@ mod tests { USDC_MINT, RECIPIENT, &md, - &BuildChargeTransactionOptions::default(), + &BuildChargeTransactionOptions { + payer_funded_ata_creation: PayerFundedAtaCreation::Include, + ..Default::default() + }, ) .await .unwrap_err(); @@ -4184,19 +4188,64 @@ mod tests { .count() } - // RULINGS C5: with the client as fee payer, `ataCreationRequired` obliges - // the client to include the creation. Regression: the default used to - // refuse the challenge. + // The rent for split ATAs the client funds sits outside any amount cap + // and goes to accounts the challenge names, so the default declines + // (RULINGS C5: declining is conformant), even with an amount cap set. #[tokio::test] - async fn build_charge_includes_payer_funded_split_ata_by_default() { + async fn build_charge_declines_payer_funded_split_ata_by_default() { let signer = make_signer(); let rpc = dummy_rpc(); let md = ata_split_details(None); - let payload = + let err = build_charge_transaction(signer.as_ref(), &rpc, "1000000", USDC_MINT, RECIPIENT, &md) .await - .unwrap(); + .unwrap_err(); + assert!( + matches!(err, crate::mpp::Error::PayerFundedAtaCreationDeclined), + "{err:?}" + ); + let err = build_charge_transaction_with_options( + signer.as_ref(), + &rpc, + "1000000", + USDC_MINT, + RECIPIENT, + &md, + BuildChargeTransactionOptions { + max_amount_base_units: Some(1_000_000), + ..Default::default() + }, + ) + .await + .unwrap_err(); + assert!( + matches!(err, crate::mpp::Error::PayerFundedAtaCreationDeclined), + "{err:?}" + ); + } + + // RULINGS C5: a caller that opts in gets every flagged creation. + #[tokio::test] + async fn build_charge_includes_payer_funded_split_ata_on_opt_in() { + let signer = make_signer(); + let rpc = dummy_rpc(); + let md = ata_split_details(None); + + let payload = build_charge_transaction_with_options( + signer.as_ref(), + &rpc, + "1000000", + USDC_MINT, + RECIPIENT, + &md, + BuildChargeTransactionOptions { + payer_funded_ata_creation: PayerFundedAtaCreation::Include, + ..Default::default() + }, + ) + .await + .unwrap(); assert_eq!(ata_create_count(&payload), 8); } diff --git a/rust/crates/kit/src/mpp/client/http_stream.rs b/rust/crates/kit/src/mpp/client/http_stream.rs index 01f9d7a75..861a79dc5 100644 --- a/rust/crates/kit/src/mpp/client/http_stream.rs +++ b/rust/crates/kit/src/mpp/client/http_stream.rs @@ -35,13 +35,26 @@ struct PartialSseEvent { retry: Option, } +/// Longest SSE line [`SseDecoder`] buffers while waiting for its newline. +pub const MAX_SSE_LINE_BYTES: usize = 1024 * 1024; + +/// Largest event [`SseDecoder`] assembles from its `data` lines. +pub const MAX_SSE_EVENT_BYTES: usize = 1024 * 1024; + +/// Largest commit-endpoint response [`HttpCommitTransport`] reads. +const MAX_COMMIT_RESPONSE_BYTES: usize = 64 * 1024; + /// Incremental SSE decoder. /// /// Feed raw HTTP chunks with [`push_chunk`](Self::push_chunk). It returns all /// complete events decoded from that chunk and retains partial data internally. +/// A line longer than [`MAX_SSE_LINE_BYTES`] or an event larger than +/// [`MAX_SSE_EVENT_BYTES`] is an error, so a stream cannot grow the buffer +/// without bound. #[derive(Default)] pub struct SseDecoder { - buffer: String, + /// Bytes of the line in progress; never holds a newline. + buffer: Vec, current: PartialSseEvent, } @@ -51,32 +64,44 @@ impl SseDecoder { } pub fn push_chunk(&mut self, chunk: &[u8]) -> Result> { - let text = std::str::from_utf8(chunk) - .map_err(|e| Error::Other(format!("SSE chunk is not valid UTF-8: {e}")))?; - self.buffer.push_str(text); - let mut events = vec![]; - while let Some(index) = self.buffer.find('\n') { - let mut line = self.buffer.drain(..=index).collect::(); - if line.ends_with('\n') { + let mut rest = chunk; + // Only the new bytes are scanned for a newline, and a line is decoded + // once it is complete, so a character split across chunks is intact. + while let Some(index) = rest.iter().position(|byte| *byte == b'\n') { + self.extend_line(&rest[..index])?; + rest = &rest[index + 1..]; + let mut line = std::mem::take(&mut self.buffer); + if line.last() == Some(&b'\r') { line.pop(); } - if line.ends_with('\r') { - line.pop(); - } - if let Some(event) = self.process_line(&line)? { + if let Some(event) = self.process_line(&decode_line(line)?)? { events.push(event); } } + self.extend_line(rest)?; Ok(events) } + fn extend_line(&mut self, bytes: &[u8]) -> Result<()> { + if self.buffer.len() + bytes.len() > MAX_SSE_LINE_BYTES { + return Err(Error::Other(format!( + "SSE line exceeds {MAX_SSE_LINE_BYTES} bytes" + ))); + } + self.buffer.extend_from_slice(bytes); + Ok(()) + } + /// Flush an incomplete final event, if any, at EOF. pub fn finish(&mut self) -> Result> { let mut events = vec![]; if !self.buffer.is_empty() { - let line = std::mem::take(&mut self.buffer); - if let Some(event) = self.process_line(line.trim_end_matches('\r'))? { + let mut line = std::mem::take(&mut self.buffer); + if line.last() == Some(&b'\r') { + line.pop(); + } + if let Some(event) = self.process_line(&decode_line(line)?)? { events.push(event); } } @@ -102,6 +127,11 @@ impl SseDecoder { match field { "event" => self.current.event = Some(value.to_string()), "data" => { + if self.current.data.len() + value.len() + 1 > MAX_SSE_EVENT_BYTES { + return Err(Error::Other(format!( + "SSE event data exceeds {MAX_SSE_EVENT_BYTES} bytes" + ))); + } if !self.current.data.is_empty() { self.current.data.push('\n'); } @@ -135,6 +165,28 @@ impl SseDecoder { } } +fn decode_line(line: Vec) -> Result { + String::from_utf8(line).map_err(|e| Error::Other(format!("SSE line is not valid UTF-8: {e}"))) +} + +/// Read at most `limit` bytes of `response`, failing past it. +async fn read_capped(mut response: reqwest::Response, limit: usize) -> Result> { + let mut body = Vec::new(); + while let Some(chunk) = response + .chunk() + .await + .map_err(|e| Error::Other(format!("commit response read failed: {e}")))? + { + if body.len() + chunk.len() > limit { + return Err(Error::Other(format!( + "commit response exceeds {limit} bytes" + ))); + } + body.extend_from_slice(&chunk); + } + Ok(body) +} + /// Parsed metered SSE event. #[derive(Debug, Clone, PartialEq)] pub enum MeteredSseEvent { @@ -367,15 +419,17 @@ impl CommitTransport for HttpCommitTransport { .map_err(|e| Error::Other(format!("commit request failed: {e}")))?; let status = response.status(); if !status.is_success() { - let body = response.text().await.unwrap_or_default(); + let body = read_capped(response, MAX_COMMIT_RESPONSE_BYTES) + .await + .map(|body| String::from_utf8_lossy(&body).into_owned()) + .unwrap_or_default(); return Err(Error::Other(format!( "commit endpoint returned {status}: {body}" ))); } - response - .json::() - .await + let body = read_capped(response, MAX_COMMIT_RESPONSE_BYTES).await?; + serde_json::from_slice::(&body) .map_err(|e| Error::Other(format!("invalid commit receipt: {e}"))) }) } @@ -503,6 +557,10 @@ mod tests { Box::new(MemorySigner::from_bytes(&kp).unwrap()) } + fn budget() -> super::super::session_consumer::MeteringBudget { + super::super::session_consumer::MeteringBudget::new(10_000, 100_000).unwrap() + } + fn directive(session_id: &str) -> MeteringDirective { MeteringDirective { delivery_id: "stream-1".to_string(), @@ -612,10 +670,66 @@ mod tests { #[test] fn sse_decoder_rejects_invalid_utf8() { - let err = SseDecoder::new().push_chunk(&[0xff]).unwrap_err(); + let err = SseDecoder::new().push_chunk(&[0xff, b'\n']).unwrap_err(); assert!(err.to_string().contains("valid UTF-8")); } + #[test] + fn sse_decoder_keeps_a_character_split_across_chunks() { + let mut decoder = SseDecoder::new(); + let text = "data: caf\u{e9}\n\n".as_bytes(); + let split = text.len() - 3; + assert!(decoder.push_chunk(&text[..split]).unwrap().is_empty()); + let events = decoder.push_chunk(&text[split..]).unwrap(); + assert_eq!(events[0].data, "caf\u{e9}"); + } + + #[test] + fn sse_decoder_bounds_an_unterminated_line() { + let mut decoder = SseDecoder::new(); + let chunk = vec![b'A'; 64 * 1024]; + let mut buffered = 0; + let err = loop { + match decoder.push_chunk(&chunk) { + Ok(events) => { + assert!(events.is_empty()); + buffered += chunk.len(); + assert!(buffered <= MAX_SSE_LINE_BYTES, "line grew past the cap"); + } + Err(err) => break err, + } + }; + assert!(err.to_string().contains("SSE line exceeds"), "{err}"); + + // A line at the cap still decodes. + let mut decoder = SseDecoder::new(); + let mut line = b"data: ".to_vec(); + line.resize(MAX_SSE_LINE_BYTES, b'A'); + assert!(decoder.push_chunk(&line).unwrap().is_empty()); + let events = decoder.push_chunk(b"\n\n").unwrap(); + assert_eq!(events[0].data.len(), MAX_SSE_LINE_BYTES - "data: ".len()); + } + + #[test] + fn sse_decoder_bounds_an_event_built_from_many_lines() { + let mut decoder = SseDecoder::new(); + let mut line = b"data: ".to_vec(); + line.extend(std::iter::repeat_n(b'A', 64 * 1024)); + line.push(b'\n'); + let mut pushed = 0; + let err = loop { + match decoder.push_chunk(&line) { + Ok(events) => { + assert!(events.is_empty()); + pushed += line.len(); + assert!(pushed <= 2 * MAX_SSE_EVENT_BYTES, "event grew past the cap"); + } + Err(err) => break err, + } + }; + assert!(err.to_string().contains("SSE event data exceeds"), "{err}"); + } + #[test] fn parse_metered_sse_events() { let metering = SseEvent { @@ -678,7 +792,7 @@ mod tests { let transport = RecordingTransport { commits: Mutex::new(vec![]), }; - let mut consumer = SessionConsumer::new(session, transport); + let mut consumer = SessionConsumer::new(session, transport, budget()); let mut stream = consumer.metered_sse::(); let directive = directive(&stream.consumer.session().channel_id_str()); @@ -723,7 +837,7 @@ mod tests { let transport = RecordingTransport { commits: Mutex::new(vec![]), }; - let mut consumer = SessionConsumer::new(session, transport); + let mut consumer = SessionConsumer::new(session, transport, budget()); let mut stream = consumer.metered_sse::(); let directive = directive(&stream.consumer.session().channel_id_str()); @@ -748,7 +862,7 @@ mod tests { let transport = RecordingTransport { commits: Mutex::new(vec![]), }; - let mut consumer = SessionConsumer::new(session, transport); + let mut consumer = SessionConsumer::new(session, transport, budget()); let stream = consumer.metered_sse::(); let err = stream.ack().await.unwrap_err(); assert!(err.to_string().contains("mpp.metering")); @@ -777,7 +891,7 @@ mod tests { let transport = RecordingTransport { commits: Mutex::new(vec![]), }; - let mut consumer = SessionConsumer::new(session, transport); + let mut consumer = SessionConsumer::new(session, transport, budget()); let mut stream = consumer.metered_sse::(); let directive = directive(&stream.consumer.session().channel_id_str()); assert_eq!(directive.amount, "1000"); @@ -816,6 +930,38 @@ mod tests { assert_eq!(consumer.session().cumulative, 1000); } + #[tokio::test] + async fn metered_sse_ack_refuses_a_reservation_past_the_budget() { + let session = super::super::session::ActiveSession::new(Pubkey::new_unique(), signer()); + let transport = RecordingTransport { + commits: Mutex::new(vec![]), + }; + let budget = super::super::session_consumer::MeteringBudget::new(500, 1_000).unwrap(); + let mut consumer = SessionConsumer::new(session, transport, budget); + let session_id = consumer.session().channel_id_str(); + let metering = |amount: &str| SseEvent { + event: Some("mpp.metering".to_string()), + data: serde_json::to_string(&MeteringDirective { + amount: amount.to_string(), + ..directive(&session_id) + }) + .unwrap(), + id: None, + retry: None, + }; + + let mut stream = consumer.metered_sse::(); + stream.accept_event(metering("501")).unwrap(); + let err = stream.ack().await.unwrap_err(); + assert!(err.to_string().contains("per-delivery budget"), "{err}"); + assert_eq!(consumer.session().cumulative, 0); + + let mut stream = consumer.metered_sse::(); + stream.accept_event(metering("500")).unwrap(); + assert_eq!(stream.ack().await.unwrap().cumulative, "500"); + assert_eq!(consumer.session().cumulative, 500); + } + #[tokio::test] async fn http_commit_transport_success_and_errors() { let state = CommitServerState::default(); @@ -826,6 +972,10 @@ mod tests { post(|| async { (StatusCode::INTERNAL_SERVER_ERROR, "commit failed") }), ) .route("/commit-invalid-json", post(|| async { "not json" })) + .route( + "/commit-oversized", + post(|| async { " ".repeat(MAX_COMMIT_RESPONSE_BYTES + 1) }), + ) .with_state(state.clone()); let base_url = spawn_app(app).await; @@ -860,10 +1010,17 @@ mod tests { let invalid_json = HttpCommitTransport::new() .with_default_commit_url(format!("{base_url}/commit-invalid-json")) - .commit(&directive, payload) + .commit(&directive, payload.clone()) .await .unwrap_err(); assert!(invalid_json.to_string().contains("invalid commit receipt")); + + let oversized = HttpCommitTransport::new() + .with_default_commit_url(format!("{base_url}/commit-oversized")) + .commit(&directive, payload) + .await + .unwrap_err(); + assert!(oversized.to_string().contains("commit response exceeds")); } #[tokio::test] @@ -901,7 +1058,7 @@ mod tests { let transport = HttpCommitTransport::new() .with_default_commit_url(format!("{base_url}/commit")) .with_authorization("Bearer sdk-test"); - let consumer = SessionConsumer::new(session, transport); + let consumer = SessionConsumer::new(session, transport, budget()); let response = reqwest::Client::new() .get(format!("{base_url}/stream")) .send() @@ -1008,7 +1165,7 @@ mod tests { let transport = HttpCommitTransport::new() .with_default_commit_url(format!("{legitimate_url}/commit")) .with_authorization("Bearer sdk-test"); - let mut consumer = SessionConsumer::new(session, transport); + let mut consumer = SessionConsumer::new(session, transport, budget()); let error = consumer.commit_directive(&directive).await.unwrap_err(); assert!(error.to_string().contains("does not match"), "{error}"); assert!(attacker.commits.lock().unwrap().is_empty()); @@ -1049,6 +1206,7 @@ mod tests { HttpCommitTransport::new() .with_default_commit_url(format!("{redirector}/commit")) .with_authorization("Bearer sdk-test"), + budget(), ); let error = consumer.commit_directive(&directive).await.unwrap_err(); assert!(error.to_string().contains("307"), "{error}"); @@ -1079,6 +1237,7 @@ mod tests { RecordingTransport { commits: Mutex::new(vec![]), }, + budget(), ); let stream = ReqwestMeteredSseStream::<_, Delta>::new(consumer, response); let consumer = stream.into_consumer(); diff --git a/rust/crates/kit/src/mpp/client/mod.rs b/rust/crates/kit/src/mpp/client/mod.rs index a0db49f7a..9e1fcfebc 100644 --- a/rust/crates/kit/src/mpp/client/mod.rs +++ b/rust/crates/kit/src/mpp/client/mod.rs @@ -24,9 +24,9 @@ pub use http_stream::*; pub use session::{ build_open_payment_channel_transaction, create_payment_channel_session_opener, derive_payment_channel_open, BuildOpenPaymentChannelTransactionParams, - DerivePaymentChannelOpenParams, PaymentChannelOpen, PaymentChannelOpenOptions, - PaymentChannelSessionOpen, PaymentChannelSessionOpenOptions, SessionPayout, - DEFAULT_GRACE_PERIOD_SECONDS, + DerivePaymentChannelOpenParams, OpenBlockhash, PaymentChannelOpen, PaymentChannelOpenOptions, + PaymentChannelSessionOpen, PaymentChannelSessionOpenOptions, SessionOpenAuthorization, + SessionPayout, DEFAULT_GRACE_PERIOD_SECONDS, MAX_SESSION_GRACE_PERIOD_SECONDS, }; pub use session_consumer::*; pub use subscription::{ diff --git a/rust/crates/kit/src/mpp/client/session.rs b/rust/crates/kit/src/mpp/client/session.rs index 8668f157a..901dda3b2 100644 --- a/rust/crates/kit/src/mpp/client/session.rs +++ b/rust/crates/kit/src/mpp/client/session.rs @@ -157,7 +157,16 @@ impl ActiveSession { /// Prepare a signed voucher adding `amount` without advancing the watermark. pub async fn prepare_increment(&self, amount: u64) -> Result { - self.prepare_voucher(self.cumulative + amount).await + self.prepare_voucher(self.incremented(amount)?).await + } + + fn incremented(&self, amount: u64) -> Result { + self.cumulative.checked_add(amount).ok_or_else(|| { + Error::Other(format!( + "voucher increment {amount} overflows the cumulative {}", + self.cumulative + )) + }) } /// Record a prepared voucher as accepted by the server. @@ -179,7 +188,7 @@ impl ActiveSession { /// Sign a voucher adding `amount` to the current cumulative. pub async fn sign_increment(&mut self, amount: u64) -> Result { - self.sign_voucher(self.cumulative + amount).await + self.sign_voucher(self.incremented(amount)?).await } /// Build a `SessionAction::Voucher` for an increment without advancing the @@ -383,7 +392,9 @@ pub struct PaymentChannelOpenOptions { /// `None` preserves the core transaction builder's defaults. Explicit /// budgets remain subject to the server's fee-sponsorship policy. pub compute_budget: Option, - pub deposit: Option, + /// Grace period to open with instead of the challenge's + /// `gracePeriodSeconds`. Either is bounded by the authorization's + /// [`SessionOpenAuthorization::max_grace_period`]. pub grace_period: Option, /// Override for the channel's open slot (the program's `openSlot`). /// Defaults to the challenge's `recentSlot`. An override MAY be earlier @@ -422,11 +433,78 @@ impl SessionPayout { } } +/// Longest grace period [`SessionOpenAuthorization`] accepts unless the +/// caller sets another (30 days). The grace period is how long the payer +/// waits, after asking to close, before it can withdraw what was not settled. +pub const MAX_SESSION_GRACE_PERIOD_SECONDS: u32 = 2_592_000; + +/// The escrow terms a caller authorizes for one channel open. +/// +/// A session challenge proposes a deposit, who signs vouchers and how long +/// the payer's exit takes; this decides which of them the client signs. The +/// deposit is the caller's, never the challenge's `suggestedDeposit`; an +/// operator-signed channel, whose operator can settle up to the whole +/// deposit with its own vouchers, needs that operator named here; and the +/// grace period is bounded. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct SessionOpenAuthorization { + deposit: u64, + operator: Option, + max_grace_period: u32, +} + +impl SessionOpenAuthorization { + /// Lock `deposit` base units in a channel whose vouchers the client signs. + /// A challenge asking for operator vouchers is refused. + pub fn client_signed(deposit: u64) -> Self { + Self { + deposit, + operator: None, + max_grace_period: MAX_SESSION_GRACE_PERIOD_SECONDS, + } + } + + /// Lock `deposit` base units and also accept a challenge whose vouchers + /// `operator` signs. That operator can settle up to the whole deposit, so + /// `deposit` is what the caller is prepared to pay it. + pub fn operator_signed(deposit: u64, operator: Pubkey) -> Self { + Self { + operator: Some(operator), + ..Self::client_signed(deposit) + } + } + + /// Replace the grace-period ceiling ([`MAX_SESSION_GRACE_PERIOD_SECONDS`] + /// by default). + pub fn with_max_grace_period(mut self, seconds: u32) -> Result { + if seconds == 0 { + return Err(Error::Other( + "maximum grace period must be greater than zero".to_string(), + )); + } + self.max_grace_period = seconds; + Ok(self) + } + + pub fn deposit(&self) -> u64 { + self.deposit + } + + pub fn operator(&self) -> Option { + self.operator + } + + pub fn max_grace_period(&self) -> u32 { + self.max_grace_period + } +} + #[derive(Debug, Clone)] pub struct DerivePaymentChannelOpenParams<'a> { pub request: &'a SessionRequest, pub payer: Pubkey, pub authorized_signer: Pubkey, + pub authorization: &'a SessionOpenAuthorization, pub options: PaymentChannelOpenOptions, } @@ -458,19 +536,27 @@ pub fn derive_payment_channel_open( "mint", )?; let payee = parse_pubkey(&request.recipient, "recipient")?; - let deposit = match params.options.deposit { - Some(deposit) => deposit, - None => parse_u64_string( - request - .suggested_deposit - .as_deref() - .or(request.minimum_deposit.as_deref()) - .ok_or_else(|| { - Error::Other("session challenge missing suggestedDeposit".to_string()) - })?, - "suggestedDeposit", - )?, - }; + let authorization = params.authorization; + if details.voucher_signer == Some(SessionVoucherSigner::Operator) { + let operator = parse_pubkey( + details.operator.as_deref().ok_or_else(|| { + Error::Other("operator is required for operator vouchers".to_string()) + })?, + "operator", + )?; + if authorization.operator != Some(operator) { + return Err(Error::Other(format!( + "session challenge asks for vouchers signed by operator {operator}, which the \ + caller did not authorize" + ))); + } + if params.authorized_signer != operator { + return Err(Error::Other( + "authorized signer is not the challenge's operator".to_string(), + )); + } + } + let deposit = authorization.deposit; if request .minimum_deposit .as_deref() @@ -485,6 +571,12 @@ pub fn derive_payment_channel_open( .grace_period .or(details.grace_period_seconds) .ok_or_else(|| Error::Other("session challenge missing gracePeriodSeconds".to_string()))?; + if grace_period > authorization.max_grace_period { + return Err(Error::Other(format!( + "session gracePeriodSeconds {grace_period} exceeds the authorized maximum {}", + authorization.max_grace_period + ))); + } let program_id = parse_pubkey(&details.channel_program, "channelProgram")?; crate::mpp::program::channel_deployment::resolve_for_network( program_id, @@ -583,34 +675,69 @@ pub struct BuildOpenPaymentChannelTransactionParams<'a> { pub signer: &'a dyn TransactionSigner, pub authorized_signer: Pubkey, pub fee_payer: Option, - /// Blockhash for the open transaction. `None` (the default) takes the - /// challenge's `recentBlockhash`, which the server requires the compiled - /// message to use; an explicit override is for tests and custom flows - /// that re-issue their own challenge binding. - pub recent_blockhash: Option, + /// Blockhash for the open transaction, checked against the client's own + /// cluster (see [`OpenBlockhash`]). + pub blockhash: OpenBlockhash, + pub authorization: &'a SessionOpenAuthorization, pub options: PaymentChannelOpenOptions, } -/// Resolve the open transaction's blockhash: an explicit override wins, -/// otherwise the challenged `recentBlockhash` is required — the client never -/// fetches its own. -fn resolve_open_blockhash(override_hash: Option, request: &SessionRequest) -> Result { - if let Some(hash) = override_hash { - return Ok(hash); +/// The blockhash a client signs into a channel `open`. +/// +/// A Solana transaction is bound to a cluster only by its blockhash, and the +/// server requires the open to use the challenge's `recentBlockhash`. That +/// value is untrusted: a hash from another cluster would make the signed +/// open valid there rather than on the network the deposit was approved for. +/// The only way to get one from a challenge is [`Self::verify`], which asks +/// the client's own RPC. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct OpenBlockhash(Hash); + +impl OpenBlockhash { + /// The challenge's `recentBlockhash`, once `rpc` (which serves the + /// cluster the client means to pay on) confirms it is live there. + pub async fn verify( + rpc: &solana_rpc_client::rpc_client::RpcClient, + request: &SessionRequest, + ) -> Result { + let challenged = request + .method_details + .recent_blockhash + .as_deref() + .ok_or_else(|| { + Error::Other( + "session challenge is missing recentBlockhash; a new-channel challenge must \ + provide it" + .to_string(), + ) + })?; + // Only the nonblocking client is reachable here: a blocking call + // panics on a current-thread runtime. + crate::core::blockhash::resolve_challenge_blockhash( + rpc.get_inner_client(), + Some(challenged), + ) + .await + .map(Self) + .map_err(|e| match e { + crate::core::blockhash::ChallengeBlockhashError::Invalid(message) => { + Error::Other(format!("invalid challenged recentBlockhash: {message}")) + } + crate::core::blockhash::ChallengeBlockhashError::Rpc(message) => Error::Other(format!( + "could not check the challenged recentBlockhash: {message}" + )), + }) + } + + /// A blockhash the caller fetched from its own cluster. Never pass a + /// value read from the challenge here; use [`Self::verify`]. + pub fn from_client_cluster(hash: Hash) -> Self { + Self(hash) + } + + pub fn hash(&self) -> Hash { + self.0 } - let challenged = request - .method_details - .recent_blockhash - .as_deref() - .ok_or_else(|| { - Error::Other( - "session challenge is missing recentBlockhash; a new-channel challenge must \ - provide it" - .to_string(), - ) - })?; - Hash::from_str(challenged) - .map_err(|e| Error::Other(format!("invalid challenged recentBlockhash: {e}"))) } pub async fn build_open_payment_channel_transaction( @@ -652,11 +779,12 @@ pub async fn build_open_payment_channel_transaction( "fee payer does not match the challenge policy".to_string(), )); } - let recent_blockhash = resolve_open_blockhash(params.recent_blockhash, params.request)?; + let recent_blockhash = params.blockhash.hash(); let open = derive_payment_channel_open(DerivePaymentChannelOpenParams { request: params.request, payer: params.signer.pubkey(), authorized_signer: params.authorized_signer, + authorization: params.authorization, options: params.options, })?; @@ -712,10 +840,10 @@ pub async fn create_payment_channel_session_opener( request: &SessionRequest, payer_signer: &dyn TransactionSigner, session_signer: Box, - recent_blockhash: Option, + blockhash: OpenBlockhash, + authorization: &SessionOpenAuthorization, options: PaymentChannelSessionOpenOptions, ) -> Result { - let recent_blockhash = resolve_open_blockhash(recent_blockhash, request)?; let authorized_signer = match request.method_details.voucher_signer { Some(SessionVoucherSigner::Operator) => parse_pubkey( request.method_details.operator.as_deref().ok_or_else(|| { @@ -743,6 +871,7 @@ pub async fn create_payment_channel_session_opener( request, payer: payer_signer.pubkey(), authorized_signer, + authorization, options: options.open.clone(), })?; // Carry the already chosen salt into the shared builder; deriving twice @@ -754,7 +883,8 @@ pub async fn create_payment_channel_session_opener( signer: payer_signer, authorized_signer, fee_payer: Some(fee_payer), - recent_blockhash: Some(recent_blockhash), + blockhash, + authorization, options: build_options, }) .await?; @@ -865,6 +995,7 @@ mod tests { request, payer: Pubkey::new_unique(), authorized_signer: Pubkey::new_unique(), + authorization: &auth(), options: PaymentChannelOpenOptions { program_id: override_program, ..Default::default() @@ -910,6 +1041,10 @@ mod tests { Hash::new_from_array([7; 32]) } + fn auth() -> SessionOpenAuthorization { + SessionOpenAuthorization::client_signed(1000) + } + fn request(recipient: Pubkey) -> SessionRequest { SessionRequest { amount: "25".into(), @@ -957,6 +1092,7 @@ mod tests { request, payer: Pubkey::new_unique(), authorized_signer: Pubkey::new_unique(), + authorization: &auth(), options: PaymentChannelOpenOptions { salt: Some(7), ..Default::default() @@ -1061,6 +1197,7 @@ mod tests { request, payer: Pubkey::new_unique(), authorized_signer: Pubkey::new_unique(), + authorization: &auth(), options: PaymentChannelOpenOptions { open_slot: Some(42), approved_payout: Some(approved), @@ -1103,6 +1240,7 @@ mod tests { request: &req, payer, authorized_signer: authorized, + authorization: &auth(), options: PaymentChannelOpenOptions { open_slot: Some(42), salt: Some(7), @@ -1118,35 +1256,44 @@ mod tests { assert_eq!(payload.deposit_amount, "1000"); assert_eq!(payload.distribution_splits[0].share_bps, 250); - let mut invalid = req.clone(); - invalid.suggested_deposit = Some("bad".into()); - assert!(derive_payment_channel_open(DerivePaymentChannelOpenParams { - request: &invalid, - payer, - authorized_signer: authorized, - options: PaymentChannelOpenOptions { - open_slot: Some(1), - ..Default::default() - } - }) - .is_err()); - let mut below = req.clone(); - below.suggested_deposit = Some("1".into()); - assert!(derive_payment_channel_open(DerivePaymentChannelOpenParams { - request: &below, - payer, - authorized_signer: authorized, - options: PaymentChannelOpenOptions { - open_slot: Some(1), - ..Default::default() - } - }) - .is_err()); + // The deposit is the caller's, whatever the challenge suggests, and + // still at least minimumDeposit. + let mut suggested = req.clone(); + suggested.suggested_deposit = Some("bad".into()); + let derive_with = |request: &SessionRequest, authorization: &SessionOpenAuthorization| { + derive_payment_channel_open(DerivePaymentChannelOpenParams { + request, + payer, + authorized_signer: authorized, + authorization, + options: PaymentChannelOpenOptions { + open_slot: Some(1), + ..Default::default() + }, + }) + }; + assert_eq!(derive_with(&suggested, &auth()).unwrap().deposit, 1000); + let mut no_suggestion = req.clone(); + no_suggestion.suggested_deposit = None; + no_suggestion.minimum_deposit = None; + assert_eq!( + derive_with(&no_suggestion, &SessionOpenAuthorization::client_signed(7)) + .unwrap() + .deposit, + 7 + ); + assert!( + derive_with(&req, &SessionOpenAuthorization::client_signed(99)) + .unwrap_err() + .to_string() + .contains("below minimumDeposit") + ); // Default options take `openSlot` from the challenged `recentSlot`. let defaulted = derive_payment_channel_open(DerivePaymentChannelOpenParams { request: &req, payer, authorized_signer: authorized, + authorization: &auth(), options: Default::default(), }) .unwrap(); @@ -1156,6 +1303,7 @@ mod tests { request: &req, payer, authorized_signer: authorized, + authorization: &auth(), options: PaymentChannelOpenOptions { open_slot: Some(43), ..Default::default() @@ -1171,6 +1319,7 @@ mod tests { request: &no_slot, payer, authorized_signer: authorized, + authorization: &auth(), options: Default::default() }) .unwrap_err() @@ -1182,19 +1331,7 @@ mod tests { request: &bad_program, payer, authorized_signer: authorized, - options: PaymentChannelOpenOptions { - open_slot: Some(1), - ..Default::default() - } - }) - .is_err()); - let mut no_deposit = req.clone(); - no_deposit.suggested_deposit = None; - no_deposit.minimum_deposit = None; - assert!(derive_payment_channel_open(DerivePaymentChannelOpenParams { - request: &no_deposit, - payer, - authorized_signer: authorized, + authorization: &auth(), options: PaymentChannelOpenOptions { open_slot: Some(1), ..Default::default() @@ -1226,7 +1363,8 @@ mod tests { signer: payer.as_ref(), authorized_signer: payer.pubkey(), fee_payer: None, - recent_blockhash: None, + blockhash: OpenBlockhash::from_client_cluster(test_blockhash()), + authorization: &auth(), options: PaymentChannelOpenOptions { compute_budget: budget, ..Default::default() @@ -1284,13 +1422,13 @@ mod tests { let session_signer = signer(3); let payee = Pubkey::new_unique(); let mut req = request(payee); - // No explicit blockhash: the challenged `recentBlockhash` is used. let tx = build_open_payment_channel_transaction(BuildOpenPaymentChannelTransactionParams { request: &req, signer: payer.as_ref(), authorized_signer: session_signer.pubkey(), fee_payer: None, - recent_blockhash: None, + blockhash: OpenBlockhash::from_client_cluster(test_blockhash()), + authorization: &auth(), options: PaymentChannelOpenOptions { open_slot: Some(42), salt: Some(7), @@ -1304,27 +1442,16 @@ mod tests { crate::mpp::program::payment_channels::decode_transaction(&tx.transaction).unwrap(); assert_eq!(*decoded.message.recent_blockhash(), test_blockhash()); - // A new-channel challenge without `recentBlockhash` cannot build the - // open transaction unless the caller overrides the blockhash. + // A new-channel challenge without `recentBlockhash` gives the client + // no blockhash it may verify. let mut no_blockhash = req.clone(); no_blockhash.method_details.recent_blockhash = None; - assert!( - build_open_payment_channel_transaction(BuildOpenPaymentChannelTransactionParams { - request: &no_blockhash, - signer: payer.as_ref(), - authorized_signer: session_signer.pubkey(), - fee_payer: None, - recent_blockhash: None, - options: PaymentChannelOpenOptions { - open_slot: Some(42), - ..Default::default() - }, - }) + let rpc = crate::core::blockhash::mock_blockhash_rpc(true); + assert!(OpenBlockhash::verify(&rpc, &no_blockhash) .await .unwrap_err() .to_string() - .contains("missing recentBlockhash") - ); + .contains("missing recentBlockhash")); req.method_details.fee_payer = Some(true); req.method_details.fee_payer_key = Some(Pubkey::new_unique().to_string()); @@ -1334,7 +1461,8 @@ mod tests { signer: payer.as_ref(), authorized_signer: session_signer.pubkey(), fee_payer: Some(payer.pubkey()), - recent_blockhash: None, + blockhash: OpenBlockhash::from_client_cluster(test_blockhash()), + authorization: &auth(), options: PaymentChannelOpenOptions { open_slot: Some(42), ..Default::default() @@ -1358,7 +1486,10 @@ mod tests { &req, payer.as_ref(), session_signer, - None, + OpenBlockhash::verify(&crate::core::blockhash::mock_blockhash_rpc(true), &req) + .await + .unwrap(), + &SessionOpenAuthorization::operator_signed(1000, operator.pubkey()), PaymentChannelSessionOpenOptions { open: PaymentChannelOpenOptions { // Earlier than the challenged recentSlot (42): allowed. @@ -1384,6 +1515,168 @@ mod tests { } } + /// An operator-signed channel lets the operator settle up to the whole + /// deposit with its own vouchers, so the challenge alone never makes the + /// client open one: the caller names the operator it trusts. + #[tokio::test] + async fn operator_vouchers_need_the_caller_to_name_the_operator() { + let operator = Pubkey::new_unique(); + let mut req = request(Pubkey::new_unique()); + req.method_details.voucher_signer = Some(SessionVoucherSigner::Operator); + req.method_details.operator = Some(operator.to_string()); + let open = |authorization: SessionOpenAuthorization| { + let req = req.clone(); + async move { + create_payment_channel_session_opener( + &req, + signer(2).as_ref(), + signer(3), + OpenBlockhash::from_client_cluster(test_blockhash()), + &authorization, + PaymentChannelSessionOpenOptions::default(), + ) + .await + } + }; + + let error = open(auth()).await.err().expect("client-signed only"); + assert!(error.to_string().contains("did not authorize"), "{error}"); + let other = SessionOpenAuthorization::operator_signed(1000, Pubkey::new_unique()); + let error = open(other).await.err().expect("another operator"); + assert!(error.to_string().contains("did not authorize"), "{error}"); + + let opened = open(SessionOpenAuthorization::operator_signed(1000, operator)) + .await + .unwrap(); + assert_eq!(opened.open.authorized_signer, operator); + assert_eq!(opened.open.deposit, 1000); + + // derive_payment_channel_open holds the same line for callers that + // pick the authorized signer themselves. + let derive = |authorized_signer, authorization: &SessionOpenAuthorization| { + derive_payment_channel_open(DerivePaymentChannelOpenParams { + request: &req, + payer: Pubkey::new_unique(), + authorized_signer, + authorization, + options: Default::default(), + }) + }; + assert!(derive(operator, &auth()).is_err()); + let trusted = SessionOpenAuthorization::operator_signed(1000, operator); + assert!(derive(Pubkey::new_unique(), &trusted).is_err()); + assert!(derive(operator, &trusted).is_ok()); + } + + /// The deposit is the caller's: a challenge's suggestedDeposit never + /// sizes the escrow. + #[tokio::test] + async fn the_deposit_is_the_callers_not_the_challenges() { + let mut req = request(Pubkey::new_unique()); + req.suggested_deposit = Some(u64::MAX.to_string()); + let opened = create_payment_channel_session_opener( + &req, + signer(2).as_ref(), + signer(3), + OpenBlockhash::from_client_cluster(test_blockhash()), + &SessionOpenAuthorization::client_signed(250), + PaymentChannelSessionOpenOptions::default(), + ) + .await + .unwrap(); + assert_eq!(opened.open.deposit, 250); + let SessionAction::Open(payload) = opened.action else { + panic!("open action"); + }; + assert_eq!(payload.deposit_amount, "250"); + } + + /// The grace period is the payer's wait to withdraw what was not settled, + /// so a challenge cannot stretch it past the caller's ceiling. + #[test] + fn the_grace_period_is_bounded() { + let derive = |grace: u32, option: Option, authorization: &SessionOpenAuthorization| { + let mut req = request(Pubkey::new_unique()); + req.method_details.grace_period_seconds = Some(grace); + derive_payment_channel_open(DerivePaymentChannelOpenParams { + request: &req, + payer: Pubkey::new_unique(), + authorized_signer: Pubkey::new_unique(), + authorization, + options: PaymentChannelOpenOptions { + grace_period: option, + ..Default::default() + }, + }) + }; + let error = derive(u32::MAX, None, &auth()).unwrap_err(); + assert!( + error.to_string().contains("exceeds the authorized maximum"), + "{error}" + ); + assert!(derive(MAX_SESSION_GRACE_PERIOD_SECONDS + 1, None, &auth()).is_err()); + assert_eq!( + derive(MAX_SESSION_GRACE_PERIOD_SECONDS, None, &auth()) + .unwrap() + .grace_period, + MAX_SESSION_GRACE_PERIOD_SECONDS + ); + + let tight = auth().with_max_grace_period(3_600).unwrap(); + assert!(derive(3_601, None, &tight).is_err()); + assert!(derive(u32::MAX, Some(3_601), &tight).is_err()); + assert_eq!( + derive(u32::MAX, Some(900), &tight).unwrap().grace_period, + 900 + ); + let wide = auth().with_max_grace_period(u32::MAX).unwrap(); + assert_eq!( + derive(u32::MAX, None, &wide).unwrap().grace_period, + u32::MAX + ); + assert!(auth().with_max_grace_period(0).is_err()); + } + + #[tokio::test] + async fn a_challenged_blockhash_the_client_cluster_does_not_know_is_refused() { + let req = request(Pubkey::new_unique()); + let foreign = crate::core::blockhash::mock_blockhash_rpc(false); + let error = OpenBlockhash::verify(&foreign, &req).await.unwrap_err(); + assert!( + error.to_string().contains("not a live blockhash"), + "{error}" + ); + + let rpc = crate::core::blockhash::mock_blockhash_rpc(true); + let blockhash = OpenBlockhash::verify(&rpc, &req).await.unwrap(); + assert_eq!(blockhash.hash(), test_blockhash()); + let opened = create_payment_channel_session_opener( + &req, + signer(2).as_ref(), + signer(3), + blockhash, + &auth(), + PaymentChannelSessionOpenOptions::default(), + ) + .await + .unwrap(); + let SessionAction::Open(payload) = opened.action else { + panic!("open action"); + }; + let decoded = + crate::mpp::program::payment_channels::decode_transaction(&payload.transaction) + .unwrap(); + assert_eq!(*decoded.message.recent_blockhash(), test_blockhash()); + } + + #[tokio::test] + async fn an_unreachable_client_rpc_refuses_the_challenged_blockhash() { + let req = request(Pubkey::new_unique()); + let rpc = solana_rpc_client::rpc_client::RpcClient::new("http://127.0.0.1:1".to_string()); + let error = OpenBlockhash::verify(&rpc, &req).await.unwrap_err(); + assert!(error.to_string().contains("could not check"), "{error}"); + } + #[test] fn stablecoin_and_token_program_resolution_is_exact() { let req = request(Pubkey::new_unique()); @@ -1391,6 +1684,7 @@ mod tests { request: &req, payer: Pubkey::new_unique(), authorized_signer: Pubkey::new_unique(), + authorization: &auth(), options: PaymentChannelOpenOptions { open_slot: Some(1), ..Default::default() diff --git a/rust/crates/kit/src/mpp/client/session_consumer.rs b/rust/crates/kit/src/mpp/client/session_consumer.rs index 997d2d1b5..df7cb816e 100644 --- a/rust/crates/kit/src/mpp/client/session_consumer.rs +++ b/rust/crates/kit/src/mpp/client/session_consumer.rs @@ -49,15 +49,62 @@ impl CommitTransport for Arc { } } +/// What a [`SessionConsumer`] may sign vouchers for. +/// +/// A metering directive is the server's claim of what a delivery cost, and +/// the voucher signed for it lets the server settle that much of the +/// deposit. The budget is the caller's bound on both: no directive is +/// committed past it, whatever the server names. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct MeteringBudget { + max_per_delivery: u64, + max_cumulative: u64, +} + +impl MeteringBudget { + /// At most `max_per_delivery` base units for one delivery, and at most + /// `max_cumulative` for the channel's cumulative voucher (typically the + /// deposit, or less). + pub fn new(max_per_delivery: u64, max_cumulative: u64) -> Result { + if max_per_delivery == 0 || max_per_delivery > max_cumulative { + return Err(Error::Other(format!( + "metering budget needs 0 < max_per_delivery ({max_per_delivery}) <= \ + max_cumulative ({max_cumulative})" + ))); + } + Ok(Self { + max_per_delivery, + max_cumulative, + }) + } + + pub fn max_per_delivery(&self) -> u64 { + self.max_per_delivery + } + + pub fn max_cumulative(&self) -> u64 { + self.max_cumulative + } +} + /// Client-side consumer for session-metered deliveries. pub struct SessionConsumer { session: ActiveSession, transport: T, + budget: MeteringBudget, } impl SessionConsumer { - pub fn new(session: ActiveSession, transport: T) -> Self { - Self { session, transport } + pub fn new(session: ActiveSession, transport: T, budget: MeteringBudget) -> Self { + Self { + session, + transport, + budget, + } + } + + pub fn budget(&self) -> MeteringBudget { + self.budget } pub fn session(&self) -> &ActiveSession { @@ -83,15 +130,8 @@ impl SessionConsumer { &mut self, directive: &MeteringDirective, ) -> Result { - self.validate_directive(directive)?; - let amount = directive.amount_base_units()?; - if amount == 0 { - return Err(Error::Other( - "metered delivery amount must be greater than zero".to_string(), - )); - } - - let voucher = self.session.prepare_increment(amount).await?; + let cumulative = self.validate_directive(directive)?; + let voucher = self.session.prepare_voucher(cumulative).await?; let payload = CommitPayload { delivery_id: directive.delivery_id.clone(), voucher, @@ -102,7 +142,9 @@ impl SessionConsumer { Ok(receipt) } - fn validate_directive(&self, directive: &MeteringDirective) -> Result<()> { + /// Check `directive` against the session, the transport and the budget, + /// and return the cumulative amount a voucher for it would sign. + fn validate_directive(&self, directive: &MeteringDirective) -> Result { let channel_id = self.session.channel_id_str(); if directive.session_id != channel_id { return Err(Error::Other(format!( @@ -110,7 +152,32 @@ impl SessionConsumer { directive.session_id ))); } - self.transport.check_directive(directive) + let amount = directive.amount_base_units()?; + if amount == 0 { + return Err(Error::Other( + "metered delivery amount must be greater than zero".to_string(), + )); + } + if amount > self.budget.max_per_delivery { + return Err(Error::Other(format!( + "metered delivery amount {amount} exceeds the per-delivery budget {}", + self.budget.max_per_delivery + ))); + } + let cumulative = self + .session + .cumulative + .checked_add(amount) + .filter(|cumulative| *cumulative <= self.budget.max_cumulative) + .ok_or_else(|| { + Error::Other(format!( + "metered delivery amount {amount} takes the session past its cumulative \ + budget {} (committed {})", + self.budget.max_cumulative, self.session.cumulative + )) + })?; + self.transport.check_directive(directive)?; + Ok(cumulative) } } @@ -190,6 +257,10 @@ mod tests { Box::new(MemorySigner::from_bytes(&kp).unwrap()) } + fn budget() -> MeteringBudget { + MeteringBudget::new(1_000, 10_000).unwrap() + } + fn directive(session_id: String, amount: u64) -> MeteringDirective { MeteringDirective { delivery_id: "d1".to_string(), @@ -211,7 +282,7 @@ mod tests { commits: Mutex::new(vec![]), fail: false, }; - let mut consumer = SessionConsumer::new(session, transport); + let mut consumer = SessionConsumer::new(session, transport, budget()); let envelope = MeteredEnvelope { payload: "work".to_string(), metering: directive(consumer.session().channel_id_str(), 250), @@ -234,7 +305,7 @@ mod tests { commits: Mutex::new(vec![]), fail: false, }; - let mut consumer = SessionConsumer::new(session, transport); + let mut consumer = SessionConsumer::new(session, transport, budget()); consumer.session_mut().set_expires_at(1234); let envelope = MeteredEnvelope { payload: "payload".to_string(), @@ -271,7 +342,8 @@ mod tests { commits: Mutex::new(vec![]), fail: false, }); - let mut consumer = SessionConsumer::new(session, std::sync::Arc::clone(&transport)); + let mut consumer = + SessionConsumer::new(session, std::sync::Arc::clone(&transport), budget()); let directive = directive(consumer.session().channel_id_str(), 25); let receipt = consumer.commit_directive(&directive).await.unwrap(); @@ -287,7 +359,7 @@ mod tests { commits: Mutex::new(vec![]), fail: false, }; - let mut consumer = SessionConsumer::new(session, transport); + let mut consumer = SessionConsumer::new(session, transport, budget()); let wrong_session = MeteredEnvelope { payload: (), @@ -321,11 +393,76 @@ mod tests { commits: Mutex::new(vec![]), fail: true, }; - let mut consumer = SessionConsumer::new(session, transport); + let mut consumer = SessionConsumer::new(session, transport, budget()); let directive = directive(consumer.session().channel_id_str(), 250); let err = consumer.commit_directive(&directive).await.unwrap_err(); assert!(err.to_string().contains("commit failed")); assert_eq!(consumer.session().cumulative, 0); } + + #[tokio::test] + async fn directives_past_the_budget_are_refused_before_signing() { + let session = ActiveSession::new(Pubkey::new_unique(), signer()); + let transport = RecordingTransport { + commits: Mutex::new(vec![]), + fail: false, + }; + let budget = MeteringBudget::new(400, 1_000).unwrap(); + let mut consumer = SessionConsumer::new(session, transport, budget); + let session_id = consumer.session().channel_id_str(); + + // One delivery may not cost more than the per-delivery cap. + let err = consumer + .accept(MeteredEnvelope { + payload: (), + metering: directive(session_id.clone(), 401), + }) + .err() + .expect("over the per-delivery cap"); + assert!(err.to_string().contains("per-delivery budget"), "{err}"); + let err = consumer + .commit_directive(&directive(session_id.clone(), 401)) + .await + .unwrap_err(); + assert!(err.to_string().contains("per-delivery budget"), "{err}"); + + // Deliveries within it commit up to the cumulative cap and no further. + for _ in 0..2 { + consumer + .commit_directive(&directive(session_id.clone(), 400)) + .await + .unwrap(); + } + consumer + .commit_directive(&directive(session_id.clone(), 200)) + .await + .unwrap(); + assert_eq!(consumer.session().cumulative, 1_000); + let err = consumer + .commit_directive(&directive(session_id.clone(), 1)) + .await + .unwrap_err(); + assert!(err.to_string().contains("cumulative budget"), "{err}"); + + // A directive that would overflow the cumulative is refused too. + consumer.session_mut().cumulative = u64::MAX - 1; + let err = consumer + .commit_directive(&directive(session_id, 2)) + .await + .unwrap_err(); + assert!(err.to_string().contains("cumulative budget"), "{err}"); + assert_eq!(consumer.transport.commits.lock().unwrap().len(), 3); + } + + #[test] + fn a_budget_needs_a_positive_per_delivery_cap_within_the_total() { + assert!(MeteringBudget::new(0, 10).is_err()); + assert!(MeteringBudget::new(11, 10).is_err()); + let budget = MeteringBudget::new(10, 10).unwrap(); + assert_eq!( + (budget.max_per_delivery(), budget.max_cumulative()), + (10, 10) + ); + } } diff --git a/rust/crates/kit/src/mpp/server/charge.rs b/rust/crates/kit/src/mpp/server/charge.rs index 3920b94fb..a77d00712 100644 --- a/rust/crates/kit/src/mpp/server/charge.rs +++ b/rust/crates/kit/src/mpp/server/charge.rs @@ -2171,6 +2171,8 @@ impl Mpp { } } + confirmed_within_replay_retention(tx.block_time, unix_now_secs())?; + let total_amount: u64 = request.amount.parse().map_err(|_| { VerificationError::invalid_amount(format!("Invalid amount: {}", request.amount)) })?; @@ -2925,6 +2927,34 @@ fn within_replay_retention(expires: Option<&str>) -> Result<(), VerificationErro Ok(()) } +/// A push payment confirmed within [`DEFAULT_CHARGE_RECORD_RETENTION`] of +/// `now`. A push signature is not bound to the challenge it pays, so its +/// consumed-signature record (kept at least that long after it is claimed) is +/// all that stops it paying again; an older transaction, or one without a +/// block time, could outlive that record. +fn confirmed_within_replay_retention( + block_time: Option, + now: i64, +) -> Result<(), VerificationError> { + let block_time = block_time.ok_or_else(|| { + VerificationError::credential_mismatch( + "Push-mode transaction has no block time; its age cannot be bounded", + ) + })?; + let retention = DEFAULT_CHARGE_RECORD_RETENTION.as_secs() as i64; + let age = now.saturating_sub(block_time); + if age > retention { + return Err(VerificationError::credential_mismatch(format!( + "Push-mode transaction confirmed {age}s ago, outside the {retention}s replay retention window" + ))); + } + Ok(()) +} + +fn unix_now_secs() -> i64 { + time::OffsetDateTime::now_utc().unix_timestamp() +} + /// The charge-record generation a settlement owns. /// /// A settlement transaction is only sent after [`Self::begin`] recorded its @@ -9395,6 +9425,20 @@ mod tests { /// JSON-RPC stub for a landed push payment: `getTransaction` returns a /// confirmed SOL transfer of `lamports` from `sender` to `recipient`. async fn stub_push_rpc(sender: Pubkey, recipient: Pubkey, lamports: u64) -> String { + let now = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_secs() as i64; + stub_push_rpc_at(sender, recipient, lamports, Some(now)).await + } + + /// [`stub_push_rpc`] for a transaction confirmed at `block_time`. + async fn stub_push_rpc_at( + sender: Pubkey, + recipient: Pubkey, + lamports: u64, + block_time: Option, + ) -> String { use axum::{routing::post, Json, Router}; let app = Router::new().route( "/", @@ -9402,7 +9446,7 @@ mod tests { let result = match request["method"].as_str() { Some("getTransaction") => serde_json::json!({ "slot": 1, - "blockTime": std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_secs() as i64, + "blockTime": block_time, "version": 0, "transaction": { "signatures": [request["params"][0]], @@ -9490,6 +9534,57 @@ mod tests { assert_eq!(receipt.reference, signature); } + // A push signature is not bound to the challenge it pays: once its + // consumed-signature record expires, only the transaction's age stops a + // landed payment from paying a fresh challenge again. + #[tokio::test(flavor = "multi_thread")] + async fn push_rejects_a_transaction_older_than_the_replay_retention() { + let now = time::OffsetDateTime::now_utc().unix_timestamp(); + let retention = DEFAULT_CHARGE_RECORD_RETENTION.as_secs() as i64; + let sender = seed_pubkey(14); + let recipient = Pubkey::from_str(TEST_RECIPIENT).unwrap(); + let verify_at = |block_time: Option| async move { + let rpc_url = stub_push_rpc_at(sender, recipient, 1000, block_time).await; + let mpp = Mpp::new(Config { + realm: Some("test-realm".to_string()), + recipient: TEST_RECIPIENT.to_string(), + challenge_binding_secret: Some(TEST_SECRET.to_string()), + currency: "SOL".to_string(), + decimals: 9, + network: "devnet".to_string(), + rpc_url: Some(rpc_url), + accept_push_mode: true, + store: Some(Arc::new(MemoryStore::new())), + ..Default::default() + }) + .unwrap(); + let expected = ChargeRequest { + amount: "1000".into(), + currency: "SOL".into(), + recipient: Some(TEST_RECIPIENT.into()), + method_details: Some(serde_json::json!({ "network": "devnet", "decimals": 9 })), + ..Default::default() + }; + let signature = Signature::from([15u8; 64]).to_string(); + let credential = build_credential( + &mpp, + &expected, + serde_json::json!({ "type": "signature", "signature": signature }), + ); + mpp.verify(&credential, &expected).await + }; + + for stale in [Some(now - retention - 60), None] { + let err = verify_at(stale).await.unwrap_err(); + assert!( + err.message.contains("replay retention") || err.message.contains("block time"), + "{stale:?}: {err:?}" + ); + } + // Positive control: a payment confirmed inside the window is accepted. + verify_at(Some(now - retention + 60)).await.unwrap(); + } + // A charge that lands while its confirmed record cannot be written is // still pending in the store. Answering with a receipt would let the // retry's confirm_pending grant a second one: the retry is the receipt. diff --git a/rust/crates/kit/src/mpp/server/confidential.rs b/rust/crates/kit/src/mpp/server/confidential.rs index 6849587e6..e9cc4a973 100644 --- a/rust/crates/kit/src/mpp/server/confidential.rs +++ b/rust/crates/kit/src/mpp/server/confidential.rs @@ -58,6 +58,13 @@ pub(crate) const MAX_CT_BUNDLE_FUNDED_ACCOUNTS: usize = 6; #[cfg(feature = "confidential")] pub(crate) const MAX_CT_BUNDLE_CREATE_LAMPORTS: u64 = MAX_CT_CREATE_ACCOUNT_LAMPORTS * MAX_CT_BUNDLE_FUNDED_ACCOUNTS as u64; +/// The rent-exempt minimum for `space` bytes under the default rent every +/// public cluster runs: 3,480 lamports per byte-year for two years, over the +/// account plus its 128-byte overhead. +#[cfg(feature = "confidential")] +pub(crate) const fn rent_exempt_ceiling(space: u64) -> u64 { + (128 + space) * 3_480 * 2 +} /// Max base64 length of a single bundle transaction, by the largest accepted /// version: 1232 wire bytes (~1644 base64 chars) for version 0, 4096 (5464) /// for version 1. Caps decode/deserialize allocation so a client can't force @@ -321,7 +328,7 @@ impl Mpp { )); } - verify_confidential_account_lifecycle(&decoded, &gateway_pubkey)?; + let bundle_accounts = verify_confidential_account_lifecycle(&decoded, &gateway_pubkey)?; // Recover the amount from the validity proof the transfer itself // consumes. An account-wide balance delta cannot attribute a credit to @@ -348,6 +355,13 @@ impl Mpp { // the confidential transfer; its signature is the settlement signature. let mut final_sig = String::new(); let bundle_len = decoded.len(); + let mut cleanup = SetupCleanup { + rpc: std::sync::Arc::clone(&self.rpc), + signer: std::sync::Arc::clone(fee_payer_signer), + gateway: gateway_pubkey, + accounts: Vec::new(), + armed: true, + }; for (idx, tx) in decoded.iter_mut().enumerate() { // The gateway is every bundle tx's fee payer, so it is account key // zero. Keep that as an `invalid_payload` diagnostic naming the tx. @@ -400,6 +414,16 @@ impl Mpp { // Claim before sending, as pull settlement does, so the // transfer is recorded whatever happens after it leaves. fence.begin(self, &local_signature).await?; + // Once the final transaction may land, it owns the closes. + cleanup.armed = false; + } else { + if idx == 0 { + // One bundle presented for two challenges runs twice; only + // the run that claims its first setup transaction sends + // (and may clean up) the accounts the winner's final needs. + self.claim_bundle_setup(&local_signature).await?; + } + cleanup.sending(idx, &bundle_accounts); } let signature = match crate::core::rpc::send_transaction( &self.rpc, @@ -421,6 +445,7 @@ impl Mpp { }); } fence.abandon(self).await; + cleanup.armed = true; } return Err(error); } @@ -469,6 +494,24 @@ impl Mpp { Ok(BundleSettlement::Confirmed(final_sig)) } + /// Claim a bundle's setup by its first transaction's (deterministic) + /// gateway signature, across requests and replicas sharing the store. + #[cfg(feature = "confidential")] + async fn claim_bundle_setup(&self, signature: &str) -> Result<(), VerificationError> { + let key = format!("{CONFIDENTIAL_SETUP_CLAIM_PREFIX}{signature}"); + match self + .store + .put_if_absent(&key, serde_json::json!(true)) + .await + { + Ok(true) => Ok(()), + Ok(false) => Err(VerificationError::settlement_in_progress( + "This confidential bundle is already being settled; retry shortly", + )), + Err(e) => Err(VerificationError::new(format!("Store error: {e}"))), + } + } + /// Sweep gateway-owned orphaned confidential proof/record accounts left by /// partially-failed bundles and reclaim their rent back to the gateway. /// @@ -642,8 +685,110 @@ impl Mpp { } } +/// Store key prefix of [`Mpp::claim_bundle_setup`]. +#[cfg(feature = "confidential")] +const CONFIDENTIAL_SETUP_CLAIM_PREFIX: &str = "mpp:confidential-bundle-setup:"; + +/// The gateway-funded accounts a bundle's setup transactions may have +/// created. The final transaction closes them; when it never lands (it +/// fails simulation or is rejected at preflight, or settlement is +/// abandoned), dropping this guard while armed closes them back to the +/// gateway from a spawned task instead of leaving the rent parked until the +/// orphan sweeper's grace period ends. #[cfg(feature = "confidential")] -#[derive(Clone, Copy, PartialEq, Eq)] +struct SetupCleanup { + rpc: std::sync::Arc, + signer: std::sync::Arc, + gateway: Pubkey, + accounts: Vec, + armed: bool, +} + +#[cfg(feature = "confidential")] +impl SetupCleanup { + /// Bundle transaction `tx_index` is about to be sent: the accounts it + /// creates may exist from here on. + fn sending(&mut self, tx_index: usize, bundle: &[BundleAccount]) { + self.accounts.extend( + bundle + .iter() + .filter(|account| account.created_in == tx_index), + ); + } +} + +#[cfg(feature = "confidential")] +impl Drop for SetupCleanup { + fn drop(&mut self) { + if !self.armed || self.accounts.is_empty() { + return; + } + let Ok(runtime) = tokio::runtime::Handle::try_current() else { + tracing::warn!( + accounts = self.accounts.len(), + "no runtime to close a failed confidential bundle's accounts; leaving them to the orphan sweeper" + ); + return; + }; + let rpc = std::sync::Arc::clone(&self.rpc); + let signer = std::sync::Arc::clone(&self.signer); + let gateway = self.gateway; + let accounts = std::mem::take(&mut self.accounts); + runtime.spawn(async move { + if let Err(error) = close_setup_accounts(&rpc, signer.as_ref(), &gateway, &accounts).await + { + tracing::warn!( + error = %error.message, + "closing a failed confidential bundle's accounts failed; leaving them to the orphan sweeper" + ); + } + }); + } +} + +/// Close every account in `accounts` that exists back to the gateway, in one +/// gateway-paid transaction that must pass preflight. +#[cfg(feature = "confidential")] +async fn close_setup_accounts( + rpc: &solana_rpc_client::rpc_client::RpcClient, + signer: &dyn solana_keychain::TransactionSigner, + gateway: &Pubkey, + accounts: &[BundleAccount], +) -> Result<(), VerificationError> { + let addresses: Vec = accounts.iter().map(|account| account.address).collect(); + let existing = rpc + .get_multiple_accounts(&addresses) + .map_err(|e| VerificationError::network_error(format!("getMultipleAccounts: {e}")))?; + let closes: Vec<_> = accounts + .iter() + .zip(existing) + .filter(|(_, account)| account.is_some()) + .map(|(account, _)| account.close_instruction(gateway)) + .collect(); + if closes.is_empty() { + return Ok(()); + } + let blockhash = rpc + .get_latest_blockhash() + .map_err(|e| VerificationError::network_error(format!("get_latest_blockhash: {e}")))?; + let mut tx = crate::core::tx::build_unsigned( + crate::core::tx::TxVersion::V0, + gateway, + &closes, + blockhash, + None, + ) + .map_err(|e| VerificationError::new(format!("build close: {e}")))?; + crate::core::signing::cosign_versioned_fee_payer(signer, gateway, &mut tx) + .await + .map_err(|e| VerificationError::new(format!("sign close: {e}")))?; + crate::core::rpc::send_transaction(rpc, &tx, crate::core::rpc::preflight_config(rpc)) + .map_err(|e| VerificationError::network_error(format!("broadcast close: {e}")))?; + Ok(()) +} + +#[cfg(feature = "confidential")] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] enum FundedAccountKind { ProofContext, Record, @@ -657,6 +802,50 @@ struct FundedAccount { /// Allocated bytes, and record payload bytes written so far. space: u64, written: u64, + /// Index of the bundle transaction that creates it. + created_in: usize, +} + +/// A gateway-funded temporary account of a bundle. +#[cfg(feature = "confidential")] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(crate) struct BundleAccount { + address: Pubkey, + kind: FundedAccountKind, + /// Index of the bundle transaction that creates it. + created_in: usize, +} + +#[cfg(feature = "confidential")] +impl BundleAccount { + /// The instruction closing this account back to the gateway. + fn close_instruction(&self, gateway: &Pubkey) -> solana_instruction::Instruction { + close_temporary_account(self.kind, &self.address, gateway) + } +} + +/// Close a gateway-authorized proof context or record back to the gateway. +#[cfg(feature = "confidential")] +fn close_temporary_account( + kind: FundedAccountKind, + account: &Pubkey, + gateway: &Pubkey, +) -> solana_instruction::Instruction { + match kind { + FundedAccountKind::Record => { + spl_record::instruction::close_account(account, gateway, gateway) + } + FundedAccountKind::ProofContext => { + let gw = solana_address::Address::from(gateway.to_bytes()); + solana_zk_elgamal_proof_interface::instruction::close_context_state( + solana_zk_elgamal_proof_interface::instruction::ContextStateInfo { + context_state_account: &solana_address::Address::from(account.to_bytes()), + context_state_authority: &gw, + }, + &gw, + ) + } + } } /// The spl-record instructions a confidential bundle may carry. @@ -705,7 +894,7 @@ impl RecordIx { pub(crate) fn verify_confidential_account_lifecycle( transactions: &[VersionedTransaction], gateway: &Pubkey, -) -> Result<(), VerificationError> { +) -> Result, VerificationError> { use std::collections::{HashMap, HashSet}; let zk_program = Pubkey::from_str(ZK_ELGAMAL_PROOF_PROGRAM).expect("valid zk program id"); @@ -792,6 +981,7 @@ pub(crate) fn verify_confidential_account_lifecycle( closed: false, space, written: 0, + created_in: tx_index, }, ) .is_some() @@ -953,7 +1143,16 @@ pub(crate) fn verify_confidential_account_lifecycle( "every gateway-funded temporary account must be initialized and closed back to the gateway", )); } - Ok(()) + let mut accounts: Vec = funded + .into_iter() + .map(|(address, account)| BundleAccount { + address, + kind: account.kind, + created_in: account.created_in, + }) + .collect(); + accounts.sort_by_key(|account| account.created_in); + Ok(accounts) } /// Orphan guard. An account may be closed only through an [`orphan::OrphanConfirmed`], @@ -998,23 +1197,11 @@ pub(crate) mod orphan { &self, gateway: &Pubkey, ) -> solana_instruction::Instruction { - match self.kind { - OrphanKind::Record => { - spl_record::instruction::close_account(&self.pubkey, gateway, gateway) - } - OrphanKind::ProofContext => { - let gw = solana_address::Address::from(gateway.to_bytes()); - solana_zk_elgamal_proof_interface::instruction::close_context_state( - solana_zk_elgamal_proof_interface::instruction::ContextStateInfo { - context_state_account: &solana_address::Address::from( - self.pubkey.to_bytes(), - ), - context_state_authority: &gw, - }, - &gw, - ) - } - } + let kind = match self.kind { + OrphanKind::Record => super::FundedAccountKind::Record, + OrphanKind::ProofContext => super::FundedAccountKind::ProofContext, + }; + super::close_temporary_account(kind, &self.pubkey, gateway) } } @@ -1200,6 +1387,16 @@ pub(crate) fn verify_confidential_bundle_tx( "create_account exceeds the allowed size/rent for a proof/record account", )); } + // A temporary account needs exactly its rent-exempt minimum; any + // more is gateway SOL parked in it until it is closed. + if let (Some(space), Some(lamports)) = (space, lamports) { + if lamports > rent_exempt_ceiling(space) { + return Err(VerificationError::credential_mismatch(format!( + "create_account funds {lamports} lamports, more than the {} rent-exempt minimum for {space} bytes", + rent_exempt_ceiling(space) + ))); + } + } if let Some(created) = ix.accounts.get(1).and_then(|i| keys.get(*i as usize)) { created_accounts.insert(*created); } @@ -2661,4 +2858,232 @@ pub(crate) mod tests { err.message ); } + + // A gateway-funded temporary account needs only its rent-exempt minimum; + // anything above it is gateway SOL a failed bundle would leave parked. + #[test] + fn temporary_accounts_are_funded_at_most_their_rent_exempt_minimum() { + let gateway = Pubkey::new_unique(); + let ata = Pubkey::new_unique(); + let p = layout_pieces(&gateway, &ata); + let setup = |lamports: u64| { + let record = client_key(); + v0_tx( + &gateway, + &[ + solana_system_interface::instruction::create_account( + &gateway, + &record, + lamports, + 100, + &spl_record::id(), + ), + solana_instruction::Instruction { + accounts: vec![ + solana_instruction::AccountMeta::new(record, false), + solana_instruction::AccountMeta::new_readonly(gateway, false), + ], + ..p.initialize.clone() + }, + ], + ) + }; + let err = accepts(&setup(rent_exempt_ceiling(100) + 1), &gateway, &ata).unwrap_err(); + assert!( + err.message.contains("rent-exempt minimum"), + "{}", + err.message + ); + accepts(&setup(rent_exempt_ceiling(100)), &gateway, &ata).unwrap(); + } + + /// Settlement RPC for a two-transaction bundle: confirms every broadcast, + /// reports every temporary account as existing, and fails the simulation + /// of any transaction that invokes `failing` (if set). Records the + /// program ids of each sent transaction. + async fn bundle_rpc( + failing: Option, + ) -> ( + String, + Arc>>>, + tokio::task::JoinHandle<()>, + ) { + use axum::{routing::post, Json, Router}; + let sent = Arc::new(std::sync::Mutex::new(Vec::new())); + let recorded = Arc::clone(&sent); + let programs_of = |b64: &str| { + let tx = crate::core::tx::decode(b64).unwrap(); + let keys = tx.message.static_account_keys().to_vec(); + let programs: Vec = tx + .message + .instructions() + .iter() + .map(|ix| keys[ix.program_id_index as usize]) + .collect(); + (tx.signatures[0], programs) + }; + let app = Router::new().route( + "/", + post(move |Json(request): Json| { + let recorded = Arc::clone(&recorded); + async move { + let result = match request["method"].as_str().unwrap() { + "simulateTransaction" => { + let (_, programs) = programs_of(request["params"][0].as_str().unwrap()); + let err = failing + .filter(|failing| programs.contains(failing)) + .map(|_| serde_json::json!({ "InstructionError": [0, { "Custom": 1 }] })); + serde_json::json!({ + "context": { "slot": 1 }, + "value": { "err": err, "logs": [], "accounts": null, "unitsConsumed": 0 } + }) + } + "sendTransaction" => { + let (signature, programs) = + programs_of(request["params"][0].as_str().unwrap()); + recorded.lock().unwrap().push(programs); + serde_json::json!(signature.to_string()) + } + "getSignatureStatuses" => { + let statuses = request["params"][0] + .as_array() + .unwrap() + .iter() + .map(|_| { + serde_json::json!({ + "slot": 1, "confirmations": null, "err": null, + "confirmationStatus": "finalized", "status": { "Ok": null } + }) + }) + .collect::>(); + serde_json::json!({ "context": { "slot": 1 }, "value": statuses }) + } + "getMultipleAccounts" => { + let accounts = request["params"][0] + .as_array() + .unwrap() + .iter() + .map(|_| { + serde_json::json!({ + "lamports": 1_000, "data": ["", "base64"], + "owner": spl_record::id().to_string(), + "executable": false, "rentEpoch": 0, "space": 0 + }) + }) + .collect::>(); + serde_json::json!({ "context": { "slot": 1 }, "value": accounts }) + } + "getLatestBlockhash" => serde_json::json!({ + "context": { "slot": 1 }, + "value": { + "blockhash": solana_hash::Hash::new_unique().to_string(), + "lastValidBlockHeight": 100 + } + }), + method => panic!("unexpected RPC method {method}"), + }; + Json(serde_json::json!({ "jsonrpc": "2.0", "id": request["id"], "result": result })) + } + }), + ); + let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); + let url = format!("http://{}", listener.local_addr().unwrap()); + let server = tokio::spawn(async move { axum::serve(listener, app).await.unwrap() }); + (url, sent, server) + } + + // One bundle presented for two challenges: the second run must not send + // its setup again, nor clean up accounts the first run's final needs. + #[tokio::test(flavor = "multi_thread")] + async fn a_bundle_presented_twice_is_sent_and_cleaned_up_once() { + let token_2022 = Pubkey::from_str(programs::TOKEN_2022_PROGRAM).unwrap(); + let system = solana_system_interface::program::ID; + let record = spl_record::id(); + let (url, sent, rpc) = bundle_rpc(None).await; + let mut server = confidential_server(false, None, true).await; + server.mpp.accepted_versions = vec![TxVersion::V0]; + server.mpp.rpc = Arc::new(solana_rpc_client::rpc_client::RpcClient::new(url)); + let p = layout_pieces(&server.gateway, &server.recipient_ata); + let bundle = encode_bundle(&[ + v0_tx(&server.gateway, &[p.create, p.initialize]), + v0_tx(&server.gateway, &[p.transfer, p.close]), + ]); + let req = request(1_000, &server.mint, server.mpp.recipient()); + let first = server + .mpp + .settle_confidential_bundle( + &bundle, + &req, + &server.method_details, + &mut server.mpp.test_fence().await, + ) + .await; + assert!(first.is_ok(), "{first:?}"); + let second = server + .mpp + .settle_confidential_bundle( + &bundle, + &req, + &server.method_details, + &mut server.mpp.test_fence().await, + ) + .await; + assert!(second.is_err(), "{second:?}"); + tokio::time::sleep(std::time::Duration::from_millis(200)).await; + assert_eq!( + *sent.lock().unwrap(), + vec![vec![system, record], vec![token_2022, record]], + "only the first run sends anything" + ); + rpc.abort(); + } + + // The final transaction closes every gateway-funded account. When it + // fails after the setup transactions landed, the gateway closes them + // straight away rather than leaving the rent for the orphan sweeper. + #[tokio::test(flavor = "multi_thread")] + async fn a_bundle_whose_final_transaction_fails_closes_its_landed_accounts() { + let token_2022 = Pubkey::from_str(programs::TOKEN_2022_PROGRAM).unwrap(); + let system = solana_system_interface::program::ID; + let record = spl_record::id(); + // (simulation failing on, expected sends: [programs of each]) + for (failing, expected) in [ + // Final fails: setup lands, then one cleanup closing the record. + (Some(token_2022), vec![vec![system, record], vec![record]]), + // Setup fails: nothing was sent, nothing to close. + (Some(system), vec![]), + // Positive control: the bundle settles, the final closes it all. + (None, vec![vec![system, record], vec![token_2022, record]]), + ] { + let (url, sent, rpc) = bundle_rpc(failing).await; + let mut server = confidential_server(false, None, true).await; + server.mpp.accepted_versions = vec![TxVersion::V0]; + server.mpp.rpc = Arc::new(solana_rpc_client::rpc_client::RpcClient::new(url)); + let p = layout_pieces(&server.gateway, &server.recipient_ata); + let bundle = encode_bundle(&[ + v0_tx(&server.gateway, &[p.create, p.initialize]), + v0_tx(&server.gateway, &[p.transfer, p.close]), + ]); + let result = server + .mpp + .settle_confidential_bundle( + &bundle, + &request(1_000, &server.mint, server.mpp.recipient()), + &server.method_details, + &mut server.mpp.test_fence().await, + ) + .await; + assert_eq!(result.is_ok(), failing.is_none(), "{failing:?}: {result:?}"); + // The cleanup runs on its own task. + for _ in 0..100 { + if sent.lock().unwrap().len() >= expected.len() { + break; + } + tokio::time::sleep(std::time::Duration::from_millis(20)).await; + } + tokio::time::sleep(std::time::Duration::from_millis(100)).await; + assert_eq!(*sent.lock().unwrap(), expected, "{failing:?}"); + rpc.abort(); + } + } } diff --git a/rust/crates/kit/src/mpp/server/mod.rs b/rust/crates/kit/src/mpp/server/mod.rs index 473aa3410..3fd9f7632 100644 --- a/rust/crates/kit/src/mpp/server/mod.rs +++ b/rust/crates/kit/src/mpp/server/mod.rs @@ -10,6 +10,7 @@ mod channel_charge; pub mod charge; pub mod html; pub mod session; +mod session_refund; pub mod subscription; #[cfg(feature = "axum")] diff --git a/rust/crates/kit/src/mpp/server/session.rs b/rust/crates/kit/src/mpp/server/session.rs index 083e08fa2..5dd654ea1 100644 --- a/rust/crates/kit/src/mpp/server/session.rs +++ b/rust/crates/kit/src/mpp/server/session.rs @@ -21,11 +21,19 @@ //! //! Replayed `open` payloads for an existing channel are idempotent: they //! never reset the voucher watermark or any other channel state. +//! +//! A charge (voucher, `use`, metered delivery) is admitted only on a confirmed +//! read of the channel account at most [`CHANNEL_SNAPSHOT_MAX_AGE_SECONDS`] +//! old, re-read as needed. A read showing a forced close sets +//! `close_requested_at` and makes the channel's lifecycle due at once; the host +//! must then settle it with [`SessionServer::seal_params`] before the grace +//! period ends. use solana_pubkey::Pubkey; use time::{format_description::well_known::Rfc3339, OffsetDateTime}; use crate::core::session::VoucherAcceptance; +use crate::core::store::{ObservedLifecycle, OnchainObservation, MAX_COMMITTED_AUTHORIZATIONS}; use crate::core::tx::{TxV1Mode, TxVersion}; use crate::mpp::error::{Error, Result}; use crate::mpp::program::payment_channels; @@ -120,6 +128,17 @@ const OPENED_ELSEWHERE_ERROR: &str = /// Index of the channel PDA among the `open` instruction's accounts. const OPEN_CHANNEL_ACCOUNT: usize = 5; +/// Longest `Idempotency-Key` an operator-signed `use` accepts, in bytes. Keys +/// are kept on the channel record, so their size is bounded. +pub const MAX_IDEMPOTENCY_KEY_BYTES: usize = 255; + +/// Longest a confirmed read of a channel account admits new charges on it. +/// +/// The payer can start a forced close at any time; the server learns of it at +/// most this long later and must still settle inside the grace period. It is +/// further capped at half the configured grace period. +pub const CHANNEL_SNAPSHOT_MAX_AGE_SECONDS: u64 = 30; + /// An open credential that passed the credential checks. struct ValidatedOpen { deposit: u64, @@ -337,6 +356,12 @@ pub struct SessionConfig { pub suggested_deposit: Option, /// Minimum accepted initial channel deposit. + /// + /// Required when [`fee_payer_signer`](Self::fee_payer_signer) is set: a + /// sponsored open makes the sponsor fund the channel and escrow rent, so + /// the refundable deposit is what it costs a client to make the sponsor + /// lock that SOL. A sponsored server without one refuses to issue + /// challenges or accept opens. pub minimum_deposit: Option, /// Currency identifier accepted in configuration (e.g., "USDC" or a mint). @@ -373,7 +398,8 @@ pub struct SessionConfig { /// Optional operator signer that sponsors session transaction fees and /// channel-account rent. When set, challenges advertise `feePayer: true` /// and clients leave this signer's fee-payer slot empty for the server to - /// co-sign after validating the transaction. + /// co-sign after validating the transaction. Requires + /// [`minimum_deposit`](Self::minimum_deposit). pub fee_payer_signer: Option>, /// Inactivity thresholds offered for a new channel. @@ -439,6 +465,20 @@ impl SessionConfig { &self.network, ) } + + /// A sponsor fronts the rent of every channel it opens, so it must name + /// the deposit floor that buys that rent rather than accept any non-zero + /// deposit. + fn check_sponsored_deposit_floor(&self) -> Result<()> { + if self.fee_payer_signer.is_some() && self.minimum_deposit.is_none() { + return Err(Error::InvalidConfig( + "sponsored sessions (fee_payer_signer) require minimum_deposit: the sponsor \ + funds each channel's rent" + .to_string(), + )); + } + Ok(()) + } } impl Default for SessionConfig { @@ -568,16 +608,26 @@ impl SealParams { /// Build distribution with the original mandatory callbacks, including /// terminal distributions whose actual payer refund is zero. The rent /// payer is the one recorded at open, never inferred from a signer. + /// + /// `clearance` comes from [`Self::payer_refund`]: the program forfeits a + /// due refund to the treasury when the payer's token account cannot + /// take it, so a sealed distribute is built only once that was ruled out. pub fn distribute_instruction( &self, treasury: &Pubkey, token_program: &Pubkey, + clearance: &crate::core::payment_channel::payer_refund::DistributeClearance, ) -> Result { let deployment = crate::mpp::program::channel_deployment::resolve( self.program_id, self.channel_version, self.channel_hooks.as_ref(), )?; + if clearance.channel() != &self.channel_id { + return Err(Error::Other( + "distribution clearance was issued for another channel".into(), + )); + } let payer = self .payer .ok_or_else(|| Error::Other("distribution missing payer".into()))?; @@ -784,6 +834,7 @@ impl SessionServer { /// as a non-retryable payment failure at open time. pub fn build_challenge_request(&self) -> Result { self.config.channel_deployment()?; + self.config.check_sponsored_deposit_floor()?; if self.config.decimals > 9 { return Err(Error::InvalidConfig( "session token decimals must be between 0 and 9".to_string(), @@ -887,6 +938,7 @@ impl SessionServer { payload: &OpenPayload, ) -> Result { self.config.channel_deployment()?; + self.config.check_sponsored_deposit_floor()?; let payer = parse_pubkey_field(&payload.payer, "payer")?; let payee = parse_pubkey_field(&payload.payee, "payee")?; let mint = parse_pubkey_field(&payload.mint, "mint")?; @@ -1598,6 +1650,14 @@ impl SessionServer { state.cumulative = state.cumulative.max(onchain_settled); state.spent_amount = state.spent_amount.max(onchain_settled); state.settled_on_chain = state.settled_on_chain.max(onchain_settled); + // The confirmed read above found the channel open. + state.record_onchain_observation( + OnchainObservation { + slot: None, + lifecycle: ObservedLifecycle::Open, + }, + now_unix_secs().max(0) as u64, + ); Ok(state) }), ) @@ -1771,6 +1831,9 @@ impl SessionServer { .cumulative_amount .parse() .map_err(|_| Error::Other("Invalid cumulative in voucher".to_string()))?; + self.refresh_channel_snapshot(&voucher.data.channel_id) + .await?; + let max_age = self.snapshot_max_age(); // Wire-agnostic acceptance (signature + monotonicity + deposit cap + // min-delta + idempotent replay + atomic advance) lives in core so the @@ -1779,6 +1842,8 @@ impl SessionServer { // outlast it so the operator can still redeem on-chain after the async // forced-close delay. let owner = self.config.operator.clone(); + let expires_at = voucher.data.expires_at.unwrap_or(0); + let grace_period = self.config.grace_period_seconds; let acceptance = crate::core::session::accept_voucher_with_commit( &self.store, &voucher.data.channel_id, @@ -1794,6 +1859,7 @@ impl SessionServer { // TypeScript/Python session servers' availability gate. amount, move |state, replay| { + require_fresh_snapshot(state, max_age)?; if replay && !allow_replay { return Err(StoreError::Internal( "voucher was already accepted; sign a new voucher for this request".into(), @@ -1807,10 +1873,7 @@ impl SessionServer { .ok_or_else(|| StoreError::Internal("session spent amount overflow".into()))?; let now_ms = now_unix_secs().saturating_mul(1_000) as u64; state.last_activity_at = now_ms; - state.lifecycle = state.idle_timeout_seconds.map(|seconds| ChannelLifecycle { - owner: owner.clone(), - close_after: now_ms.saturating_add(u64::from(seconds) * 1_000), - }); + state.lifecycle = idle_lifecycle(state, &owner, now_ms, expires_at, grace_period); Ok(()) }, ) @@ -1828,11 +1891,7 @@ impl SessionServer { ) -> Result { use ed25519_dalek::Signer; - if idempotency_key.is_empty() { - return Err(Error::Other( - "operator-signed use requires an Idempotency-Key".to_string(), - )); - } + check_idempotency_key(idempotency_key)?; if self.config.voucher_signer != VoucherSigner::Operator { return Err(Error::Other( "use is only valid for operator-signed sessions".to_string(), @@ -1857,6 +1916,8 @@ impl SessionServer { let idempotency_key = idempotency_key.to_string(); let price = self.config.amount; let lifecycle_owner = self.config.operator.clone(); + self.refresh_channel_snapshot(&channel_id).await?; + let max_age = self.snapshot_max_age(); let result = std::sync::Arc::new(std::sync::Mutex::new(None)); let result_out = std::sync::Arc::clone(&result); self.store @@ -1893,6 +1954,7 @@ impl SessionServer { }); return Ok(state); } + require_fresh_snapshot(&state, max_age)?; let cumulative = state.cumulative.checked_add(price).ok_or_else(|| { StoreError::Internal("session cumulative overflow".to_string()) })?; @@ -1925,10 +1987,7 @@ impl SessionServer { state.highest_voucher_expires_at = Some(0); let now_ms = now_unix_secs().saturating_mul(1_000) as u64; state.last_activity_at = now_ms; - state.lifecycle = state.idle_timeout_seconds.map(|seconds| ChannelLifecycle { - owner: lifecycle_owner.clone(), - close_after: now_ms.saturating_add(u64::from(seconds) * 1_000), - }); + state.lifecycle = idle_lifecycle(&state, &lifecycle_owner, now_ms, 0, 0); record_use( &mut state.processed_uses, crate::core::store::ProcessedUse { @@ -1985,11 +2044,7 @@ impl SessionServer { challenge_id: &str, idempotency_key: &str, ) -> Result { - if idempotency_key.is_empty() { - return Err(Error::Other( - "operator-signed use requires an Idempotency-Key".to_string(), - )); - } + check_idempotency_key(idempotency_key)?; if self.config.voucher_signer != VoucherSigner::Operator { return Err(Error::Other( "use is only valid for operator-signed sessions".to_string(), @@ -2009,6 +2064,7 @@ impl SessionServer { )); } check_use_binding(&state, &payload.authentication, &authentication).map_err(store_err)?; + self.refresh_channel_snapshot(&payload.channel_id).await?; Ok(AuthenticatedUse { channel_id: payload.channel_id.clone(), authentication, @@ -2073,6 +2129,8 @@ impl SessionServer { } let guard = std::sync::Arc::new(guard); let channel_id = authenticated.channel_id.clone(); + self.refresh_channel_snapshot(&channel_id).await?; + let max_age = self.snapshot_max_age(); for _ in 0..OPERATOR_CHARGE_ATTEMPTS { let state = self .store @@ -2135,6 +2193,7 @@ impl SessionServer { )); } check_bound_authentication(&state, &authenticated.authentication)?; + require_fresh_snapshot(&state, max_age)?; let recorded = recorded_use(&state, &authenticated)?; // A retry of this request reached the total since the // read: answer with its record and write nothing new. @@ -2169,10 +2228,7 @@ impl SessionServer { state.highest_voucher_expires_at = Some(0); let now_ms = now_unix_secs().saturating_mul(1_000) as u64; state.last_activity_at = now_ms; - state.lifecycle = state.idle_timeout_seconds.map(|seconds| ChannelLifecycle { - owner: lifecycle_owner.clone(), - close_after: now_ms.saturating_add(u64::from(seconds) * 1_000), - }); + state.lifecycle = idle_lifecycle(&state, &lifecycle_owner, now_ms, 0, 0); record_use( &mut state.processed_uses, crate::core::store::ProcessedUse { @@ -2232,6 +2288,161 @@ impl SessionServer { .is_some_and(|state| state.cumulative != base)) } + /// Longest a confirmed channel read admits charges on that channel. + fn snapshot_max_age(&self) -> u64 { + CHANNEL_SNAPSHOT_MAX_AGE_SECONDS.min(u64::from(self.config.grace_period_seconds) / 2) + } + + /// Re-read the channel account once half of + /// [`Self::snapshot_max_age`] has passed since the record's last + /// confirmed read, so a forced close started onchain fences the record + /// before it admits another charge. + /// + /// A due read that fails or finds no account refuses the charge. A read + /// showing the channel closing or closed records the close (no further + /// charges), makes the channel's lifecycle due now so the host settles it + /// inside the grace period, and refuses the charge. + async fn refresh_channel_snapshot(&self, channel_id: &str) -> Result<()> { + let now = now_unix_secs().max(0) as u64; + let max_age = self.snapshot_max_age(); + let due = std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false)); + let due_out = std::sync::Arc::clone(&due); + let observed_slot = std::sync::Arc::new(std::sync::atomic::AtomicU64::new(0)); + let observed_slot_out = std::sync::Arc::clone(&observed_slot); + self.store + .read_channel( + channel_id, + Box::new(move |state| { + if let Some(state) = state { + observed_slot_out.store( + state.onchain_observed_slot(), + std::sync::atomic::Ordering::Relaxed, + ); + } + let stale = state.is_some_and(|state| { + !state.sealed + && state.close_requested_at.is_none() + && !state + .pending_setup + .as_ref() + .is_some_and(|setup| setup.opens_channel) + && now + .saturating_sub(state.onchain_observed_at()) + .saturating_mul(2) + >= max_age + }); + due_out.store(stale, std::sync::atomic::Ordering::Relaxed); + Ok(()) + }), + ) + .await + .map_err(store_err)?; + if !due.load(std::sync::atomic::Ordering::Relaxed) { + return Ok(()); + } + // A lagging node may still show a closing channel as open: read from + // a bank at least as recent as the one last recorded, and record the + // answering slot so an older view can never renew the window. + let min_slot = observed_slot.load(std::sync::atomic::Ordering::Relaxed); + let (read, slot) = self + .read_channel_lifecycle(channel_id, now, min_slot) + .await?; + let (lifecycle, settled) = + read.ok_or_else(|| Error::Other(format!("Channel {channel_id} not found onchain")))?; + let owner = self.config.operator.clone(); + self.store + .mutate_channel( + channel_id, + None, + Box::new(move |state| { + state.settled_on_chain = state.settled_on_chain.max(settled); + let outcome = state.record_onchain_observation( + OnchainObservation { + slot: Some(slot), + lifecycle, + }, + now, + ); + if let crate::core::store::ObservationOutcome::Behind { recorded } = outcome { + return Err(StoreError::Internal(format!( + "channel read at slot {slot} is behind the recorded slot {recorded}" + ))); + } + if lifecycle != ObservedLifecycle::Open { + let now_ms = now.saturating_mul(1_000); + let close_after = state + .lifecycle + .as_ref() + .map_or(now_ms, |current| current.close_after.min(now_ms)); + state.lifecycle = Some(ChannelLifecycle { owner, close_after }); + } + Ok(()) + }), + ) + .await + .map_err(store_err)?; + match lifecycle { + ObservedLifecycle::Open => Ok(()), + ObservedLifecycle::Closing { started_at } => Err(Error::Other(format!( + "Channel close is pending — channel {channel_id} has been closing onchain \ + since {started_at}; no further charges accepted" + ))), + ObservedLifecycle::Terminal { .. } => Err(Error::Other(format!( + "Channel {channel_id} is already sealed onchain" + ))), + } + } + + /// The lifecycle and settled watermark of the channel account (`None` + /// when it does not exist), read at confirmed commitment from a bank at + /// or after `min_slot`, with the slot that answered. + #[cfg(feature = "server")] + async fn read_channel_lifecycle( + &self, + channel_id: &str, + now: u64, + min_slot: u64, + ) -> Result<(Option<(ObservedLifecycle, u64)>, u64)> { + if self.config.rpc_url.is_none() { + return Err(Error::Other(format!( + "channel {channel_id} needs a confirmed onchain read before it accepts charges, \ + and no RPC is configured" + ))); + } + let pipeline = self.transaction_pipeline().await?; + let deployment = self.config.channel_deployment()?; + let (data, slot) = pipeline + .read_confirmed_owned_account_data_at( + parse_pubkey(channel_id)?, + min_slot, + deployment.program_id, + ) + .await + .map_err(|error| Error::Rpc(format!("channel account read failed: {error}")))?; + let read = data + .map(|data| { + let channel = deployment.decode_channel(&data)?.channel; + Ok::<_, Error>(( + ObservedLifecycle::of_channel(channel.status, channel.closure_started_at, now), + channel.settlement.settled, + )) + }) + .transpose()?; + Ok((read, slot)) + } + + #[cfg(not(feature = "server"))] + async fn read_channel_lifecycle( + &self, + _channel_id: &str, + _now: u64, + _min_slot: u64, + ) -> Result<(Option<(ObservedLifecycle, u64)>, u64)> { + Err(Error::Other( + "session channel reads require the `server` feature".to_string(), + )) + } + /// Process a `topup` action: atomically update the channel's deposit cap. /// /// The additional amount must be positive and must not overflow the @@ -2306,6 +2517,7 @@ impl SessionServer { let cid = payload.channel_id.clone(); let lifecycle_owner = self.config.operator.clone(); + let grace_period = self.config.grace_period_seconds; let replay = std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false)); let replay_out = std::sync::Arc::clone(&replay); let transaction_signature = topup_signature.clone(); @@ -2342,10 +2554,13 @@ impl SessionServer { StoreError::Internal("top-up deposit overflow".to_string()) })?; let now_ms = now_unix_secs().saturating_mul(1_000) as u64; - state.lifecycle = state.idle_timeout_seconds.map(|seconds| ChannelLifecycle { - owner: lifecycle_owner.clone(), - close_after: now_ms.saturating_add(u64::from(seconds) * 1_000), - }); + state.lifecycle = idle_lifecycle( + &state, + &lifecycle_owner, + now_ms, + state.highest_voucher_expires_at.unwrap_or(0), + grace_period, + ); state.deposit = new_deposit; state.last_activity_at = now_ms; state @@ -2383,6 +2598,8 @@ impl SessionServer { .expires_at .unwrap_or(crate::mpp::protocol::intents::session::DEFAULT_SESSION_EXPIRES_AT); let directive_out = std::sync::Arc::new(std::sync::Mutex::new(None)); + self.refresh_channel_snapshot(&session_id).await?; + let max_age = self.snapshot_max_age(); self.store .update_channel( @@ -2405,6 +2622,7 @@ impl SessionServer { .to_string(), )); } + require_fresh_snapshot(&state, max_age)?; let reserved = state .pending_deliveries .iter() @@ -2598,6 +2816,7 @@ impl SessionServer { let signature = payload.voucher.signature.clone(); let expires_at = payload.voucher.data.expires_at.unwrap_or(0); let lifecycle_owner = self.config.operator.clone(); + let grace_period = self.config.grace_period_seconds; let commit_outcome = std::sync::Arc::new(std::sync::Mutex::new(None)); let _new_state = self .store @@ -2694,11 +2913,13 @@ impl SessionServer { // actively paying through the metered-delivery flow. let now_ms = now_unix_secs().saturating_mul(1_000) as u64; state.last_activity_at = now_ms; - state.lifecycle = - state.idle_timeout_seconds.map(|seconds| ChannelLifecycle { - owner: lifecycle_owner.clone(), - close_after: now_ms.saturating_add(u64::from(seconds) * 1_000), - }); + state.lifecycle = idle_lifecycle( + &state, + &lifecycle_owner, + now_ms, + expires_at, + grace_period, + ); state.committed_deliveries.push_back(CommittedDelivery { delivery_id: delivery_id.clone(), amount: actual_amount, @@ -2712,6 +2933,11 @@ impl SessionServer { cached_response: None, retain_until: 0, }); + // A commit evicted here can no longer be replayed, + // only refused: its delivery is no longer pending. + while state.committed_deliveries.len() > MAX_COMMITTED_AUTHORIZATIONS { + state.committed_deliveries.pop_front(); + } *commit_outcome.lock().unwrap() = Some((actual_amount, new_cumulative, CommitStatus::Committed)); Ok(state) @@ -2933,6 +3159,13 @@ impl SessionServer { } /// Return seal parameters for a channel ready for on-chain settlement. + /// + /// The channel's settled watermark is re-read onchain when an RPC is + /// configured (a failed read falls back to the stored one, so a retry + /// re-reads it). Once that watermark reaches the stored cumulative the + /// highest voucher can no longer be applied (the program requires it to + /// exceed `settled`), so no voucher is returned and the close seals at + /// the onchain watermark. pub async fn seal_params(&self, channel_id: &str) -> Result { let state = self .store @@ -2947,6 +3180,33 @@ impl SessionServer { state.cumulative, state.deposit ))); } + let mut state = state; + let now = now_unix_secs().max(0) as u64; + if let Ok((Some((_, onchain)), _)) = self.read_channel_lifecycle(channel_id, now, 0).await { + if onchain > state.settled_on_chain { + state.settled_on_chain = onchain; + self.store + .mutate_channel( + channel_id, + None, + Box::new(move |state| { + state.settled_on_chain = state.settled_on_chain.max(onchain); + Ok(()) + }), + ) + .await + .map_err(store_err)?; + } + } + let (voucher_signature, voucher_expires_at) = if state.settled_on_chain >= state.cumulative + { + (None, None) + } else { + ( + state.highest_voucher_signature, + state.highest_voucher_expires_at, + ) + }; let channel_pubkey = parse_pubkey(channel_id)?; let recipient_pubkey = parse_pubkey(&self.config.recipient)?; @@ -2980,9 +3240,9 @@ impl SessionServer { program_id, channel_version: self.config.channel_version, channel_hooks: self.config.channel_hooks.clone(), - settled: state.cumulative, - voucher_signature: state.highest_voucher_signature, - voucher_expires_at: state.highest_voucher_expires_at, + settled: state.cumulative.max(state.settled_on_chain), + voucher_signature, + voucher_expires_at, recipient: recipient_pubkey, splits: self.config.splits.clone(), distribution_hash, @@ -2991,16 +3251,112 @@ impl SessionServer { /// Mark a channel as sealed (call after the on-chain seal tx confirms). pub async fn mark_sealed(&self, channel_id: &str) -> Result<()> { - self.store.mark_sealed(channel_id).await.map_err(store_err) + self.store + .mark_sealed(channel_id) + .await + .map_err(store_err)?; + let now = now_unix_secs(); + self.store + .mutate_channel( + channel_id, + None, + Box::new(move |state| { + state + .extra + .entry(SEALED_AT_KEY.to_string()) + .or_insert_with(|| now.into()); + Ok(()) + }), + ) + .await + .map_err(store_err) + } + + /// When [`Self::mark_sealed`] first recorded the channel sealed (unix + /// seconds), the start of a deferred distribute's deadline + /// ([`SealParams::payer_refund`]). + pub async fn sealed_at(&self, channel_id: &str) -> Result> { + Ok(self + .store + .get_channel(channel_id) + .await + .map_err(store_err)? + .and_then(|state| state.extra.get(SEALED_AT_KEY)?.as_i64())) } } +/// Where a session record keeps the time it was first recorded sealed, +/// inside [`ChannelState::extra`]. +const SEALED_AT_KEY: &str = "mppSealedAt"; + // ── Helpers ── fn store_err(e: StoreError) -> Error { Error::Other(e.to_string()) } +/// An operator-signed `use` must name its request with a non-empty +/// `Idempotency-Key` of at most [`MAX_IDEMPOTENCY_KEY_BYTES`]. +fn check_idempotency_key(key: &str) -> Result<()> { + if key.is_empty() { + return Err(Error::Other( + "operator-signed use requires an Idempotency-Key".to_string(), + )); + } + if key.len() > MAX_IDEMPOTENCY_KEY_BYTES { + return Err(Error::Other(format!( + "Idempotency-Key exceeds {MAX_IDEMPOTENCY_KEY_BYTES} bytes" + ))); + } + Ok(()) +} + +/// The idle-close deadline after activity at `now_ms`: the negotiated idle +/// timeout, but never later than `grace_period` seconds before the expiry of +/// the voucher the close will settle (`0`: never expires), so that voucher is +/// still redeemable when the host closes the channel. +fn idle_lifecycle( + state: &ChannelState, + owner: &str, + now_ms: u64, + voucher_expires_at: i64, + grace_period: u32, +) -> Option { + state.idle_timeout_seconds.map(|seconds| { + let idle = now_ms.saturating_add(u64::from(seconds) * 1_000); + let close_after = match u64::try_from(voucher_expires_at) { + Ok(expires_at) if expires_at > 0 => idle.min( + expires_at + .saturating_sub(u64::from(grace_period)) + .saturating_mul(1_000), + ), + _ => idle, + }; + ChannelLifecycle { + owner: owner.to_string(), + close_after, + } + }) +} + +/// Refuse a charge on a record whose last confirmed onchain read is older +/// than `max_age` seconds: only a fresh read can rule out a forced close. +/// Checked inside every admitting mutation, after +/// [`SessionServer::refresh_channel_snapshot`]. +fn require_fresh_snapshot( + state: &ChannelState, + max_age: u64, +) -> std::result::Result<(), StoreError> { + let now = now_unix_secs().max(0) as u64; + if now.saturating_sub(state.onchain_observed_at()) > max_age { + return Err(StoreError::Internal(format!( + "channel {} has no confirmed onchain read in the last {max_age}s", + state.channel_id + ))); + } + Ok(()) +} + /// The checks a `use` proof must pass against the channel record: the /// channel is operator-signed and bound at open to exactly this proof, which /// was issued for the opening challenge by the payer and verifies over the @@ -3426,7 +3782,7 @@ async fn submit_and_fetch_open( // first submission landed (response lost, or the store write after it // failed) dies at preflight with "already processed", and the pipeline // still reports that signature's confirmed landing. - let submission = pipeline.submit_verified(&tx).await; + let submission = submit_client_transaction(pipeline, tx, config).await; let min_context_slot = submission.as_ref().ok().map(|confirmed| confirmed.slot); if let (Some(floor), Ok(landed)) = (activation_floor, &submission) { if let Err(elsewhere) = landed_here(landed.slot, floor) { @@ -3446,6 +3802,31 @@ async fn submit_and_fetch_open( }) } +/// Broadcast a validated client `open` or `topUp` and await confirmation. +/// One the configured sponsor pays the fee for is simulated first: it is +/// charged for a transaction that fails on-chain, and the offline checks +/// cannot show that the payer holds the tokens it moves. +#[cfg(feature = "server")] +async fn submit_client_transaction( + pipeline: &crate::core::tx_pipeline::TxPipeline, + tx: solana_transaction::versioned::VersionedTransaction, + config: &SessionConfig, +) -> std::result::Result< + crate::core::tx_pipeline::ConfirmedTransaction, + crate::core::tx_pipeline::TxPipelineError, +> { + let sponsor = config + .fee_payer_signer + .as_ref() + .map(|signer| signer.pubkey()); + if sponsor.is_some() && tx.message.static_account_keys().first() == sponsor.as_ref() { + let simulated = pipeline.simulate(tx).await?; + pipeline.submit_simulated(&simulated).await + } else { + pipeline.submit_verified(&tx).await + } +} + #[cfg(feature = "server")] async fn validate_open_slot( pipeline: &crate::core::tx_pipeline::TxPipeline, @@ -3715,8 +4096,7 @@ async fn verify_submit_and_fetch_topup( // atomic mutator in `process_topup_with_outcome` credits // `additionalAmount` once per distinct signature — stacking N credits in // the store for one real on-chain deposit. - let confirmed = pipeline - .submit_verified(&tx) + let confirmed = submit_client_transaction(pipeline, tx, config) .await .map_err(|error| Error::Rpc(format!("top-up submission failed: {error}")))?; // A confirmed signature can still be forked out, and the aggregate @@ -4001,6 +4381,33 @@ mod tests { } } + // A sponsor funds each channel's rent; without a deposit floor a 1-unit + // deposit buys that rent, so a sponsored server must name the floor. + #[test] + fn sponsored_sessions_require_a_minimum_deposit() { + let mut cfg = config(VoucherSigner::Client); + cfg.fee_payer_signer = Some(shared_signer(8)); + cfg.minimum_deposit = None; + let server = SessionServer::new(cfg.clone(), MemoryChannelStore::new()); + let challenge = server.build_challenge_request().unwrap_err().to_string(); + assert!(challenge.contains("minimum_deposit"), "{challenge}"); + let open = valid_open(&server); + let open = server.payment_channel_open_params(&open).unwrap_err(); + assert!(open.to_string().contains("minimum_deposit"), "{open}"); + + // Positive controls: a sponsored server with a floor, and an + // unsponsored one without, both get past the check. + cfg.minimum_deposit = Some(100); + let server = SessionServer::new(cfg, MemoryChannelStore::new()); + let open = valid_open(&server); + server.payment_channel_open_params(&open).unwrap(); + let mut unsponsored = config(VoucherSigner::Client); + unsponsored.minimum_deposit = None; + let server = SessionServer::new(unsponsored, MemoryChannelStore::new()); + let open = valid_open(&server); + server.payment_channel_open_params(&open).unwrap(); + } + #[test] fn v2_network_is_checked_for_raw_config_and_challenges_before_rpc() { let mut config = config(VoucherSigner::Client); @@ -4033,7 +4440,7 @@ mod tests { } fn state(channel_id: String, authorized_signer: String) -> ChannelState { - ChannelState { + let mut state = ChannelState { channel_id, authorized_signer, deposit: 1_000, @@ -4064,7 +4471,15 @@ mod tests { lifecycle: None, schema_version: CHANNEL_STATE_SCHEMA_VERSION, extra: Default::default(), - } + }; + state.record_onchain_observation( + OnchainObservation { + slot: None, + lifecycle: ObservedLifecycle::Open, + }, + now_unix_secs() as u64, + ); + state } async fn client_server() -> (SessionServer, ActiveSession, String) { @@ -4151,6 +4566,9 @@ mod tests { enum LandedStatus { Finalized, Failed, + /// Fails simulation (e.g. the payer cannot fund it) and would fail + /// on-chain if sent. + Unexecutable, /// Confirmed but never finalized (e.g. on a fork that is abandoned). ConfirmedOnly, } @@ -4246,6 +4664,27 @@ mod tests { Ok(json!({"context": {"slot": 42}, "value": true})) } "getSlot" => Ok(json!(slot.load(std::sync::atomic::Ordering::SeqCst))), + "simulateTransaction" => { + assert_eq!(request["params"][1]["commitment"], "confirmed"); + assert_eq!(request["params"][1]["replaceRecentBlockhash"], false); + let signature = payment_channels::decode_transaction( + request["params"][0].as_str().unwrap(), + ) + .unwrap() + .signatures[0] + .to_string(); + let err = if landed.lock().unwrap().contains_key(&signature) { + json!("AlreadyProcessed") + } else if landed_status == LandedStatus::Unexecutable { + json!({"InstructionError": [1, {"Custom": 1}]}) + } else { + Value::Null + }; + Ok(json!({ + "context": { "slot": slot.load(std::sync::atomic::Ordering::SeqCst) }, + "value": { "err": err, "logs": [], "accounts": null, "unitsConsumed": 0 } + })) + } "sendTransaction" => { send_tx_count.fetch_add(1, std::sync::atomic::Ordering::SeqCst); let signature = payment_channels::decode_transaction( @@ -4284,7 +4723,10 @@ mod tests { .get(signature.as_str().unwrap()) .copied() { - if landed_status == LandedStatus::Failed { + if matches!( + landed_status, + LandedStatus::Failed | LandedStatus::Unexecutable + ) { // A signature the RPC saw land, but // whose execution failed on-chain // (e.g. insufficient fee-payer @@ -4535,7 +4977,7 @@ mod tests { use crate::core::tx::{ComputeBudget, TxVersion}; use crate::mpp::client::session::{ build_open_payment_channel_transaction, BuildOpenPaymentChannelTransactionParams, - PaymentChannelOpenOptions, + OpenBlockhash, PaymentChannelOpenOptions, SessionOpenAuthorization, }; let mut cfg = config(VoucherSigner::Client); @@ -4558,7 +5000,15 @@ mod tests { signer: payer.as_ref(), authorized_signer: params.authorized_signer, fee_payer: None, - recent_blockhash: None, + blockhash: OpenBlockhash::from_client_cluster(test_blockhash()), + authorization: &SessionOpenAuthorization::client_signed( + request + .suggested_deposit + .as_deref() + .unwrap() + .parse() + .unwrap(), + ), options: PaymentChannelOpenOptions { compute_budget: Some(budget), salt: Some(params.salt), @@ -4676,6 +5126,73 @@ mod tests { rpc.abort(); } + // The sponsor pays the fee of a sponsored open even when it fails + // on-chain (an empty payer token account), so one that fails simulation + // never reaches the network. + #[cfg(feature = "server")] + #[tokio::test(flavor = "multi_thread")] + async fn sponsored_open_that_fails_simulation_is_never_broadcast() { + use payment_channels::generated::generated::types::SettlementWatermarks; + + for (status, lands) in [ + (LandedStatus::Unexecutable, false), + (LandedStatus::Finalized, true), + ] { + let sponsor = shared_signer(8); + let mut cfg = config(VoucherSigner::Client); + cfg.fee_payer_signer = Some(std::sync::Arc::clone(&sponsor)); + let mut server = SessionServer::new(cfg, MemoryChannelStore::new()); + let (open, params) = signed_open(&server, 6).await; + let channel = payment_channels::generated::generated::accounts::Channel { + discriminator: 1, + version: 1, + bump: 1, + status: 0, + salt: params.salt, + deposit: params.deposit, + settlement: SettlementWatermarks { + settled: 0, + payout_watermark: 0, + }, + closure_started_at: 0, + payer_withdrawn_at: 0, + grace_period: params.grace_period, + distribution_hash: payment_channels::distribution_hash(¶ms.recipients), + payer: payment_channels::to_address(¶ms.payer), + payee: payment_channels::to_address(¶ms.payee), + authorized_signer: payment_channels::to_address(¶ms.authorized_signer), + mint: payment_channels::to_address(¶ms.mint), + rent_payer: payment_channels::to_address(¶ms.rent_payer), + open_slot: params.open_slot, + }; + let (url, rpc, sends) = rpc_for_channel_with_options(channel, 43, status).await; + server.config.rpc_url = Some(url); + let blockhash = test_blockhash().to_string(); + let result = server + .process_open( + &open, + SessionOpenContext { + challenge_id: "opening", + expires: None, + recent_blockhash: &blockhash, + recent_slot: CHALLENGED_SLOT, + }, + ) + .await; + if lands { + result.unwrap(); + } else { + let error = result.unwrap_err().to_string(); + assert!(error.contains("failed simulation"), "{error}"); + } + assert_eq!( + sends.load(std::sync::atomic::Ordering::SeqCst), + usize::from(lands) + ); + rpc.abort(); + } + } + #[cfg(feature = "server")] #[tokio::test(flavor = "multi_thread")] async fn sponsored_open_rejects_payer_aliasing_the_fee_payer() { @@ -6442,6 +6959,111 @@ mod tests { rpc.abort(); } + // A sponsored top-up the payer cannot fund fails simulation and is never + // broadcast at the sponsor's expense. + #[cfg(feature = "server")] + #[tokio::test(flavor = "multi_thread")] + async fn sponsored_topup_that_fails_simulation_is_never_broadcast() { + use payment_channels::generated::generated::types::SettlementWatermarks; + + for (status, lands) in [ + (LandedStatus::Unexecutable, false), + (LandedStatus::Finalized, true), + ] { + let (mut server, _session, channel_id) = client_server().await; + let payer = signer(5); + let sponsor = shared_signer(8); + server.config.fee_payer_signer = Some(std::sync::Arc::clone(&sponsor)); + server + .store + .update_channel( + &channel_id, + Box::new({ + let payer = payer.pubkey().to_string(); + let rent_payer = sponsor.pubkey().to_string(); + move |state| { + let mut state = state.unwrap(); + state.payer = payer; + state.rent_payer = rent_payer; + Ok(state) + } + }), + ) + .await + .unwrap(); + let channel = Pubkey::from_str(&channel_id).unwrap(); + let mint = Pubkey::from_str(mints::USDC_MAINNET).unwrap(); + let token_program = Pubkey::from_str(programs::TOKEN_PROGRAM).unwrap(); + let program_id = payment_channels::default_program_id(); + let ix = payment_channels::build_top_up_instruction( + &payer.pubkey(), + &channel, + &mint, + 100, + &token_program, + &program_id, + ); + let mut tx = crate::core::tx::build_unsigned_unchecked( + crate::core::tx::TxVersion::V0, + &sponsor.pubkey(), + &[ix], + solana_hash::Hash::new_unique(), + None, + ) + .unwrap(); + crate::core::signing::sign_versioned_transaction_slot(payer.as_ref(), &mut tx) + .await + .unwrap(); + let transaction = crate::core::tx::encode(&tx).unwrap(); + // The on-chain account already reflects deposit=1_100 — as if a + // *different* concurrent top-up already landed — even though THIS + // request's own transaction is about to be reported as failed. + let account = payment_channels::generated::generated::accounts::Channel { + discriminator: 1, + version: 1, + bump: 1, + status: 0, + salt: 7, + deposit: 1_100, + settlement: SettlementWatermarks { + settled: 0, + payout_watermark: 0, + }, + closure_started_at: 0, + payer_withdrawn_at: 0, + grace_period: server.config.grace_period_seconds, + distribution_hash: [0; 32], + payer: payment_channels::to_address(&payer.pubkey()), + payee: payment_channels::to_address( + &Pubkey::from_str(&server.config.recipient).unwrap(), + ), + authorized_signer: payment_channels::to_address(&signer(1).pubkey()), + mint: payment_channels::to_address(&mint), + rent_payer: payment_channels::to_address(&sponsor.pubkey()), + open_slot: 42, + }; + let (url, rpc, sends) = rpc_for_channel_with_options(account, 43, status).await; + server.config.rpc_url = Some(url); + let payload = TopUpPayload { + channel_id: channel_id.clone(), + additional_amount: "100".into(), + transaction, + }; + let result = server.process_topup_with_outcome(&payload).await; + if lands { + result.unwrap(); + } else { + let error = result.unwrap_err().to_string(); + assert!(error.contains("failed simulation"), "{error}"); + } + assert_eq!( + sends.load(std::sync::atomic::Ordering::SeqCst), + usize::from(lands) + ); + rpc.abort(); + } + } + /// Regression: a top-up whose own transaction fails on-chain must not be /// credited just because the channel's *aggregate* on-chain deposit /// happens to already meet `state.deposit + amount` — that aggregate can @@ -6768,22 +7390,97 @@ mod tests { ); } - #[tokio::test] - async fn seal_params_refuses_a_watermark_above_deposit() { - let (server, _session, channel_id) = client_server().await; - server - .store - .update_channel( - &channel_id, - Box::new(|state| { - let mut state = state.unwrap(); - state.cumulative = state.deposit + 1; - Ok(state) - }), - ) - .await - .unwrap(); - assert!(server.seal_params(&channel_id).await.is_err()); + #[cfg(feature = "server")] + /// A client channel at cumulative 100 holding its highest voucher, whose + /// account (served when `onchain_settled` is set) has settled that much. + async fn sealable_channel( + onchain_settled: Option, + ) -> ( + SessionServer, + String, + Option>, + ) { + let channel = Pubkey::new_unique(); + let channel_id = channel.to_string(); + let mut session = ActiveSession::new(channel, signer(1)); + let voucher = session.sign_increment(100).await.unwrap(); + let mut stored = state(channel_id.clone(), signer_address(1)); + stored.cumulative = 100; + stored.highest_voucher_signature = Some(voucher.signature); + stored.highest_voucher_expires_at = Some(voucher.data.expires_at.unwrap_or(0)); + let mut cfg = config(VoucherSigner::Client); + let rpc = match onchain_settled { + Some(settled) => { + let account = channel_account(&stored, 0, 0, settled); + let (url, rpc, _) = rpc_for_channel(account, 43).await; + cfg.rpc_url = Some(url); + Some(rpc) + } + None => None, + }; + (seeded_server(cfg, stored).await, channel_id, rpc) + } + + #[cfg(feature = "server")] + #[tokio::test] + async fn seal_params_omits_a_voucher_already_settled_onchain() { + let (server, channel_id, rpc) = sealable_channel(Some(100)).await; + let seal = server.seal_params(&channel_id).await.unwrap(); + assert_eq!(seal.settled, 100); + assert!(seal.voucher_signature.is_none()); + let operator = Pubkey::from_str(&server.config.operator).unwrap(); + // settle_and_seal alone, with no Ed25519 voucher instruction. + assert_eq!(seal.settle_instructions(&operator).unwrap().len(), 1); + assert_eq!(stored(&server, &channel_id).await.settled_on_chain, 100); + + // The recorded watermark keeps the voucher out without a read. + rpc.unwrap().abort(); + assert!(server + .seal_params(&channel_id) + .await + .unwrap() + .voucher_signature + .is_none()); + } + + #[cfg(feature = "server")] + #[tokio::test] + async fn seal_params_keeps_a_voucher_above_the_onchain_watermark() { + let (server, channel_id, rpc) = sealable_channel(Some(40)).await; + let seal = server.seal_params(&channel_id).await.unwrap(); + assert_eq!(seal.settled, 100); + assert!(seal.voucher_signature.is_some()); + let operator = Pubkey::from_str(&server.config.operator).unwrap(); + assert_eq!(seal.settle_instructions(&operator).unwrap().len(), 2); + assert_eq!(stored(&server, &channel_id).await.settled_on_chain, 40); + rpc.unwrap().abort(); + + // Without an RPC the stored watermark decides. + let (server, channel_id, _) = sealable_channel(None).await; + assert!(server + .seal_params(&channel_id) + .await + .unwrap() + .voucher_signature + .is_some()); + } + + #[tokio::test] + async fn seal_params_refuses_a_watermark_above_deposit() { + let (server, _session, channel_id) = client_server().await; + server + .store + .update_channel( + &channel_id, + Box::new(|state| { + let mut state = state.unwrap(); + state.cumulative = state.deposit + 1; + Ok(state) + }), + ) + .await + .unwrap(); + assert!(server.seal_params(&channel_id).await.is_err()); } fn action_voucher(action: crate::mpp::SessionAction) -> VoucherPayload { @@ -7308,6 +8005,358 @@ mod tests { assert_eq!(after.spent_amount, 50); } + #[cfg(feature = "server")] + /// A channel account as the program stores it, at `status` with a forced + /// close started at `closure_started_at` (`0`: none). + fn channel_account( + state: &ChannelState, + status: u8, + closure_started_at: i64, + settled: u64, + ) -> payment_channels::generated::generated::accounts::Channel { + let key = |value: &str| payment_channels::to_address(&Pubkey::from_str(value).unwrap()); + payment_channels::generated::generated::accounts::Channel { + discriminator: 1, + version: 1, + bump: 1, + status, + salt: 7, + deposit: state.deposit, + settlement: payment_channels::generated::generated::types::SettlementWatermarks { + settled, + payout_watermark: 0, + }, + closure_started_at, + payer_withdrawn_at: 0, + grace_period: payment_channels::DEFAULT_GRACE_PERIOD_SECONDS, + distribution_hash: [0; 32], + payer: key(&state.payer), + payee: payment_channels::to_address(&Pubkey::new_unique()), + authorized_signer: key(&state.authorized_signer), + mint: payment_channels::to_address(&Pubkey::new_unique()), + rent_payer: key(&state.rent_payer), + open_slot: 42, + } + } + + /// `stored`, last confirmed onchain long ago. + fn stale(mut stored: ChannelState) -> ChannelState { + stored.record_onchain_observation( + OnchainObservation { + slot: None, + lifecycle: ObservedLifecycle::Open, + }, + 1, + ); + stored + } + + /// A client-signed channel whose snapshot is stale, served by a fixture + /// RPC holding its account at `status` / `closure_started_at`. + #[cfg(feature = "server")] + async fn client_channel_onchain( + status: u8, + closure_started_at: i64, + ) -> ( + SessionServer, + ActiveSession, + String, + tokio::task::JoinHandle<()>, + ) { + let channel = Pubkey::new_unique(); + let channel_id = channel.to_string(); + let stored = stale(state(channel_id.clone(), signer_address(1))); + let account = channel_account(&stored, status, closure_started_at, 0); + let (url, rpc, _) = rpc_for_channel(account, 43).await; + let mut cfg = config(VoucherSigner::Client); + cfg.rpc_url = Some(url); + ( + seeded_server(cfg, stored).await, + ActiveSession::new(channel, signer(1)), + channel_id, + rpc, + ) + } + + #[cfg(feature = "server")] + #[tokio::test] + async fn a_forced_close_started_onchain_stops_vouchers_and_makes_the_close_due() { + let started_at = now_unix_secs() - 10; + let (server, mut session, channel_id, rpc) = client_channel_onchain(2, started_at).await; + let voucher = session.sign_increment(100).await.unwrap(); + let error = server + .verify_voucher(&voucher_payload(voucher)) + .await + .unwrap_err(); + assert!(error.to_string().contains("closing onchain"), "{error}"); + + let after = stored(&server, &channel_id).await; + assert_eq!(after.cumulative, 0); + assert_eq!(after.spent_amount, 0); + assert_eq!(after.close_requested_at, Some(started_at as u64)); + let due = after + .lifecycle + .expect("closing channel is scheduled") + .close_after; + assert!(due <= now_unix_secs() as u64 * 1_000); + + // The record alone now refuses every further voucher. + rpc.abort(); + let next = session.sign_increment(100).await.unwrap(); + let error = server + .verify_voucher_for_amount(&voucher_payload(next), 25) + .await + .unwrap_err(); + assert!(error.to_string().contains("close is pending"), "{error}"); + assert!(server + .begin_delivery(DeliveryRequest::new(channel_id.clone(), 10)) + .await + .is_err()); + } + + #[cfg(feature = "server")] + #[tokio::test] + async fn an_open_channel_read_renews_the_snapshot_and_admits_the_voucher() { + let (server, mut session, channel_id, rpc) = client_channel_onchain(0, 0).await; + let voucher = session.sign_increment(100).await.unwrap(); + let accepted = server + .verify_voucher(&voucher_payload(voucher)) + .await + .unwrap(); + assert_eq!(accepted.charged, 100); + let after = stored(&server, &channel_id).await; + assert!(after.close_requested_at.is_none()); + assert!(now_unix_secs() as u64 - after.onchain_observed_at() <= 1); + + // Inside the window the snapshot stands in for a read. + rpc.abort(); + let next = session.sign_increment(100).await.unwrap(); + assert_eq!( + server + .verify_voucher(&voucher_payload(next)) + .await + .unwrap() + .charged, + 100 + ); + assert!(server + .begin_delivery(DeliveryRequest::new(channel_id, 10)) + .await + .is_ok()); + } + + /// A lagging RPC node can still show a channel open after the payer + /// started closing it: a read from a bank older than the recorded one + /// never renews the charge window. + #[cfg(feature = "server")] + #[tokio::test] + async fn a_read_behind_the_recorded_slot_never_renews_the_snapshot() { + let channel = Pubkey::new_unique(); + let channel_id = channel.to_string(); + let mut record = state(channel_id.clone(), signer_address(1)); + record.record_onchain_observation( + OnchainObservation { + slot: Some(100), + lifecycle: ObservedLifecycle::Open, + }, + 1, + ); + let account = channel_account(&record, 0, 0, 0); + // The node answers from slot 43, behind the recorded 100. + let (url, _rpc, _) = rpc_for_channel(account, 43).await; + let mut cfg = config(VoucherSigner::Client); + cfg.rpc_url = Some(url); + let server = seeded_server(cfg, record).await; + let mut session = ActiveSession::new(channel, signer(1)); + let voucher = session.sign_increment(100).await.unwrap(); + assert!(server + .verify_voucher(&voucher_payload(voucher)) + .await + .is_err()); + let after = stored(&server, &channel_id).await; + assert_eq!(after.cumulative, 0); + assert_eq!(after.onchain_observed_at(), 1, "the window was not renewed"); + assert_eq!(after.onchain_observed_slot(), 100); + } + + #[tokio::test] + async fn a_stale_snapshot_without_a_read_refuses_every_charge() { + let channel = Pubkey::new_unique(); + let channel_id = channel.to_string(); + let server = seeded_server( + config(VoucherSigner::Client), + stale(state(channel_id.clone(), signer_address(1))), + ) + .await; + let mut session = ActiveSession::new(channel, signer(1)); + let voucher = session.sign_increment(100).await.unwrap(); + assert!(server + .verify_voucher(&voucher_payload(voucher)) + .await + .is_err()); + assert!(server + .begin_delivery(DeliveryRequest::new(channel_id.clone(), 10)) + .await + .is_err()); + let after = stored(&server, &channel_id).await; + assert_eq!(after.cumulative, 0); + assert!(after.pending_deliveries.is_empty()); + + let cfg = config(VoucherSigner::Operator); + let channel_id = Pubkey::new_unique().to_string(); + let proof = SessionAuthentication::sign("opening", &channel_id, &key(3)).unwrap(); + let mut bound = stale(state(channel_id.clone(), cfg.operator.clone())); + bound.payer = proof.payer.clone(); + bound.authentication = Some(serde_json::to_string(&proof).unwrap()); + bound.voucher_signer = "operator".into(); + let server = seeded_server(cfg, bound).await; + let payload = UsePayload { + channel_id: channel_id.clone(), + authentication: proof, + }; + assert!(server + .process_use(&payload, "use-1", "request-1") + .await + .is_err()); + assert!(server + .authenticate_use(&payload, "use-1", "request-1") + .await + .is_err()); + assert_eq!(stored(&server, &channel_id).await.cumulative, 0); + } + + #[cfg(feature = "server")] + #[tokio::test] + async fn operator_use_stops_once_the_channel_is_closing_onchain() { + let cfg = config(VoucherSigner::Operator); + let channel_id = Pubkey::new_unique().to_string(); + let proof = SessionAuthentication::sign("opening", &channel_id, &key(3)).unwrap(); + let mut bound = stale(state(channel_id.clone(), cfg.operator.clone())); + bound.payer = proof.payer.clone(); + bound.authentication = Some(serde_json::to_string(&proof).unwrap()); + bound.voucher_signer = "operator".into(); + let account = channel_account(&bound, 2, now_unix_secs() - 5, 0); + let (url, rpc, _) = rpc_for_channel(account, 43).await; + let mut cfg = cfg; + cfg.rpc_url = Some(url); + let server = seeded_server(cfg, bound).await; + let payload = UsePayload { + channel_id: channel_id.clone(), + authentication: proof, + }; + let error = server + .process_use(&payload, "use-1", "request-1") + .await + .unwrap_err(); + assert!(error.to_string().contains("closing onchain"), "{error}"); + assert!(server + .authenticate_use(&payload, "use-2", "request-2") + .await + .is_err()); + let after = stored(&server, &channel_id).await; + assert_eq!(after.cumulative, 0); + assert!(after.close_requested_at.is_some()); + rpc.abort(); + } + + #[test] + fn admission_requires_a_snapshot_inside_the_window() { + let fresh = state(Pubkey::new_unique().to_string(), signer_address(1)); + assert!(require_fresh_snapshot(&fresh, 30).is_ok()); + assert!(require_fresh_snapshot(&stale(fresh), 30).is_err()); + } + + #[test] + fn channel_status_maps_to_the_observed_lifecycle() { + assert_eq!( + ObservedLifecycle::of_channel(0, 0, 9), + ObservedLifecycle::Open + ); + assert_eq!( + ObservedLifecycle::of_channel(2, 5, 9), + ObservedLifecycle::Closing { started_at: 5 } + ); + assert_eq!( + ObservedLifecycle::of_channel(1, 0, 9), + ObservedLifecycle::Terminal { + started_at: Some(1) + } + ); + assert_eq!( + ObservedLifecycle::of_channel(3, 0, 9), + ObservedLifecycle::Terminal { + started_at: Some(1) + } + ); + } + + #[tokio::test] + async fn idle_close_comes_before_the_settled_voucher_expires() { + let (mut server, mut session, channel_id) = client_server().await; + server.config.grace_period_seconds = 900; + server + .store + .mutate_channel( + &channel_id, + None, + Box::new(|state| { + state.idle_timeout_seconds = Some(3_600); + Ok(()) + }), + ) + .await + .unwrap(); + // Outlasts the grace period, so it is accepted, but expires long + // before the one-hour idle timeout would close the channel. + let expires_at = now_unix_secs() + 960; + session.set_expires_at(expires_at); + let voucher = session.sign_increment(100).await.unwrap(); + server + .verify_voucher(&voucher_payload(voucher)) + .await + .unwrap(); + let close_after = stored(&server, &channel_id) + .await + .lifecycle + .unwrap() + .close_after; + assert_eq!(close_after, (expires_at as u64 - 900) * 1_000); + + let directive = server + .begin_delivery(DeliveryRequest::new(channel_id.clone(), 10)) + .await + .unwrap(); + session.set_expires_at(expires_at + 30); + let payload = CommitPayload { + delivery_id: directive.delivery_id, + voucher: session.sign_increment(10).await.unwrap(), + }; + server.process_commit(&payload).await.unwrap(); + let close_after = stored(&server, &channel_id) + .await + .lifecycle + .unwrap() + .close_after; + assert_eq!(close_after, (expires_at as u64 + 30 - 900) * 1_000); + } + + #[tokio::test] + async fn a_never_expiring_voucher_keeps_the_idle_timeout() { + let (server, mut session, channel_id) = client_server().await; + session.set_expires_at(0); + let voucher = session.sign_increment(100).await.unwrap(); + let before = now_unix_secs() as u64 * 1_000; + server + .verify_voucher(&voucher_payload(voucher)) + .await + .unwrap(); + let after = stored(&server, &channel_id).await; + let close_after = after.lifecycle.unwrap().close_after; + // `state` negotiates a 60-second idle timeout. + assert!(close_after >= before + 60_000); + assert!(close_after <= after.last_activity_at + 60_000); + } + #[tokio::test] async fn deliveries_commit_partially_and_are_idempotent() { let (server, mut session, channel_id) = client_server().await; @@ -7649,6 +8698,67 @@ mod tests { (server, payload, memory_signer(9)) } + #[tokio::test] + async fn operator_use_bounds_the_idempotency_key() { + let (server, payload, _) = operator_channel().await; + let too_long = "k".repeat(MAX_IDEMPOTENCY_KEY_BYTES + 1); + let error = server + .process_use(&payload, "use-1", &too_long) + .await + .unwrap_err(); + assert!(error.to_string().contains("exceeds"), "{error}"); + assert!(server + .authenticate_use(&payload, "use-1", &too_long) + .await + .is_err()); + assert!(stored(&server, &payload.channel_id) + .await + .processed_uses + .is_empty()); + + let longest = "k".repeat(MAX_IDEMPOTENCY_KEY_BYTES); + assert!(server + .process_use(&payload, "use-1", &longest) + .await + .is_ok()); + assert!(server + .authenticate_use(&payload, "use-2", &longest) + .await + .is_ok()); + } + + #[tokio::test] + async fn committed_deliveries_keep_a_bounded_replay_window() { + let (server, mut session, channel_id) = client_server().await; + let commits = MAX_COMMITTED_AUTHORIZATIONS + 2; + let mut first = None; + for _ in 0..commits { + let directive = server + .begin_delivery(DeliveryRequest::new(channel_id.clone(), 1)) + .await + .unwrap(); + let payload = CommitPayload { + delivery_id: directive.delivery_id, + voucher: session.sign_increment(1).await.unwrap(), + }; + server.process_commit(&payload).await.unwrap(); + first.get_or_insert(payload); + } + let after = stored(&server, &channel_id).await; + assert_eq!(after.cumulative, commits as u64); + assert_eq!( + after.committed_deliveries.len(), + MAX_COMMITTED_AUTHORIZATIONS + ); + + // An evicted commit is refused, never charged again. + assert!(server.process_commit(&first.unwrap()).await.is_err()); + assert_eq!( + stored(&server, &channel_id).await.cumulative, + commits as u64 + ); + } + fn memory_signer(seed: u8) -> MemorySigner { let key = key(seed); let mut bytes = [0_u8; 64]; @@ -7817,6 +8927,34 @@ mod tests { assert_eq!(record.spent_amount, 21); } + /// A stream charges one authenticated request again and again, so every + /// charge, not only the authentication, needs a fresh channel read. + #[tokio::test] + async fn every_operator_charge_needs_a_fresh_channel_read() { + let (server, payload, operator) = operator_channel().await; + let request = authenticate(&server, &payload, "request-1").await; + let first = server + .charge_operator_request(&request, &operator, 7, |_| Ok(())) + .await + .unwrap(); + assert_eq!(first.cumulative, 7); + + server + .store + .update_channel( + &payload.channel_id, + Box::new(|state| Ok(stale(state.unwrap()))), + ) + .await + .unwrap(); + let error = server + .charge_operator_request(&request, &operator, 20, |_| Ok(())) + .await + .unwrap_err(); + assert!(error.to_string().contains("onchain"), "{error}"); + assert_eq!(stored(&server, &payload.channel_id).await.cumulative, 7); + } + async fn authenticate( server: &SessionServer, payload: &UsePayload, @@ -8234,8 +9372,21 @@ mod tests { assert_eq!(params.rent_payer, Some(client_payer)); let treasury = Pubkey::new_unique(); let token_program = Pubkey::from_str(programs::TOKEN_PROGRAM).unwrap(); + let clearance = match params + .payer_refund( + &sealed_channel_account(¶ms, params.settled), + &token_program, + None, + None, + now_unix_secs(), + ) + .unwrap() + { + crate::core::payment_channel::payer_refund::PayerRefund::Clear(clearance) => clearance, + blocked => panic!("{blocked:?}"), + }; let ix = params - .distribute_instruction(&treasury, &token_program) + .distribute_instruction(&treasury, &token_program, &clearance) .unwrap(); // Accounts: channel, payer, rent_payer, … assert_eq!(ix.accounts[2].pubkey, client_payer); @@ -8244,12 +9395,225 @@ mod tests { let mut missing = params; missing.rent_payer = None; assert!(missing - .distribute_instruction(&treasury, &token_program) + .distribute_instruction(&treasury, &token_program, &clearance) .unwrap_err() .to_string() .contains("rent payer")); } + /// The on-chain account of a channel closed by `params` whose deposit is + /// `deposit`. + fn sealed_channel_account(params: &SealParams, deposit: u64) -> Vec { + channel_account_at(params, deposit, 0, 0) + } + + /// The channel account for `params` at onchain `status` and `settled`. + fn channel_account_at(params: &SealParams, deposit: u64, status: u8, settled: u64) -> Vec { + use payment_channels::generated::generated::types::SettlementWatermarks; + borsh::to_vec(&payment_channels::generated::generated::accounts::Channel { + discriminator: 1, + version: 1, + bump: 1, + status, + salt: 7, + deposit, + settlement: SettlementWatermarks { + settled, + payout_watermark: 0, + }, + closure_started_at: 0, + payer_withdrawn_at: 0, + grace_period: 900, + distribution_hash: [0; 32], + payer: payment_channels::to_address(¶ms.payer.unwrap()), + payee: payment_channels::to_address(¶ms.recipient), + authorized_signer: payment_channels::to_address(¶ms.authorized_signer.unwrap()), + mint: payment_channels::to_address(¶ms.mint.unwrap()), + rent_payer: payment_channels::to_address(¶ms.rent_payer.unwrap()), + open_slot: 42, + }) + .unwrap() + } + + /// A channel the payer already sealed onchain below the stored watermark + /// refunds `deposit - onchain settled`: the stored cumulative never lands, + /// so it must not hide a due refund behind a missing account. + #[tokio::test] + async fn an_already_sealed_channel_refunds_from_its_onchain_watermark() { + use crate::core::payment_channel::payer_refund::PayerRefund; + + let (server, mut session, channel_id) = client_server().await; + let params = server + .process_close(&ClosePayload { + channel_id, + authentication: None, + voucher: Some(session.sign_increment(100).await.unwrap()), + }) + .await + .unwrap(); + assert_eq!(params.settled, 100); + let token_program = Pubkey::from_str(programs::TOKEN_PROGRAM).unwrap(); + let sealed = payment_channels::generated::generated::types::ChannelStatus::Sealed as u8; + // Sealed by the payer at 0 of a 100 deposit: all 100 is due back. + let outcome = params + .payer_refund( + &channel_account_at(¶ms, 100, sealed, 0), + &token_program, + None, + None, + now_unix_secs(), + ) + .unwrap(); + assert!( + matches!(outcome, PayerRefund::Deferred { refund: 100, .. }), + "{outcome:?}" + ); + // Positive control: an open channel this close seals at 100 owes + // nothing back, so no account is needed. + let outcome = params + .payer_refund( + &channel_account_at(¶ms, 100, 0, 0), + &token_program, + None, + None, + now_unix_secs(), + ) + .unwrap(); + assert!(matches!(outcome, PayerRefund::Clear(_)), "{outcome:?}"); + } + + // The program forfeits a due refund to the treasury when the payer's + // token account cannot take it, so a close leaves the sealed distribute + // unbuilt until the payer can be paid. + #[tokio::test] + async fn sealed_distribute_needs_a_payable_refund_account() { + use crate::core::payment_channel::payer_refund::{ObservedAccount, PayerRefund}; + + let (server, mut session, channel_id) = client_server().await; + let params = server + .process_close(&ClosePayload { + channel_id, + authentication: None, + voucher: Some(session.sign_increment(100).await.unwrap()), + }) + .await + .unwrap(); + let token_program = Pubkey::from_str(programs::TOKEN_PROGRAM).unwrap(); + // 900 of a 1_000 deposit is due back to the payer. + let channel = sealed_channel_account(¶ms, 1_000); + let refund_account = params.payer_refund_account(&token_program).unwrap(); + let mut live = vec![0u8; 165]; + live[..32].copy_from_slice(params.mint.unwrap().as_ref()); + live[32..64].copy_from_slice(params.payer.unwrap().as_ref()); + live[108] = 1; + let mut frozen = live.clone(); + frozen[108] = 2; + + for missing_or_frozen in [None, Some(frozen.as_slice())] { + let outcome = params + .payer_refund( + &channel, + &token_program, + missing_or_frozen.map(|data| ObservedAccount { + owner: token_program, + data, + }), + None, + now_unix_secs(), + ) + .unwrap(); + assert!( + matches!( + &outcome, + PayerRefund::Deferred { refund: 900, payer_token_account, until, .. } + if *payer_token_account == refund_account + && *until >= now_unix_secs() + 899 + ), + "{outcome:?}" + ); + } + + let PayerRefund::Clear(clearance) = params + .payer_refund( + &channel, + &token_program, + Some(ObservedAccount { + owner: token_program, + data: &live, + }), + None, + now_unix_secs(), + ) + .unwrap() + else { + panic!("a live refund account must clear the distribute"); + }; + params + .distribute_instruction(&Pubkey::new_unique(), &token_program, &clearance) + .unwrap(); + + // A clearance is bound to its channel. + let mut other = params.clone(); + other.channel_id = Pubkey::new_unique(); + assert!(other + .distribute_instruction(&Pubkey::new_unique(), &token_program, &clearance) + .unwrap_err() + .to_string() + .contains("another channel")); + } + + /// A deferred distribute is retried by the host and runs anyway once the + /// channel has been sealed for its grace period, so a payer keeping its + /// refund account unusable cannot hold the payout. The seal time is the + /// one `mark_sealed` recorded first. + #[tokio::test] + async fn a_deferred_distribute_runs_once_the_grace_period_after_the_seal_ends() { + use crate::core::payment_channel::payer_refund::PayerRefund; + + let (server, mut session, channel_id) = client_server().await; + let params = server + .process_close(&ClosePayload { + channel_id: channel_id.clone(), + authentication: None, + voucher: Some(session.sign_increment(100).await.unwrap()), + }) + .await + .unwrap(); + assert_eq!(server.sealed_at(&channel_id).await.unwrap(), None); + server.mark_sealed(&channel_id).await.unwrap(); + let sealed_at = server.sealed_at(&channel_id).await.unwrap().unwrap(); + assert!(now_unix_secs() - sealed_at <= 1); + // A later mark keeps the first seal time. + server.mark_sealed(&channel_id).await.unwrap(); + assert_eq!( + server.sealed_at(&channel_id).await.unwrap(), + Some(sealed_at) + ); + + let token_program = Pubkey::from_str(programs::TOKEN_PROGRAM).unwrap(); + let sealed = payment_channels::generated::generated::types::ChannelStatus::Sealed as u8; + // Sealed at 100 of a 1_000 deposit with no refund account (grace 900). + let channel = channel_account_at(¶ms, 1_000, sealed, 100); + let at = |now: i64| { + params + .payer_refund(&channel, &token_program, None, Some(sealed_at), now) + .unwrap() + }; + assert!( + matches!(at(sealed_at + 899), PayerRefund::Deferred { until, .. } if until == sealed_at + 900) + ); + let PayerRefund::Forfeit { + clearance, refund, .. + } = at(sealed_at + 900) + else { + panic!("the deferral ends at the deadline"); + }; + assert_eq!(refund, 900); + params + .distribute_instruction(&Pubkey::new_unique(), &token_program, &clearance) + .unwrap(); + } + #[tokio::test] async fn client_close_seal_and_store_lifecycle_are_consistent() { let (server, mut session, channel_id) = client_server().await; diff --git a/rust/crates/kit/src/mpp/server/session_refund.rs b/rust/crates/kit/src/mpp/server/session_refund.rs new file mode 100644 index 000000000..61780b0df --- /dev/null +++ b/rust/crates/kit/src/mpp/server/session_refund.rs @@ -0,0 +1,103 @@ +//! The payer-refund check a sealed session `distribute` requires. + +use solana_pubkey::Pubkey; + +use super::session::SealParams; +use crate::core::payment_channel::payer_refund::{ + payer_refund, ObservedAccount, PayerRefund, RefundDeadline, SealedRefundTerms, +}; +use crate::mpp::error::{Error, Result}; + +impl SealParams { + /// The account [`Self::payer_refund`] needs fetched next to the channel: + /// the payer's refund token account. + pub fn payer_refund_account(&self, token_program: &Pubkey) -> Result { + Ok(self + .refund_terms(token_program, 0, 0)? + .payer_token_account()) + } + + /// What the sealed `distribute` may do at `now` (unix seconds), from the + /// fetched channel account and the account at + /// [`Self::payer_refund_account`] (`None` when it does not exist). + /// + /// `sealed_at` is when the channel was sealed, as recorded by + /// [`SessionServer::mark_sealed`](super::session::SessionServer::mark_sealed) + /// and read back with + /// [`SessionServer::sealed_at`](super::session::SessionServer::sealed_at); + /// it is ignored for a channel this close seals, and `None` for an + /// already-sealed one starts the deadline at `now`. + /// + /// [`PayerRefund::Clear`] and [`PayerRefund::Forfeit`] carry the + /// clearance [`Self::distribute_instruction`] takes. On + /// [`PayerRefund::Deferred`] land only the settle-and-seal and retry the + /// distribute by `until`: the program would forfeit the refund to the + /// treasury, while the payer can still repair its account or + /// `withdraw_payer`. From `until` on the distribute runs anyway + /// ([`PayerRefund::Forfeit`]), so the payout is never held hostage. + pub fn payer_refund( + &self, + channel_account: &[u8], + token_program: &Pubkey, + payer_token_account: Option>, + sealed_at: Option, + now: i64, + ) -> Result { + let deployment = crate::mpp::program::channel_deployment::resolve( + self.program_id, + self.channel_version, + self.channel_hooks.as_ref(), + )?; + let channel = deployment.decode_channel(channel_account)?.channel; + let terms = + self.refund_terms(token_program, channel.deposit, channel.payer_withdrawn_at)?; + let sealed = channel.status + == crate::generated::payment_channels::generated::types::ChannelStatus::Sealed as u8; + let terms = SealedRefundTerms { + // An already-sealed channel refunds from its onchain watermark; + // otherwise the seal this close lands commits at least the one it + // settles. + settled: if sealed { + channel.settlement.settled + } else { + channel.settlement.settled.max(self.settled) + }, + ..terms + }; + if crate::core::payment_channels::from_address(&channel.payer) != terms.payer { + return Err(Error::Other( + "channel account payer does not match the seal parameters".into(), + )); + } + let deadline = RefundDeadline { + sealed_at: if sealed { + sealed_at.unwrap_or(now) + } else { + now + }, + grace_period: channel.grace_period, + }; + Ok(payer_refund(&terms, payer_token_account, deadline, now)) + } + + fn refund_terms( + &self, + token_program: &Pubkey, + deposit: u64, + payer_withdrawn_at: i64, + ) -> Result { + Ok(SealedRefundTerms { + channel: self.channel_id, + payer: self + .payer + .ok_or_else(|| Error::Other("distribution missing payer".into()))?, + mint: self + .mint + .ok_or_else(|| Error::Other("distribution missing mint".into()))?, + token_program: *token_program, + deposit, + settled: self.settled, + payer_withdrawn_at, + }) + } +} diff --git a/rust/crates/kit/src/x402/client/upto/payment.rs b/rust/crates/kit/src/x402/client/upto/payment.rs index 27b6ae765..3437e36b4 100644 --- a/rust/crates/kit/src/x402/client/upto/payment.rs +++ b/rust/crates/kit/src/x402/client/upto/payment.rs @@ -14,7 +14,7 @@ use solana_keychain::TransactionSigner; use solana_pubkey::Pubkey; use solana_rpc_client::rpc_client::RpcClient; -use crate::core::blockhash::fetch_blockhash_with_slot; +use crate::core::blockhash::CachedBlockhash; use crate::core::payment_channels as pc; use crate::x402::error::Error; @@ -37,7 +37,10 @@ use crate::x402::{PAYMENT_REQUIRED_HEADER, X402_VERSION_V2}; /// the program's `openSlot`, a channel-PDA seed the program only accepts /// within a recent window. Both hints are optional per the upto spec — when /// either is absent, a single `getLatestBlockhash` call against `rpc` -/// supplies the missing value(s); `rpc` is untouched when both are present. +/// supplies the missing value(s). A `recentBlockhash` hint is signed only +/// once `rpc`, which serves the cluster the client pays on, confirms it is +/// live there: a hash from another cluster would open the channel on that +/// cluster instead. pub async fn build_upto_payload( payer_signer: &dyn TransactionSigner, rpc: &RpcClient, @@ -81,19 +84,21 @@ pub async fn build_upto_payload( // absent — its response context carries the current slot, covering both. let hint_blockhash = requirements.extra.recent_blockhash.as_deref(); let hint_slot = requirements.extra.recent_slot.map(Slot::get); - let (blockhash_str, open_slot) = match (hint_blockhash, hint_slot) { - (Some(blockhash), Some(slot)) => (blockhash.to_string(), slot), - _ => { - let fetched = fetch_blockhash_with_slot(rpc, rpc.commitment()).map_err(Error::Rpc)?; - let blockhash = hint_blockhash - .map(str::to_string) - .unwrap_or(fetched.blockhash); - let open_slot = hint_slot.unwrap_or(fetched.slot); - (blockhash, open_slot) - } + let fetched = match (hint_blockhash, hint_slot) { + (Some(_), Some(_)) => None, + _ => Some(fetch_blockhash_with_slot(rpc).await?), + }; + let blockhash = match (hint_blockhash, &fetched) { + (Some(hint), _) => verified_hint(rpc, hint).await?, + (None, Some(fetched)) => Hash::from_str(&fetched.blockhash) + .map_err(|e| Error::Other(format!("invalid recentBlockhash: {e}")))?, + (None, None) => unreachable!("a missing blockhash hint fetches one"), + }; + let open_slot = match (hint_slot, &fetched) { + (Some(slot), _) => slot, + (None, Some(fetched)) => fetched.slot, + (None, None) => unreachable!("a missing slot hint fetches one"), }; - let blockhash = Hash::from_str(&blockhash_str) - .map_err(|e| Error::Other(format!("invalid recentBlockhash: {e}")))?; let salt = salt_for_nonce(&nonce); // “Clients MUST include a Memo instruction containing either the value @@ -146,6 +151,48 @@ pub async fn build_upto_payload( }) } +/// The latest blockhash and the slot it was observed at, in one +/// `getLatestBlockhash` call (its response context carries the slot). +async fn fetch_blockhash_with_slot(rpc: &RpcClient) -> Result { + use solana_rpc_client_api::{ + config::RpcContextConfig, + request::RpcRequest, + response::{Response, RpcBlockhash}, + }; + // Every call goes through the nonblocking client: mixing it with the + // blocking one shares a connection pool across runtimes and can stall. + let response: Response = rpc + .get_inner_client() + .send( + RpcRequest::GetLatestBlockhash, + serde_json::json!([RpcContextConfig { + commitment: Some(rpc.commitment()), + min_context_slot: None, + }]), + ) + .await + .map_err(|e| Error::Rpc(e.to_string()))?; + Ok(CachedBlockhash { + blockhash: response.value.blockhash, + last_valid_block_height: response.value.last_valid_block_height, + slot: response.context.slot, + }) +} + +/// The requirement's `recentBlockhash`, once the client's cluster knows it. +async fn verified_hint(rpc: &RpcClient, hint: &str) -> Result { + // Only the nonblocking client is reachable here: a blocking call panics + // on a current-thread runtime. + crate::core::blockhash::resolve_challenge_blockhash(rpc.get_inner_client(), Some(hint)) + .await + .map_err(|e| match e { + crate::core::blockhash::ChallengeBlockhashError::Invalid(message) => { + Error::Other(format!("invalid extra.recentBlockhash: {message}")) + } + crate::core::blockhash::ChallengeBlockhashError::Rpc(message) => Error::Rpc(message), + }) +} + /// The channel salt for a request `nonce`: derived from it, or random when the /// caller supplied none. fn salt_for_nonce(nonce: &str) -> u64 { @@ -348,12 +395,26 @@ mod tests { assert!(parse_upto_challenge(&[], None).is_none()); } + /// An RPC that knows every blockhash and serves `succeeds` otherwise. + fn live_rpc() -> RpcClient { + use solana_rpc_client::mock_sender::MocksMap; + use solana_rpc_client_api::request::RpcRequest; + let mut mocks = MocksMap::default(); + for _ in 0..8 { + mocks.insert( + RpcRequest::IsBlockhashValid, + serde_json::json!({ "context": { "slot": 1 }, "value": true }), + ); + } + RpcClient::new_mock_with_mocks_map("succeeds", mocks) + } + #[tokio::test(flavor = "multi_thread")] async fn build_payload_uses_challenge_hints_without_rpc() { let signer = make_signer(); - // A "fails" mock makes any RPC hit error loudly: with both hints - // embedded, the build must succeed without touching RPC at all. - let rpc = RpcClient::new_mock("fails".to_string()); + // Every other RPC method errors loudly: with both hints embedded, the + // build only asks whether the hinted blockhash is live. + let rpc = crate::core::blockhash::mock_blockhash_rpc(true); let payload = build_upto_payload(&*signer, &rpc, &requirements(), 4_102_444_800, "n-1", None) .await @@ -367,7 +428,7 @@ mod tests { #[tokio::test(flavor = "multi_thread")] async fn the_request_nonce_pins_the_channel() { let signer = make_signer(); - let rpc = RpcClient::new_mock("fails".to_string()); + let rpc = crate::core::blockhash::mock_blockhash_rpc(true); let build = |nonce: &'static str| { let signer = &signer; let rpc = &rpc; @@ -407,7 +468,7 @@ mod tests { #[tokio::test(flavor = "multi_thread")] async fn build_payload_fetches_missing_slot_keeping_hinted_blockhash() { let signer = make_signer(); - let rpc = RpcClient::new_mock("succeeds".to_string()); + let rpc = live_rpc(); let mut req = requirements(); req.extra.recent_slot = None; let payload = build_upto_payload(&*signer, &rpc, &req, 4_102_444_800, "n-1", None) @@ -421,7 +482,7 @@ mod tests { // A seller that declares extra.memo requires exactly one matching Memo // after open, so the client emits it. let signer = make_signer(); - let rpc = RpcClient::new_mock("fails".to_string()); + let rpc = crate::core::blockhash::mock_blockhash_rpc(true); let mut req = requirements(); req.extra.memo = Some("order-4711".to_string()); let payload = build_upto_payload(&*signer, &rpc, &req, 4_102_444_800, "n-1", None) @@ -480,6 +541,39 @@ mod tests { ); } + /// The hinted blockhash is the only thing binding the open to a + /// cluster, so one the client's own cluster does not know is refused, + /// with or without a slot hint. + #[tokio::test(flavor = "multi_thread")] + async fn a_hinted_blockhash_the_client_cluster_does_not_know_is_refused() { + let signer = make_signer(); + let foreign = crate::core::blockhash::mock_blockhash_rpc(false); + let err = build_upto_payload( + &*signer, + &foreign, + &requirements(), + 4_102_444_800, + "n", + None, + ) + .await + .expect_err("a foreign blockhash is refused"); + assert!(err.to_string().contains("not a live blockhash"), "{err}"); + + let mut without_slot = requirements(); + without_slot.extra.recent_slot = None; + let mut mocks = solana_rpc_client::mock_sender::MocksMap::default(); + mocks.insert( + solana_rpc_client_api::request::RpcRequest::IsBlockhashValid, + serde_json::json!({ "context": { "slot": 1 }, "value": false }), + ); + let foreign = RpcClient::new_mock_with_mocks_map("succeeds", mocks); + let err = build_upto_payload(&*signer, &foreign, &without_slot, 4_102_444_800, "n", None) + .await + .expect_err("a foreign blockhash is refused when the slot is fetched"); + assert!(err.to_string().contains("not a live blockhash"), "{err}"); + } + #[tokio::test(flavor = "multi_thread")] async fn build_payload_errors_when_hints_absent_and_rpc_unavailable() { let signer = make_signer(); diff --git a/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/errors.rs b/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/errors.rs index 7d1e3a863..709374f43 100644 --- a/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/errors.rs +++ b/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/errors.rs @@ -195,15 +195,31 @@ impl From for crate::x402::error::Error { /// /// The server composes checks that return the crate-wide [`crate::x402::error::Error`], /// which erases the code into a string; this maps it back for the wire without -/// forcing every intermediate helper to thread a typed error. +/// forcing every intermediate helper to thread a typed error. The code a +/// [`BatchError`] leads with wins: its detail may quote client-supplied +/// text, which must not be able to name a different code. pub fn classify(message: &str) -> &'static str { - ALL_CODES - .iter() - .find(|code| message.contains(*code)) - .copied() + leading_code(message) + .or_else(|| { + ALL_CODES + .iter() + .find(|code| message.contains(*code)) + .copied() + }) .unwrap_or("transaction_failed") } +/// The code a [`BatchError`] message leads with (`": "`), if +/// it leads with one. Unlike [`classify`] it never searches the detail, so +/// a decision taken on it cannot be steered by text a client supplied. +pub fn leading_code(message: &str) -> Option<&'static str> { + ALL_CODES.iter().copied().find(|code| { + message + .strip_prefix(code) + .is_some_and(|rest| rest.starts_with(": ")) + }) +} + #[cfg(test)] mod tests { use super::*; @@ -232,4 +248,27 @@ mod tests { assert!(err.to_string().contains("expiresAt was 42")); assert_eq!(classify("something else entirely"), "transaction_failed"); } + + #[test] + fn a_quoted_code_in_the_detail_does_not_override_the_raised_code() { + let err = BatchError::new( + INVALID_CHANNEL_STATE, + format!("channelConfig.receiver {INVALID_CUMULATIVE_AMOUNT_MISMATCH} does not match"), + ); + assert_eq!(classify(&err.to_string()), INVALID_CHANNEL_STATE); + assert_eq!(leading_code(&err.to_string()), Some(INVALID_CHANNEL_STATE)); + // Positive control: the mismatch itself is still recognised. + let err = BatchError::new(INVALID_CUMULATIVE_AMOUNT_MISMATCH, "voucher authorizes 5"); + assert_eq!( + leading_code(&err.to_string()), + Some(INVALID_CUMULATIVE_AMOUNT_MISMATCH) + ); + // A message that only quotes a code leads with none. + assert_eq!( + leading_code(&format!( + "store error: {INVALID_CUMULATIVE_AMOUNT_MISMATCH}: x" + )), + None + ); + } } diff --git a/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/mod.rs b/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/mod.rs index 4363f87a0..d5003d718 100644 --- a/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/mod.rs +++ b/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/mod.rs @@ -7,7 +7,7 @@ mod tx_policy; mod types; mod verify; -pub use errors::{classify, BatchError}; +pub use errors::{classify, leading_code, BatchError}; pub use tx_policy::*; pub use types::*; pub use verify::*; diff --git a/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/tx_policy.rs b/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/tx_policy.rs index 877e94ed4..1661dd74f 100644 --- a/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/tx_policy.rs +++ b/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/tx_policy.rs @@ -1062,6 +1062,16 @@ mod tests { } } + fn cu_price_ix(micro_lamports: u64) -> Instruction { + let mut data = vec![pc::COMPUTE_BUDGET_SET_UNIT_PRICE]; + data.extend_from_slice(µ_lamports.to_le_bytes()); + Instruction { + program_id: pc::to_address(&pc::compute_budget_program_id()), + accounts: vec![], + data, + } + } + #[test] fn accepts_a_canonical_open() { let f = fixture(); @@ -1082,6 +1092,79 @@ mod tests { assert_eq!(validated.payer, f.payer); } + #[test] + fn the_sponsor_bounds_the_priority_fee_it_pays() { + use crate::core::tx::{ComputeBudget, MAX_SPONSORED_PRIORITY_FEE_LAMPORTS}; + let f = fixture(); + let open = || pc::build_open_instruction(&f.open_params(100_000)); + let setup = |tx: &str| { + validate_setup_transaction( + tx, + SetupForm::Open, + &f.expectations(), + 100_000, + Some(341_000_100), + ) + }; + let over_fee_cap = |err: BatchError| { + assert_eq!(err.code, errors::INVALID_SETUP_TRANSACTION); + assert!( + err.detail.contains("exceeds the sponsored fee maximum"), + "{}", + err.detail + ); + }; + let at_cap = MAX_SPONSORED_PRIORITY_FEE_LAMPORTS * 1_000_000 + / u64::from(pc::OPEN_MAX_COMPUTE_UNIT_LIMIT); + + // Each field at its own ceiling. + over_fee_cap( + setup(&f.sign(&[ + cu_limit_ix(pc::OPEN_MAX_COMPUTE_UNIT_LIMIT), + cu_price_ix(pc::MAX_COMPUTE_UNIT_PRICE_MICROLAMPORTS), + open(), + nonce_memo(), + f.binding(), + ])) + .unwrap_err(), + ); + assert!(setup(&f.sign(&[ + cu_limit_ix(pc::OPEN_MAX_COMPUTE_UNIT_LIMIT), + cu_price_ix(at_cap), + open(), + nonce_memo(), + f.binding(), + ])) + .is_ok()); + // No declared limit: three instructions are budgeted 600,000 units. + over_fee_cap( + setup(&f.sign(&[cu_price_ix(at_cap), open(), nonce_memo(), f.binding()])).unwrap_err(), + ); + // Version 1 carries the fee itself in the header. + let ixs = [open(), nonce_memo(), f.binding()]; + assert!(setup(&f.sign_v1(&ixs, ComputeBudget::new(200_000, 10_000))).is_ok()); + over_fee_cap(setup(&f.sign_v1(&ixs, ComputeBudget::new(200_000, 10_005))).unwrap_err()); + + // The refund `request_close` is co-signed under the same policy. + let close = pc::build_request_close_instruction(&f.payer, &f.channel_id, &f.program_id); + let err = validate_request_close_transaction( + &f.sign(&[ + cu_limit_ix(pc::OPEN_MAX_COMPUTE_UNIT_LIMIT), + cu_price_ix(pc::MAX_COMPUTE_UNIT_PRICE_MICROLAMPORTS), + close.clone(), + nonce_memo(), + ]), + &f.expectations(), + ) + .unwrap_err(); + assert_eq!(err.code, errors::INVALID_REFUND_TRANSACTION); + assert!(validate_request_close_transaction( + &f.sign(&[cu_price_ix(at_cap), close, nonce_memo()]), + &f.expectations(), + ) + .is_ok()); + } + #[test] fn open_requires_a_memo_the_sponsor_can_correlate() { let f = fixture(); diff --git a/rust/crates/kit/src/x402/server/batch_settlement.rs b/rust/crates/kit/src/x402/server/batch_settlement.rs index f8a4805a9..ceba4a58c 100644 --- a/rust/crates/kit/src/x402/server/batch_settlement.rs +++ b/rust/crates/kit/src/x402/server/batch_settlement.rs @@ -40,6 +40,14 @@ use solana_pubkey::Pubkey; use solana_rpc_client::rpc_client::RpcClient; use solana_transaction::versioned::VersionedTransaction; +use crate::core::payment_channel::payer_refund::DistributeClearance; +use crate::core::payment_channel::token_account::{ + decode_token_account, TOKEN_ACCOUNT_FROZEN, TOKEN_ACCOUNT_INITIALIZED, +}; +#[cfg(test)] +use crate::core::payment_channel::token_account::{ + EXTENSION_IMMUTABLE_OWNER, TOKEN_ACCOUNT_LEN, TOKEN_ACCOUNT_TYPE, +}; use crate::core::payment_channels as pc; use crate::core::payment_channels::generated::accounts::Channel; use crate::core::settlement::packing::{pack, ChannelInstructionGroup}; @@ -199,36 +207,72 @@ fn is_empty_tombstone(state: &ChannelState) -> bool { fn spawn_next_submission( version: TxVersion, - in_flight: &mut tokio::task::JoinSet>, - pending: &mut std::collections::VecDeque>, + in_flight: &mut tokio::task::JoinSet>, + pending: &mut std::collections::VecDeque>>, pipeline: &TxPipeline, signer: &Arc, fee_payer: &Pubkey, ) { - let Some(instructions) = pending.pop_front() else { + let Some(groups) = pending.pop_front() else { return; }; let pipeline = pipeline.clone(); let signer = Arc::clone(signer); let fee_payer = *fee_payer; in_flight.spawn(async move { - let blockhash = pipeline - .latest_blockhash() - .await - .map_err(|e| Error::Rpc(format!("blockhash fetch failed: {e}")))?; - let mut tx = - crate::core::tx::build_unsigned(version, &fee_payer, &instructions, blockhash, None)?; - crate::core::signing::sign_versioned_transaction_slot(signer.as_ref(), &mut tx) - .await - .map_err(|e| Error::Other(format!("fee payer signing failed: {e}")))?; - pipeline - .submit_verified(&tx) - .await - .map(|confirmed| confirmed.signature.to_string()) - .map_err(|e| Error::Rpc(format!("settlement submission failed: {e}"))) + let failed = + |error: Error, on_chain: bool, groups: Vec>| FailedSubmission { + error, + on_chain, + groups, + }; + let instructions: Vec = groups.iter().flatten().cloned().collect(); + let blockhash = match pipeline.latest_blockhash().await { + Ok(blockhash) => blockhash, + Err(e) => { + let error = Error::Rpc(format!("blockhash fetch failed: {e}")); + return Err(failed(error, false, groups)); + } + }; + let mut tx = match crate::core::tx::build_unsigned( + version, + &fee_payer, + &instructions, + blockhash, + None, + ) { + Ok(tx) => tx, + Err(error) => return Err(failed(error.into(), false, groups)), + }; + if let Err(e) = + crate::core::signing::sign_versioned_transaction_slot(signer.as_ref(), &mut tx).await + { + let error = Error::Other(format!("fee payer signing failed: {e}")); + return Err(failed(error, false, groups)); + } + match pipeline.submit_verified(&tx).await { + Ok(confirmed) => Ok(confirmed.signature.to_string()), + Err(e) => { + let on_chain = matches!( + e, + crate::core::tx_pipeline::TxPipelineError::TransactionFailed { .. } + ); + let error = Error::Rpc(format!("settlement submission failed: {e}")); + Err(failed(error, on_chain, groups)) + } + } }); } +/// A settlement transaction that did not land, with the channel groups it +/// carried. +struct FailedSubmission { + error: Error, + /// It landed and failed, so none of its instructions applied. + on_chain: bool, + groups: Vec>, +} + /// Fetch and decode a channel account with the blocking RPC client. Factored out /// of [`X402BatchSettlement::lookup_channel`] so the reconcile path can run it on /// a blocking thread (via `spawn_blocking`) instead of stalling an async worker: @@ -593,10 +637,11 @@ pub enum BatchAccess { /// not finish. Call [`X402BatchSettlement::finish_commit`] and return its /// response; the handler MUST NOT run again. Resume(BatchOutcome), - /// Already committed: return this stored response, and do not run the - /// handler. The second element is the resource handler's cached response - /// from the original serve, when one was stored for it — see - /// [`X402BatchSettlement::cache_response`]. + /// Already committed: return this stored settlement response, and do + /// not run the handler. The resource body is never replayed (the voucher + /// that reaches this arm is public once a claim or a corrective 402 + /// discloses it), so the second element is always `None`; it is kept for + /// compatibility. Replay( BatchSettlementResponse, Option, @@ -1022,9 +1067,12 @@ impl X402BatchSettlement { error: &Error, resource: Option<&str>, ) -> Result<(String, String), Error> { + // Only a mismatch this server raised: the detail of any other error + // may quote client-supplied text, which must not be able to request + // the channel's snapshot. let is_mismatch = - crate::x402::protocol::schemes::batch_settlement::classify(&error.to_string()) - == codes::INVALID_CUMULATIVE_AMOUNT_MISMATCH; + crate::x402::protocol::schemes::batch_settlement::leading_code(&error.to_string()) + == Some(codes::INVALID_CUMULATIVE_AMOUNT_MISMATCH); if is_mismatch { if let Some(channel_id) = self.channel_id_for_header(header) { if let Ok(envelope) = self @@ -1318,6 +1366,20 @@ impl X402BatchSettlement { recent_slot, )?; let deposit_signature = payer_signature(&validated.transaction); + // The deposit is broadcast only after the handler runs, so a + // transaction that cannot land must be refused now. One this + // server already recorded may be in flight or committed, and + // its funds already moved. + if !deposit_already_recorded(stored.as_ref(), deposit_signature.as_deref()) { + self.check_deposit_can_land( + &validated.transaction, + &payer, + &mint, + &token_program, + deposit_amount, + ) + .await?; + } let deposit_after = Self::deposit_ceiling( stored.as_ref(), deposit_amount, @@ -1529,40 +1591,147 @@ impl X402BatchSettlement { format!("{role} settlement ATA {ata} is unavailable: {e}"), ) })?; - if pc::from_address(&account.owner) != *token_program { - return reject("is not owned by the declared token program".to_string()); - } - let Some(decoded) = decode_token_account(&account.data) else { - return reject("is not an initialized token account".to_string()); - }; - if decoded.mint != *mint { - return reject(format!( - "holds mint {} rather than {}", - pc::pubkey_string(&decoded.mint), - pc::pubkey_string(mint) - )); - } - if decoded.owner != owner { - return reject(format!( - "is owned by {} rather than {}", - pc::pubkey_string(&decoded.owner), - pc::pubkey_string(&owner) - )); - } - if decoded.state == TOKEN_ACCOUNT_FROZEN { - return reject("is frozen".to_string()); + if let Some(problem) = unusable_settlement_account( + &pc::from_address(&account.owner), + &account.data, + &owner, + mint, + token_program, + ) { + return reject(problem); } - if let Some(extension) = decoded.unsupported_extension { - return reject(format!( - "carries token account extension {extension}, which this server \ - will not settle through" - )); + } + Ok(()) + } + + /// The checks a deposit transaction must pass before the handler runs, + /// since it is only broadcast afterwards: its blockhash is still live and + /// the payer's token account holds the deposit (spec, canonical `open` + /// and `top_up`: "It MUST confirm the payer has sufficient tokens"). A + /// failed read is a refusal too. The blocking reads run on a blocking + /// thread (`spawn_blocking`). + async fn check_deposit_can_land( + &self, + transaction: &VersionedTransaction, + payer: &Pubkey, + mint: &Pubkey, + token_program: &Pubkey, + deposit_amount: u64, + ) -> Result<(), Error> { + let rpc = Arc::clone(&self.rpc); + let blockhash = *transaction.message.recent_blockhash(); + let (ata, _) = pc::find_associated_token_address(payer, mint, token_program); + tokio::task::spawn_blocking(move || { + deposit_can_land(&rpc, &blockhash, &ata, deposit_amount) + }) + .await + .map_err(|e| Error::Other(format!("deposit check task failed: {e}")))? + } + + /// The clearance to send the sealed `distribute` of `channel`, sealed at + /// `settled` (at `sealed_at`, unix seconds), or `None` to defer it. The + /// program forfeits a due refund to the treasury when the payer's token + /// account cannot take it, so such a channel is sealed without its + /// distribute and a later pass retries: as soon as the account is usable + /// or the payer withdrew, and once the channel has been sealed for its + /// grace period, anyway, so the payer cannot hold the payout hostage. + fn sealed_distribute_clearance( + &self, + channel_id: &str, + channel: &Pubkey, + onchain: &Channel, + settled: u64, + sealed_at: i64, + now: i64, + ) -> Result, Error> { + use crate::core::payment_channel::payer_refund::{ + payer_refund, ObservedAccount, PayerRefund, RefundDeadline, SealedRefundTerms, + }; + let terms = SealedRefundTerms { + channel: *channel, + payer: pc::from_address(&onchain.payer), + mint: self.mint()?, + token_program: self.token_program()?, + deposit: onchain.deposit, + settled: settled.max(onchain.settlement.settled), + payer_withdrawn_at: onchain.payer_withdrawn_at, + }; + let deadline = RefundDeadline { + sealed_at, + grace_period: onchain.grace_period, + }; + if terms.refund_due() == 0 { + return Ok(payer_refund(&terms, None, deadline, now).clearance()); + } + let address = terms.payer_token_account(); + let account = self + .rpc + .get_account_with_commitment(&address, self.rpc.commitment()) + .map_err(|e| Error::Rpc(format!("payer refund account {address}: {e}")))? + .value; + let observed = account.as_ref().map(|account| ObservedAccount { + owner: pc::from_address(&account.owner), + data: &account.data, + }); + match payer_refund(&terms, observed, deadline, now) { + PayerRefund::Clear(clearance) => Ok(Some(clearance)), + PayerRefund::Deferred { + refund, + payer_token_account, + reason, + until, + } => { + tracing::warn!( + channel = %channel_id, + %payer_token_account, + refund, + reason, + until, + "payer refund account cannot be paid; sealing without distributing \ + until it can, or until the deadline" + ); + Ok(None) } - if decoded.state != TOKEN_ACCOUNT_INITIALIZED { - return reject(format!("is in account state {}", decoded.state)); + PayerRefund::Forfeit { + clearance, + refund, + payer_token_account, + reason, + } => { + tracing::warn!( + channel = %channel_id, + %payer_token_account, + refund, + reason, + "payer refund account still unusable past the deadline; distributing, \ + the refund goes to the treasury" + ); + Ok(Some(clearance)) } } - Ok(()) + } + + /// When this server first saw `channel_id` sealed, recording `now` when it + /// had not; `now` for a channel this store has no record of. + async fn first_sealed_at(&self, channel_id: &str, now: i64) -> i64 { + self.store + .update_channel( + channel_id, + Box::new(move |current| { + let mut state = current.ok_or_else(|| { + crate::core::store::StoreError::Internal("channel not found".into()) + })?; + state + .extra + .entry(SEALED_AT_KEY.to_string()) + .or_insert_with(|| now.into()); + Ok(state) + }), + ) + .await + .ok() + .and_then(|state| state.extra.get(SEALED_AT_KEY)?.as_i64()) + .unwrap_or(now) } /// Verify a client-mode `refund` and return the watermark it closes at. @@ -1994,31 +2163,17 @@ impl X402BatchSettlement { Ok(()) } - /// Cache the resource handler's response against an already-committed - /// authorization, so a future replay of the same voucher can return the - /// purchased representation itself rather than only the settlement - /// result — the `("access", channelId, maxClaimableAmount)` cache the - /// batch-settlement spec requires. Call after [`Self::finish_commit`] (or - /// [`Self::settle_payment`]) has already succeeded; this is a best-effort - /// improvement to a *future* request, so its own failure is not this - /// request's problem and callers should log, not propagate, an error. + /// Formerly cached the handler's response so a replay of the same + /// voucher returned it. A replay now returns the settlement response + /// only: the voucher that unlocks a replay is public once a claim or a + /// corrective 402 discloses it, so it cannot gate a payer's resource + /// body. This is a no-op kept for compatibility. + #[deprecated(note = "batch replays never return a cached body; this is a no-op")] pub async fn cache_response( &self, - outcome: &BatchOutcome, - cached: crate::core::store::CachedUpstreamResponse, + _outcome: &BatchOutcome, + _cached: crate::core::store::CachedUpstreamResponse, ) -> Result<(), Error> { - let Authorization { id, .. } = self.authorization_of(outcome)?; - self.store - .mutate_channel( - &outcome.channel_id, - None, - Box::new(move |state| { - state.attach_cached_response(&id, cached); - Ok(()) - }), - ) - .await - .map_err(|e| Error::Other(format!("store error: {e}")))?; Ok(()) } @@ -2703,15 +2858,11 @@ impl X402BatchSettlement { } } - /// Rebuild the accepted response for an idempotent voucher retry, plus - /// the resource handler's cached response when one was stored for it - /// (see [`Self::cache_response`]) — together, the - /// `("access", channelId, maxClaimableAmount)` replay the batch-settlement - /// spec requires. The cached response is `None` when no response was - /// stored — a record that predates response storage, one whose response - /// exceeded the caller's size cap for caching, or one whose stored - /// response has aged out — in which case the caller falls back to a - /// settlement-only reply. + /// Rebuild the accepted settlement response for an idempotent voucher + /// retry. The second element is always `None`: possession of the voucher + /// proves nothing about who sent the original request (a claim publishes + /// it, and the corrective 402 returns it), so no resource body is ever + /// replayed against it (the scheme replays neither, Phase 3 step 6). pub async fn replay_response( &self, outcome: &BatchOutcome, @@ -2748,12 +2899,11 @@ impl X402BatchSettlement { )); } } - let cached = committed.and_then(|committed| committed.cached_response.clone()); let stored = committed .and_then(|committed| committed.settlement_response.clone()) .and_then(|value| serde_json::from_value(value).ok()); if let Some(response) = stored { - return Ok((response, cached)); + return Ok((response, None)); } Ok(( accepted_response( @@ -2765,7 +2915,7 @@ impl X402BatchSettlement { outcome.requirements.amount()?, &state, ), - cached, + None, )) } @@ -3361,18 +3511,16 @@ impl X402BatchSettlement { // remote signing cannot age later batches before they are submitted. let mut pending = std::collections::VecDeque::with_capacity(batches.len()); for batch in batches { - let instructions: Vec<_> = batch - .into_iter() - .flat_map(|group| group.instructions) - .collect(); - pending.push_back(instructions); + let groups: Vec> = + batch.into_iter().map(|group| group.instructions).collect(); + pending.push_back(groups); } // Feed each independent transaction into the shared pipeline. This // local bound limits task creation; the pipeline supplies the global // send bound, pacing, retry policy, and batched confirmation tracker // across every concurrent lifecycle chunk. - let total = pending.len(); + let mut total = pending.len(); let pipeline = self.transaction_pipeline().await; let mut in_flight = tokio::task::JoinSet::new(); for _ in 0..SUBMIT_GROUPS_CONCURRENCY { @@ -3388,19 +3536,35 @@ impl X402BatchSettlement { let mut signatures = Vec::with_capacity(total); let mut failures = Vec::new(); while let Some(joined) = in_flight.join_next().await { - spawn_next_submission( - self.tx_version(), - &mut in_flight, - &mut pending, - &pipeline, - &self.config.fee_payer_signer, - &self.fee_payer, - ); match joined { Ok(Ok(signature)) => signatures.push(signature), - Ok(Err(error)) => failures.push(error.to_string()), + // A transaction is atomic, so nothing in it applied: one + // channel failing deterministically must not fail the others + // packed with it. Each is submitted again alone. + Ok(Err(failed)) if failed.on_chain && failed.groups.len() > 1 => { + tracing::warn!( + error = %failed.error, + channels = failed.groups.len(), + "packed settlement failed on-chain; submitting each channel alone", + ); + total += failed.groups.len() - 1; + for group in failed.groups { + pending.push_back(vec![group]); + } + } + Ok(Err(failed)) => failures.push(failed.error.to_string()), Err(error) => failures.push(format!("submit join error: {error}")), } + while in_flight.len() < SUBMIT_GROUPS_CONCURRENCY && !pending.is_empty() { + spawn_next_submission( + self.tx_version(), + &mut in_flight, + &mut pending, + &pipeline, + &self.config.fee_payer_signer, + &self.fee_payer, + ); + } } if !failures.is_empty() { return Err(Error::Rpc(format!( @@ -3479,6 +3643,20 @@ impl X402BatchSettlement { let distribute = match terminal_step(onchain.status, distribute) { TerminalStep::PlanClose(distribute) => distribute, TerminalStep::Submit(instructions) => { + let sealed_at = self.first_sealed_at(channel_id, now).await; + if self + .sealed_distribute_clearance( + channel_id, + &channel, + &onchain, + onchain.settlement.settled, + sealed_at, + now, + )? + .is_none() + { + continue; + } groups.push(ChannelInstructionGroup { channel_id: channel_id.clone(), instructions, @@ -3524,9 +3702,23 @@ impl X402BatchSettlement { let seal_ix = pc::build_seal_instruction(&channel, &program_id); match plan { None | Some((GraceSealPlan::SealFrozen, _)) => { + let mut instructions = vec![seal_ix]; + if self + .sealed_distribute_clearance( + channel_id, + &channel, + &onchain, + onchain.settlement.settled, + now, + now, + )? + .is_some() + { + instructions.push(distribute); + } groups.push(ChannelInstructionGroup { channel_id: channel_id.clone(), - instructions: vec![seal_ix, distribute], + instructions, }); } Some((GraceSealPlan::InFlight, _)) => { @@ -3566,7 +3758,14 @@ impl X402BatchSettlement { expires_at, &program_id, )?; - instructions.push(distribute); + if self + .sealed_distribute_clearance( + channel_id, &channel, &onchain, cumulative, now, now, + )? + .is_some() + { + instructions.push(distribute); + } groups.push(ChannelInstructionGroup { channel_id: channel_id.clone(), instructions, @@ -3595,6 +3794,10 @@ impl X402BatchSettlement { crate::core::store::StoreError::Internal("channel not found".into()) })?; state.sealed = true; + state + .extra + .entry(SEALED_AT_KEY.to_string()) + .or_insert_with(|| now.into()); if let Some(watermark) = applied { state.settled_on_chain = state.settled_on_chain.max(watermark); } @@ -3834,95 +4037,110 @@ fn payer_signature(transaction: &VersionedTransaction) -> Option { Some(signature.to_string()) } -/// Base length of an SPL token account. Token-2022 appends its extensions -/// after the same fixed layout, so one decoder covers both programs. -const TOKEN_ACCOUNT_LEN: usize = 165; - -/// `AccountState::Initialized`, at offset 108. -const TOKEN_ACCOUNT_INITIALIZED: u8 = 1; - -/// `AccountState::Frozen`: the account cannot receive or send. -const TOKEN_ACCOUNT_FROZEN: u8 = 2; - -/// `AccountType::Account`, the discriminant a Token-2022 account carries at -/// offset 165 before its extensions. -const TOKEN_ACCOUNT_TYPE: u8 = 2; - -/// `ExtensionType::ImmutableOwner`. -/// -/// The only account extension a settlement destination may carry. It is inert -/// — it fixes the owner, nothing else — and every associated token account has -/// it, so requiring its absence would reject ordinary ATAs. -const EXTENSION_IMMUTABLE_OWNER: u16 = 7; - -/// The fields of an SPL token account this server cares about. -struct TokenAccount { - mint: Pubkey, - owner: Pubkey, - state: u8, - /// An account extension this server will not settle through, if any. - unsupported_extension: Option, +/// Why the account at `owner`'s associated token address for `mint`, owned +/// by `program` and holding `data`, cannot receive a settlement payout, or +/// `None` when it can: it must be an +/// initialized, unfrozen account of the declared token program holding +/// `mint` for `owner`, with no extension outside the allowlist. The program +/// forfeits a payout to an unusable account to the treasury, so a server +/// checks before it accepts a deposit that would settle there. +pub(crate) fn unusable_settlement_account( + program: &Pubkey, + data: &[u8], + owner: &Pubkey, + mint: &Pubkey, + token_program: &Pubkey, +) -> Option { + if program != token_program { + return Some("is not owned by the declared token program".to_string()); + } + let Some(decoded) = decode_token_account(data) else { + return Some("is not an initialized token account".to_string()); + }; + if decoded.mint != *mint { + return Some(format!( + "holds mint {} rather than {}", + pc::pubkey_string(&decoded.mint), + pc::pubkey_string(mint) + )); + } + if decoded.owner != *owner { + return Some(format!( + "is owned by {} rather than {}", + pc::pubkey_string(&decoded.owner), + pc::pubkey_string(owner) + )); + } + if decoded.state == TOKEN_ACCOUNT_FROZEN { + return Some("is frozen".to_string()); + } + if let Some(extension) = decoded.unsupported_extension { + return Some(format!( + "carries token account extension {extension}, which this server \ + will not settle through" + )); + } + if decoded.state != TOKEN_ACCOUNT_INITIALIZED { + return Some(format!("is in account state {}", decoded.state)); + } + None } -/// Decode a token account, or `None` when the data is too short to be one — -/// which is what an uninitialized (or non-token) account looks like. -/// -/// Token-2022 appends a type byte and a TLV extension list after the same -/// 165-byte base. Those extensions are not cosmetic: one can withhold part of a -/// transfer, require a memo to precede it, block it from a CPI, or move the -/// balance out of the classic ledger entirely — so an account carrying one is -/// reported rather than silently accepted as a payout destination. -fn decode_token_account(data: &[u8]) -> Option { - if data.len() < TOKEN_ACCOUNT_LEN { - return None; - } - Some(TokenAccount { - mint: Pubkey::try_from(&data[0..32]).ok()?, - owner: Pubkey::try_from(&data[32..64]).ok()?, - state: data[108], - unsupported_extension: unsupported_account_extension(data), - }) +/// Whether `signature` is a deposit this server already recorded for the +/// channel: still pending, or committed (a byte-identical retry). Its landing +/// was checked when it was first presented. +fn deposit_already_recorded(stored: Option<&ChannelState>, signature: Option<&str>) -> bool { + let (Some(state), Some(signature)) = (stored, signature) else { + return false; + }; + state + .pending_setup + .as_ref() + .is_some_and(|setup| setup.payer_signature == signature) + || state + .processed_topup_signatures + .iter() + .any(|recorded| recorded == signature) } -/// The first account extension outside the allowlist, if the account has one. -/// -/// A malformed or truncated TLV is reported as unsupported rather than skipped: -/// this decides whether to accept an escrow, so anything it cannot read is -/// something it should not settle through. -fn unsupported_account_extension(data: &[u8]) -> Option { - // A classic SPL Token account is exactly the base length and has no - // extension list at all. - if data.len() == TOKEN_ACCOUNT_LEN { - return None; - } - if data[TOKEN_ACCOUNT_LEN] != TOKEN_ACCOUNT_TYPE { - return Some(u16::from(data[TOKEN_ACCOUNT_LEN])); - } - let mut cursor = TOKEN_ACCOUNT_LEN + 1; - while cursor < data.len() { - // A run of zero padding is the end of the list, not an extension. - if data[cursor..].iter().all(|byte| *byte == 0) { - return None; - } - let Some(header) = data.get(cursor..cursor + 4) else { - return Some(u16::MAX); - }; - let extension = u16::from_le_bytes([header[0], header[1]]); - let length = usize::from(u16::from_le_bytes([header[2], header[3]])); - if extension != EXTENSION_IMMUTABLE_OWNER { - return Some(extension); - } - let Some(next) = cursor.checked_add(4).and_then(|c| c.checked_add(length)) else { - return Some(u16::MAX); - }; - if next > data.len() { - return Some(u16::MAX); - } - cursor = next; +/// [`X402BatchSettlement::check_deposit_can_land`]'s blocking reads. +fn deposit_can_land( + rpc: &RpcClient, + blockhash: &solana_hash::Hash, + ata: &Pubkey, + deposit_amount: u64, +) -> Result<(), Error> { + let not_ready = |detail: String| batch_err(codes::INVALID_SETTLEMENT_SIMULATION, detail); + let live = rpc + .is_blockhash_valid(blockhash, rpc.commitment()) + .map_err(|e| not_ready(format!("deposit blockhash check failed: {e}")))?; + if !live { + return Err(not_ready(format!( + "deposit transaction blockhash {blockhash} is not live" + ))); } - None + let account = rpc + .get_account(ata) + .map_err(|e| not_ready(format!("payer token account {ata} is unavailable: {e}")))?; + let balance = account + .data + .get(64..72) + .and_then(|bytes| bytes.try_into().ok()) + .map(u64::from_le_bytes) + .ok_or_else(|| not_ready(format!("payer token account {ata} is not a token account")))?; + if balance < deposit_amount { + return Err(not_ready(format!( + "payer token account {ata} holds {balance}, less than the {deposit_amount} deposit" + ))); + } + Ok(()) } +/// Where a record keeps when this server first saw its channel sealed (unix +/// seconds), inside [`ChannelState::extra`]: the program records no seal +/// time, and a deferred distribute's deadline counts from it. +const SEALED_AT_KEY: &str = "x402BatchSealedAt"; + /// Where a record keeps the receiver authorizer its channel's open bound /// (spec §3), inside [`ChannelState::extra`]. const RECEIVER_BINDING_KEY: &str = "x402BatchReceiverAuthorizer"; @@ -4678,12 +4896,11 @@ mod tests { ); } - /// A replay returns the resource handler's own cached response when one - /// was stored for it — the spec's `("access", channelId, - /// maxClaimableAmount)` cache — not only the settlement result layered - /// on top of it. + /// A replay returns the settlement only, never a stored resource body: + /// the voucher that reaches it is public once a claim publishes it or a + /// corrective 402 returns it, so it cannot gate a payer's response. #[tokio::test] - async fn a_replay_surfaces_the_cached_upstream_response() { + async fn a_replay_never_returns_a_stored_response_body() { let store = Arc::new(MemoryChannelStore::new()); let (handler, fee_payer) = handler(store.clone()); let (_, request) = paid_channel(&store, &handler, &fee_payer, 2_000).await; @@ -4696,33 +4913,50 @@ mod tests { panic!("a fresh authorization must be served"); }; handler.mark_handler_succeeded(&outcome).await.unwrap(); - handler.finish_commit(&outcome).await.expect("commits"); - let cached = crate::core::store::CachedUpstreamResponse { - status: 200, - content_type: Some("application/json".to_string()), - headers: vec![("etag".to_string(), "\"v1\"".to_string())], - body: br#"{"result":42}"#.to_vec(), - }; - handler - .cache_response(&outcome, cached.clone()) + let settled = handler.finish_commit(&outcome).await.expect("commits"); + // A body stored against the authorization, as an earlier release + // cached it. + let id = handler.authorization_of(&outcome).unwrap().id; + store + .mutate_channel( + &outcome.channel_id, + None, + Box::new(move |state| { + state.attach_cached_response( + &id, + crate::core::store::CachedUpstreamResponse { + status: 200, + content_type: Some("application/json".to_string()), + headers: vec![], + body: br#"{"secret":42}"#.to_vec(), + }, + ); + Ok(()) + }), + ) .await - .expect("caching a response is best-effort but should succeed here"); + .unwrap(); drop(outcome); - let BatchAccess::Replay(_, replayed_cached) = handler + let BatchAccess::Replay(replayed, replayed_body) = handler .verify_and_reserve_payment(&request, "0.001") .await .expect("the same voucher verifies") else { panic!("a committed authorization must replay"); }; - assert_eq!(replayed_cached, Some(cached)); + assert_eq!(replayed_body, None); + // Positive control: the settlement result itself still replays. + assert_eq!( + replayed.extra.and_then(|extra| extra.charged_amount), + settled.extra.and_then(|extra| extra.charged_amount) + ); } /// A repeat of a committed voucher presented to a higher-priced route, /// with `accepted.amount` rewritten to match it, is refused rather than - /// replayed: the original settlement and cached body belong to the route - /// that was paid for. + /// replayed: the original settlement belongs to the route that was paid + /// for. #[tokio::test] async fn a_replay_is_bound_to_the_route_that_committed_it() { let store = Arc::new(MemoryChannelStore::new()); @@ -4753,18 +4987,6 @@ mod tests { }; handler.mark_handler_succeeded(&first).await.unwrap(); handler.finish_commit(&first).await.unwrap(); - handler - .cache_response( - &first, - crate::core::store::CachedUpstreamResponse { - status: 200, - content_type: None, - headers: vec![], - body: b"low-route body".to_vec(), - }, - ) - .await - .unwrap(); drop(first); let err = handler @@ -4789,7 +5011,7 @@ mod tests { .verify_and_reserve_payment(&low_request, "0.001") .await .unwrap(), - BatchAccess::Replay(_, Some(_)) + BatchAccess::Replay(_, None) )); } @@ -5953,6 +6175,230 @@ mod tests { } } + /// A pipeline RPC that confirms every broadcast and records the program + /// ids each sent transaction invokes. + async fn recording_pipeline_rpc() -> ( + String, + Arc>>>, + tokio::task::JoinHandle<()>, + ) { + use axum::{routing::post, Json, Router}; + let sent = Arc::new(Mutex::new(Vec::new())); + let recorded = Arc::clone(&sent); + let app = Router::new().route( + "/", + post(move |Json(request): Json| { + let recorded = Arc::clone(&recorded); + async move { + let result = match request["method"].as_str().unwrap() { + "getLatestBlockhash" => serde_json::json!({ + "context": { "slot": 1 }, + "value": { + "blockhash": solana_hash::Hash::new_unique().to_string(), + "lastValidBlockHeight": 100 + } + }), + "sendTransaction" => { + let tx = + crate::core::tx::decode(request["params"][0].as_str().unwrap()) + .unwrap(); + let keys = tx.message.static_account_keys(); + recorded.lock().unwrap().push( + tx.message + .instructions() + .iter() + .map(|ix| keys[ix.program_id_index as usize]) + .collect(), + ); + serde_json::json!(tx.signatures[0].to_string()) + } + "getSignatureStatuses" => { + let statuses = request["params"][0] + .as_array() + .unwrap() + .iter() + .map(|_| { + serde_json::json!({ + "slot": 2, "confirmations": null, "err": null, + "confirmationStatus": "finalized", + "status": { "Ok": null } + }) + }) + .collect::>(); + serde_json::json!({ "context": { "slot": 2 }, "value": statuses }) + } + method => panic!("unexpected RPC method {method}"), + }; + Json(serde_json::json!({ + "jsonrpc": "2.0", "id": request["id"], "result": result + })) + } + }), + ); + let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); + let url = format!("http://{}", listener.local_addr().unwrap()); + let server = tokio::spawn(async move { axum::serve(listener, app).await.unwrap() }); + (url, sent, server) + } + + /// The program forfeits a due refund to the treasury when the payer's + /// token account cannot take it, so `finalize_close` seals such a + /// channel without distributing it. + /// Run `finalize_close` over one channel at onchain `status`, its payer + /// refund account usable or not, its record seeded with `sealed_at`. + /// Returns the payment-channels instructions sent and the seal time the + /// record holds afterwards. + async fn finalize_close_once( + status: u8, + payable: bool, + sealed_at: Option, + ) -> (usize, Option) { + use base64::Engine as _; + use solana_rpc_client_api::request::RpcRequest; + + { + let (url, sent, rpc) = recording_pipeline_rpc().await; + let key = SigningKey::from_bytes(&[21; 32]); + let mut keypair = [0u8; 64]; + keypair[..32].copy_from_slice(key.as_bytes()); + keypair[32..].copy_from_slice(key.verifying_key().as_bytes()); + let signer = solana_keychain::MemorySigner::from_bytes(&keypair).unwrap(); + let fee_payer = signer.pubkey(); + let mut config = BatchConfig::new(PAY_TO, "localnet", Arc::new(signer)); + config.withdraw_delay = 3600; + config.rpc_url = Some(url); + let store = Arc::new(MemoryChannelStore::new()); + let handler = X402BatchSettlement::with_store(config, store.clone()).unwrap(); + let requirements = handler.requirements("0.001").unwrap(); + let (_, client_config, channel) = client(&fee_payer, &requirements); + let channel_b58 = pc::pubkey_string(&channel); + let mut seeded = handler.seed_state(&channel_b58, &client_config); + if let Some(sealed_at) = sealed_at { + seeded + .extra + .insert(SEALED_AT_KEY.to_string(), sealed_at.into()); + } + store.put_channel(&channel_b58, seeded).await.unwrap(); + // 4_000 of the 5_000 deposit is due back to the payer; the + // closing channel is past its grace deadline. + let mut onchain = onchain_channel(&client_config, &fee_payer, 5_000); + onchain.status = status; + onchain.settlement.settled = 1_000; + onchain.closure_started_at = 1; + let mint = handler.mint().unwrap(); + let token_program = handler.token_program().unwrap(); + let payer = pc::from_address(&onchain.payer); + let mut token_account = vec![0u8; 165]; + token_account[..32].copy_from_slice(mint.as_ref()); + token_account[32..64].copy_from_slice(payer.as_ref()); + token_account[108] = 1; + let account = |data: &[u8], owner: &Pubkey| { + serde_json::json!({ + "context": { "slot": 1 }, + "value": { + "lamports": 1_000_000, + "data": [base64::engine::general_purpose::STANDARD.encode(data), "base64"], + "owner": pc::pubkey_string(owner), + "executable": false, + "rentEpoch": 0, + "space": data.len(), + } + }) + }; + let mut mocks = solana_rpc_client::mock_sender::MocksMap::default(); + mocks.insert( + RpcRequest::GetAccountInfo, + account(&borsh::to_vec(&onchain).unwrap(), &pc::default_program_id()), + ); + mocks.insert( + RpcRequest::GetAccountInfo, + if payable { + account(&token_account, &token_program) + } else { + serde_json::json!({ "context": { "slot": 1 }, "value": null }) + }, + ); + let handler = handler.with_rpc_client(RpcClient::new_mock_with_mocks_map( + "succeeds".to_string(), + mocks, + )); + + handler + .finalize_close(std::slice::from_ref(&channel_b58)) + .await + .unwrap(); + let program_id = pc::default_program_id(); + let sent = sent.lock().unwrap().clone(); + let distributes = sent + .iter() + .flatten() + .filter(|program| **program == program_id) + .count(); + rpc.abort(); + let recorded = store + .get_channel(&channel_b58) + .await + .unwrap() + .and_then(|state| state.extra.get(SEALED_AT_KEY)?.as_i64()); + (distributes, recorded) + } + } + + #[tokio::test(flavor = "multi_thread")] + async fn finalize_close_never_distributes_into_an_unusable_refund_account() { + // (on-chain status, payer refund account usable) → programs invoked. + for (status, payable) in [ + (CHANNEL_STATUS_SEALED, false), + (CHANNEL_STATUS_SEALED, true), + (CHANNEL_STATUS_CLOSING, false), + (CHANNEL_STATUS_CLOSING, true), + ] { + let (distributes, sealed_at) = finalize_close_once(status, payable, None).await; + let expected = match (status, payable) { + // Already sealed: distribute only, or nothing this pass. + (CHANNEL_STATUS_SEALED, true) => 1, + (CHANNEL_STATUS_SEALED, false) => 0, + // Closing: seal + distribute, or the seal alone. + (_, true) => 2, + (_, false) => 1, + }; + assert_eq!(distributes, expected, "status {status}, payable {payable}"); + // The seal time a deferred distribute's deadline counts from. + let now = now_unix() as i64; + assert!( + sealed_at.is_some_and(|at| now - at <= 1), + "status {status}, payable {payable}: {sealed_at:?}" + ); + } + } + + /// A deferred distribute is retried on every later pass and, once the + /// channel has been sealed for its grace period, sent anyway: a payer + /// keeping its refund account unusable cannot hold the payout. The first + /// seal time recorded is kept. + #[tokio::test(flavor = "multi_thread")] + async fn a_deferred_distribute_runs_once_the_grace_period_after_the_seal_ends() { + let now = now_unix() as i64; + // Grace 3600 s: inside it the distribute still waits. + let inside = now - 3_599; + assert_eq!( + finalize_close_once(CHANNEL_STATUS_SEALED, false, Some(inside)).await, + (0, Some(inside)) + ); + let past = now - 3_600; + assert_eq!( + finalize_close_once(CHANNEL_STATUS_SEALED, false, Some(past)).await, + (1, Some(past)) + ); + // Positive control: a payable account distributes inside the grace. + assert_eq!( + finalize_close_once(CHANNEL_STATUS_SEALED, true, Some(inside)) + .await + .0, + 1 + ); + } + /// A replayed opening deposit for a channel the chain already holds, sent /// to a store that has no record of it (a restart over the in-memory /// store), is refused instead of seeding a zero watermark that would serve @@ -6002,6 +6448,242 @@ mod tests { assert!(!err.to_string().contains("has no record"), "{err}"); } + /// One channel whose settlement fails on-chain fails the transaction it + /// was packed into; the other channels are submitted again alone and + /// land, and only the failing one is reported. + #[tokio::test(flavor = "multi_thread")] + async fn a_failing_channel_does_not_fail_the_channels_packed_with_it() { + use axum::{routing::post, Json, Router}; + use std::collections::HashSet; + use std::sync::Mutex as StdMutex; + + #[derive(Clone, Default)] + struct Chain { + poison: Arc>>, + failing: Arc>>, + sends: Arc>>, + } + async fn rpc( + axum::extract::State(chain): axum::extract::State, + Json(request): Json, + ) -> Json { + let result = match request["method"].as_str().unwrap_or_default() { + "getLatestBlockhash" => serde_json::json!({ + "context": { "slot": 1 }, + "value": { + "blockhash": solana_hash::Hash::new_unique().to_string(), + "lastValidBlockHeight": 100 + } + }), + "sendTransaction" => { + let tx = + crate::core::tx::decode(request["params"][0].as_str().unwrap()).unwrap(); + let signature = tx.signatures[0].to_string(); + chain + .sends + .lock() + .unwrap() + .push(tx.message.instructions().len()); + let poison = *chain.poison.lock().unwrap(); + if poison.is_some_and(|p| tx.message.static_account_keys().contains(&p)) { + chain.failing.lock().unwrap().insert(signature.clone()); + } + serde_json::json!(signature) + } + "getSignatureStatuses" => { + let failing = chain.failing.lock().unwrap().clone(); + let values: Vec<_> = request["params"][0] + .as_array() + .unwrap() + .iter() + .map(|sig| { + let err = failing + .contains(sig.as_str().unwrap()) + .then(|| serde_json::json!({ "InstructionError": [0, { "Custom": 1 }] })); + serde_json::json!({ + "slot": 1, + "confirmations": null, + "err": err, + "status": match &err { Some(e) => serde_json::json!({ "Err": e }), None => serde_json::json!({ "Ok": null }) }, + "confirmationStatus": "confirmed" + }) + }) + .collect(); + serde_json::json!({ "context": { "slot": 1 }, "value": values }) + } + other => panic!("unexpected RPC method {other}"), + }; + Json(serde_json::json!({ "jsonrpc": "2.0", "id": request["id"], "result": result })) + } + + let chain = Chain::default(); + let app = Router::new() + .route("/", post(rpc)) + .with_state(chain.clone()); + let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); + let url = format!("http://{}", listener.local_addr().unwrap()); + tokio::spawn(async move { axum::serve(listener, app).await.unwrap() }); + let pipeline = TxPipeline::new( + url, + TxPipelineConfig { + batch_coalesce_interval: std::time::Duration::from_millis(10), + confirmation_poll_interval: std::time::Duration::from_millis(10), + confirmation_timeout: std::time::Duration::from_secs(2), + ..TxPipelineConfig::default() + }, + ); + let key = SigningKey::from_bytes(&[21u8; 32]); + let mut keypair = [0u8; 64]; + keypair[..32].copy_from_slice(key.as_bytes()); + keypair[32..].copy_from_slice(key.verifying_key().as_bytes()); + let signer = solana_keychain::MemorySigner::from_bytes(&keypair).unwrap(); + let handler = X402BatchSettlement::with_store( + BatchConfig::new(PAY_TO, "localnet", Arc::new(signer)), + Arc::new(MemoryChannelStore::new()), + ) + .unwrap() + .with_tx_pipeline(pipeline); + let groups = |accounts: &[Pubkey]| -> Vec { + accounts + .iter() + .map(|account| ChannelInstructionGroup { + channel_id: pc::pubkey_string(account), + instructions: vec![Instruction::new_with_bytes( + Pubkey::new_unique(), + &[0], + vec![solana_instruction::AccountMeta::new(*account, false)], + )], + }) + .collect() + }; + let accounts: Vec = (0..3).map(|_| Pubkey::new_unique()).collect(); + *chain.poison.lock().unwrap() = Some(accounts[1]); + + let err = handler + .submit_groups(groups(&accounts), MAX_CLAIMS_PER_BATCH) + .await + .expect_err("the failing channel is reported"); + assert!(err.to_string().contains("1 of 3"), "{err}"); + // The packed attempt, then one transaction per channel. + assert_eq!(chain.sends.lock().unwrap().clone(), vec![3, 1, 1, 1]); + + // Positive control: without a failing channel the pack lands as one. + *chain.poison.lock().unwrap() = None; + chain.sends.lock().unwrap().clear(); + let accounts: Vec = (0..3).map(|_| Pubkey::new_unique()).collect(); + let signatures = handler + .submit_groups(groups(&accounts), MAX_CLAIMS_PER_BATCH) + .await + .unwrap(); + assert_eq!(signatures.len(), 1); + assert_eq!(chain.sends.lock().unwrap().clone(), vec![3]); + } + + /// A deposit is broadcast only after the handler runs, so one that cannot + /// land (an expired blockhash, a payer short of the deposit) is refused + /// before the handler, and a failed read refuses too. + /// A retry of a deposit already committed skips the landing check like a + /// pending one: its funds moved, so a balance read now would refuse it. + #[test] + fn a_committed_deposit_retry_skips_the_landing_check() { + let (handler, fee_payer) = handler(Arc::new(MemoryChannelStore::new())); + let requirements = handler.requirements("0.001").unwrap(); + let (_, config, channel) = client(&fee_payer, &requirements); + let mut state = seeded(&channel, &config, 5_000, 0); + state.processed_topup_signatures = vec!["committed".to_string()]; + assert!(deposit_already_recorded(Some(&state), Some("committed"))); + // Positive controls: an unknown deposit, or none at all, is checked. + assert!(!deposit_already_recorded(Some(&state), Some("fresh"))); + assert!(!deposit_already_recorded(None, Some("committed"))); + assert!(!deposit_already_recorded(Some(&state), None)); + state.processed_topup_signatures.clear(); + assert!(!deposit_already_recorded(Some(&state), Some("committed"))); + } + + #[tokio::test(flavor = "multi_thread")] + async fn a_deposit_that_cannot_land_is_refused_before_serving() { + use base64::Engine as _; + let (probe, fee_payer) = handler(Arc::new(MemoryChannelStore::new())); + let (payer, mint, token_program) = ( + Pubkey::new_unique(), + probe.mint().unwrap(), + probe.token_program().unwrap(), + ); + let tx = VersionedTransaction { + signatures: vec![solana_signature::Signature::default()], + message: solana_message::VersionedMessage::V0( + solana_message::v0::Message::try_compile( + &fee_payer, + &[], + &[], + solana_hash::Hash::new_unique(), + ) + .unwrap(), + ), + }; + let chain = |live: bool, balance: u64| { + let mut data = vec![0u8; 165]; + data[..32].copy_from_slice(mint.as_ref()); + data[32..64].copy_from_slice(payer.as_ref()); + data[64..72].copy_from_slice(&balance.to_le_bytes()); + data[108] = 1; + let mut mocks = std::collections::HashMap::new(); + mocks.insert( + solana_rpc_client_api::request::RpcRequest::IsBlockhashValid, + serde_json::json!({ "context": { "slot": 1 }, "value": live }), + ); + mocks.insert( + solana_rpc_client_api::request::RpcRequest::GetAccountInfo, + serde_json::json!({ + "context": { "slot": 1 }, + "value": { + "lamports": 2_039_280, + "data": [base64::engine::general_purpose::STANDARD.encode(&data), "base64"], + "owner": pc::pubkey_string(&token_program), + "executable": false, + "rentEpoch": 0, + "space": 165, + } + }), + ); + let (handler, _) = handler(Arc::new(MemoryChannelStore::new())); + handler.with_rpc_client(RpcClient::new_mock_with_mocks( + "succeeds".to_string(), + mocks, + )) + }; + let check = |handler: X402BatchSettlement| { + let tx = tx.clone(); + async move { + handler + .check_deposit_can_land(&tx, &payer, &mint, &token_program, 5_000) + .await + } + }; + let refused = |result: Result<(), Error>, detail: &str| { + let err = result.expect_err(detail); + assert_eq!( + crate::x402::protocol::schemes::batch_settlement::classify(&err.to_string()), + codes::INVALID_SETTLEMENT_SIMULATION, + "{err}" + ); + assert!(err.to_string().contains(detail), "{err}"); + }; + + refused( + check(chain(true, 4_999)).await, + "less than the 5000 deposit", + ); + refused(check(chain(false, 5_000)).await, "is not live"); + let (unreachable, _) = handler(Arc::new(MemoryChannelStore::new())); + let unreachable = unreachable.with_rpc_client(RpcClient::new_mock("fails".to_string())); + refused(check(unreachable).await, "blockhash check failed"); + // Positive control: a live blockhash and exactly the deposit. + check(chain(true, 5_000)) + .await + .expect("a fundable deposit passes"); + } + /// Channel reads run off the async worker. The blocking RPC client parks /// its calling thread (`block_in_place`, which a current-thread runtime /// refuses outright), so a read made inline from async verification would diff --git a/rust/crates/kit/src/x402/server/upto.rs b/rust/crates/kit/src/x402/server/upto.rs index 6e6f3d8e3..137909180 100644 --- a/rust/crates/kit/src/x402/server/upto.rs +++ b/rust/crates/kit/src/x402/server/upto.rs @@ -31,6 +31,10 @@ use solana_pubkey::Pubkey; use solana_rpc_client::rpc_client::RpcClient; use solana_transaction::versioned::VersionedTransaction; +use crate::core::payment_channel::payer_refund::{ + payer_refund, DistributeClearance, ObservedAccount, PayerRefund, RefundDeadline, + SealedRefundTerms, +}; use crate::core::payment_channels as pc; use crate::core::payment_channels::generated::accounts::Channel; use crate::core::tx::{TxV1Mode, TxVersion}; @@ -67,7 +71,8 @@ const MIN_SETTLEMENT_VOUCHER_TTL_SECONDS: u64 = 60; pub struct UptoConfig { /// Where settled funds go. The channel payee is always the fee payer /// (zero-share seat); this only decides which beneficiary the bound 100% - /// distribution split pays. + /// distribution split pays. That beneficiary's token account for each + /// offered currency must already exist: opens are refused until it does. pub payout: UptoPayout, /// Non-empty universe of currencies this server offers and accepts. `[0]` /// is the primary/default currency. The `upto` challenge advertises one @@ -734,6 +739,7 @@ impl X402Upto { expires_at, in_flight, } = self.prepare_open(header, &offered, now_unix())?; + self.ensure_payouts_ready(&expected_mint, &token_program, &expected_distribution)?; self.cosign_fee_payer(&mut tx).await?; crate::core::rpc::send_and_confirm_transaction(&self.rpc, &tx) .map_err(|e| Error::Rpc(format!("open broadcast failed: {e}")))?; @@ -914,42 +920,28 @@ impl X402Upto { /// data, not as a transaction signature — so the worker can sign the /// envelope on the caller's behalf. /// - /// When the payer has closed its token account since the open, the - /// `distribute` that refunds it would fail and take the charge down with - /// it, so only `settle_and_seal` is emitted: the charge is locked onchain - /// and the permissionless `distribute` pays both sides once the payer - /// recreates the account to collect its refund. The account is never - /// recreated at the fee payer's expense, which the payer could farm. + /// The bundle ends in `distribute`, which pays `payTo`, refunds the + /// payer, closes the escrow token account to the fee payer and leaves the + /// channel for `reclaim`. When a refund is due and the payer's token + /// account can no longer take it (closed or frozen since the open), the + /// program would forfeit the refund to the treasury, so the bundle only + /// seals and the distribute is deferred to + /// [`distribute_sealed`](Self::distribute_sealed), which runs it once the + /// account is usable, the payer withdrew, or the grace period after the + /// open has passed. The account is never recreated at the fee payer's + /// expense, which the payer could farm. pub async fn settlement_instructions( &self, open: &VerifiedUptoOpen, actual: u64, ) -> Result, Error> { - let (payer_token, _) = - pc::find_associated_token_address(&open.payer, &open.mint, &open.token_program); - // Only a confirmed absence drops `distribute`; on an RPC error the - // atomic transaction itself is the safeguard. - let distribute = !matches!( - self.rpc - .get_account_with_commitment(&payer_token, self.rpc.commitment()) - .map(|response| response.value), - Ok(None) - ); - if !distribute { - tracing::warn!( - channel = %open.channel_id, - "upto payer token account is gone; sealing the charge without distributing" - ); - } - self.build_settlement_instructions(open, actual, distribute) - .await + self.build_settlement_instructions(open, actual).await } async fn build_settlement_instructions( &self, open: &VerifiedUptoOpen, actual: u64, - distribute: bool, ) -> Result, Error> { assert_settlement_within_ceiling(actual, open.max_amount)?; // The voucher is signed by this server, so its deadline is chosen here @@ -990,45 +982,321 @@ impl X402Upto { )? }; - if !distribute { + let now = now_unix(); + let decision = self + .sealed_refund( + &open.channel_id, + SealedRefundTerms { + channel: open.channel_id, + payer: open.payer, + mint: open.mint, + token_program: open.token_program, + deposit: open.deposit, + settled: actual, + payer_withdrawn_at: 0, + }, + // This bundle seals the channel now. + now, + now, + ) + .await?; + let Some(clearance) = decision.clearance() else { return Ok(instructions); - } - let payee = open.payee; - instructions.push(pc::build_create_associated_token_account_instruction( - &self.fee_payer, - &payee, - &open.mint, - &open.token_program, - )); - instructions.push(pc::build_create_associated_token_account_instruction( - &self.fee_payer, - &self.treasury_owner(), - &open.mint, - &open.token_program, - )); - for entry in &open.distribution { - instructions.push(pc::build_create_associated_token_account_instruction( - &self.fee_payer, - &entry.recipient, - &open.mint, - &open.token_program, - )); - } - instructions.push(pc::build_distribute_instruction( - &open.channel_id, + }; + instructions.extend(self.distribute_instructions( + &clearance, &open.payer, &open.rent_payer, - &payee, - &self.treasury_owner(), &open.mint, &open.distribution, &open.token_program, &open.program_id, )); - Ok(instructions) } + /// The payout of a sealed channel this server holds the payee seat of: + /// its own and the treasury's token accounts, then `distribute`. Built + /// only under a [`DistributeClearance`]. + #[allow(clippy::too_many_arguments)] + fn distribute_instructions( + &self, + clearance: &DistributeClearance, + payer: &Pubkey, + rent_payer: &Pubkey, + mint: &Pubkey, + distribution: &[pc::Distribution], + token_program: &Pubkey, + program_id: &Pubkey, + ) -> Vec { + let channel = clearance.channel(); + // Recipient accounts were required to exist before the open + // (`ensure_payouts_ready`) and are never created here: the fee payer + // would fund an account its owner can close for the rent. + vec![ + pc::build_create_associated_token_account_instruction( + &self.fee_payer, + &self.fee_payer, + mint, + token_program, + ), + pc::build_create_associated_token_account_instruction( + &self.fee_payer, + &self.treasury_owner(), + mint, + token_program, + ), + pc::build_distribute_instruction( + channel, + payer, + rent_payer, + &self.fee_payer, + &self.treasury_owner(), + mint, + distribution, + token_program, + program_id, + ), + ] + } + + /// What the sealed `distribute` of `channel` may do (see + /// [`payer_refund`]), reading the payer's refund account when a refund + /// is due. The deadline counts `withdraw_delay` from `sealed_at`. + async fn sealed_refund( + &self, + channel: &Pubkey, + terms: SealedRefundTerms, + sealed_at: i64, + now: i64, + ) -> Result { + let deadline = RefundDeadline { + sealed_at, + grace_period: self.config.withdraw_delay, + }; + if terms.refund_due() == 0 { + return Ok(payer_refund(&terms, None, deadline, now)); + } + let address = terms.payer_token_account(); + let rpc = Arc::clone(&self.rpc); + let account = tokio::task::spawn_blocking(move || { + rpc.get_account_with_commitment(&address, rpc.commitment()) + }) + .await + .map_err(|e| Error::Other(format!("payer refund account read task failed: {e}")))? + .map_err(|e| Error::Rpc(format!("payer refund account {address}: {e}")))? + .value; + let observed = account.as_ref().map(|account| ObservedAccount { + owner: pc::from_address(&account.owner), + data: &account.data, + }); + let decision = payer_refund(&terms, observed, deadline, now); + match &decision { + PayerRefund::Clear(_) => {} + PayerRefund::Deferred { + refund, + payer_token_account, + reason, + until, + } => tracing::warn!( + channel = %channel, + %payer_token_account, + refund, + reason, + until, + "payer refund account cannot be paid; sealing without distributing until it \ + can, or until the deadline (distribute_sealed)" + ), + PayerRefund::Forfeit { + refund, + payer_token_account, + reason, + .. + } => tracing::warn!( + channel = %channel, + %payer_token_account, + refund, + reason, + "payer refund account still unusable past the deadline; distributing, the \ + refund goes to the treasury" + ), + } + Ok(decision) + } + + /// Distribute the sealed channels this server holds the payee seat of + /// whose distribute a settlement deferred (see + /// [`settlement_instructions`](Self::settlement_instructions)), and + /// return the confirmed signatures. + /// + /// The chain is the work queue: channels are discovered by + /// `rent_payer == payee == fee payer` and accepted only when their PDA + /// rederives and their distribution is this server's, so no local state + /// is needed and nothing is lost on restart. A channel is distributed as + /// soon as the payer's refund account can take its refund (or the payer + /// withdrew it), and once `withdraw_delay` has passed since the channel's + /// open, anyway: the program then sends the refund to the treasury, and + /// a payer can never hold the payout and the fee payer's rent hostage. + /// The program records no seal time; an `upto` channel is sealed by the + /// settlement of the request that opened it, so the open's block time + /// stands in for it. + /// + /// Run it periodically, like `reclaim` for other channel schemes. + pub async fn distribute_sealed(&self) -> Result, Error> { + let program_id = self.program_id()?; + let distribution = self.distribution()?; + let distribution_hash = pc::distribution_hash(&distribution); + let sealed = crate::core::payment_channels::generated::types::ChannelStatus::Sealed as u8; + let mut signatures = Vec::new(); + for (channel_id, channel) in self.sealed_channel_candidates(&program_id).await? { + if channel.status != sealed + || pc::from_address(&channel.payee) != self.fee_payer + || channel.distribution_hash != distribution_hash + { + continue; + } + let mint = pc::from_address(&channel.mint); + let Some(token_program) = self + .config + .currencies + .iter() + .find(|cc| self.mint_for(cc).is_ok_and(|candidate| candidate == mint)) + .map(|cc| self.token_program_for(cc)) + .transpose()? + else { + continue; + }; + let rpc = Arc::clone(&self.rpc); + let open_slot = channel.open_slot; + let opened_at = match tokio::task::spawn_blocking(move || rpc.get_block_time(open_slot)) + .await + .map_err(|e| Error::Other(format!("block time read task failed: {e}")))? + { + Ok(time) => time, + Err(error) => { + tracing::warn!(channel = %channel_id, %error, "open block time unavailable; skipping"); + continue; + } + }; + let payer = pc::from_address(&channel.payer); + let decision = self + .sealed_refund( + &channel_id, + SealedRefundTerms { + channel: channel_id, + payer, + mint, + token_program, + deposit: channel.deposit, + settled: channel.settlement.settled, + payer_withdrawn_at: channel.payer_withdrawn_at, + }, + opened_at, + now_unix(), + ) + .await?; + let Some(clearance) = decision.clearance() else { + continue; + }; + let instructions = self.distribute_instructions( + &clearance, + &payer, + &pc::from_address(&channel.rent_payer), + &mint, + &distribution, + &token_program, + &program_id, + ); + let blockhash = self + .rpc + .get_latest_blockhash() + .map_err(|e| Error::Rpc(format!("blockhash fetch failed: {e}")))?; + let mut tx = crate::core::tx::build_unsigned( + self.tx_version(), + &self.fee_payer, + &instructions, + blockhash, + None, + )?; + self.sign_settlement_transaction(&mut tx).await?; + match crate::core::rpc::send_and_confirm_with_outcome( + &self.rpc, + &tx, + crate::core::rpc::PriorBroadcast::None, + ) { + Ok(signature) => signatures.push(signature.to_string()), + Err(failure) => { + tracing::warn!(channel = %channel_id, %failure, "deferred distribute failed"); + } + } + } + Ok(signatures) + } + + /// Channels whose rent this server's fee payer put up, PDA-checked. + async fn sealed_channel_candidates( + &self, + program_id: &Pubkey, + ) -> Result, Error> { + use solana_rpc_client_api::config::{ + RpcAccountInfoConfig, RpcProgramAccountsConfig, UiAccountEncoding, + }; + use solana_rpc_client_api::filter::{Memcmp, RpcFilterType}; + use solana_rpc_client_api::request::RpcRequest; + use solana_rpc_client_api::response::RpcKeyedAccount; + + let config = RpcProgramAccountsConfig { + filters: Some(vec![ + RpcFilterType::DataSize(pc::CHANNEL_ACCOUNT_SIZE as u64), + RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + pc::CHANNEL_RENT_PAYER_OFFSET, + self.fee_payer.to_bytes().to_vec(), + )), + RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + pc::CHANNEL_PAYEE_OFFSET, + self.fee_payer.to_bytes().to_vec(), + )), + ]), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64), + ..Default::default() + }, + ..Default::default() + }; + let params = serde_json::json!([program_id.to_string(), config]); + let rpc = Arc::clone(&self.rpc); + let keyed: Vec = + tokio::task::spawn_blocking(move || rpc.send(RpcRequest::GetProgramAccounts, params)) + .await + .map_err(|e| Error::Other(format!("channel discovery task failed: {e}")))? + .map_err(|e| Error::Rpc(format!("getProgramAccounts failed: {e}")))?; + let mut found = Vec::new(); + for entry in keyed { + let Ok(address) = Pubkey::from_str(&entry.pubkey) else { + continue; + }; + let Some(data) = entry.account.data.decode() else { + continue; + }; + let Ok(channel) = Channel::from_bytes(&data) else { + continue; + }; + let (derived, _) = pc::find_channel_pda( + &pc::from_address(&channel.payer), + &pc::from_address(&channel.payee), + &pc::from_address(&channel.mint), + &pc::from_address(&channel.authorized_signer), + channel.salt, + channel.open_slot, + program_id, + ); + if derived == address { + found.push((address, channel)); + } + } + Ok(found) + } + /// Build the `PAYMENT-RESPONSE` receipt for a settled `actual` amount and /// its broadcast `signature`. Pure: pairs the settle signature (inline or /// worker-provided) with the open's payer/network. @@ -1210,6 +1478,54 @@ impl X402Upto { Ok(()) } + /// Phase 3 step 8, settlement readiness: every distribution recipient's + /// token account must already exist and be usable before the deposit is + /// escrowed. Settlement never creates them at the fee payer's expense + /// (an owner could close and recreate the account to collect that rent), + /// and the program forfeits a payout to an unusable account. A failed + /// read is a refusal too. + fn ensure_payouts_ready( + &self, + mint: &Pubkey, + token_program: &Pubkey, + distribution: &[pc::Distribution], + ) -> Result<(), Error> { + // The fee payer's own account is the payee seat settlement creates + // itself; only accounts of other owners must already exist. + for entry in distribution + .iter() + .filter(|entry| entry.recipient != self.fee_payer) + { + let (ata, _) = pc::find_associated_token_address(&entry.recipient, mint, token_program); + let account = self + .rpc + .get_account_with_commitment(&ata, self.rpc.commitment()) + .map_err(|e| Error::Rpc(format!("payout token account read failed: {e}")))? + .value; + let problem = match account { + None => Some("does not exist".to_string()), + Some(account) => { + crate::x402::server::batch_settlement::unusable_settlement_account( + &pc::from_address(&account.owner), + &account.data, + &entry.recipient, + mint, + token_program, + ) + } + }; + if let Some(problem) = problem { + return Err(Error::Other(format!( + "payout token account {} of {} {problem}; it must be an initialized \ + token account before payments settle to it", + pc::pubkey_string(&ata), + pc::pubkey_string(&entry.recipient) + ))); + } + } + Ok(()) + } + fn fetch_channel(&self, channel_id: &Pubkey) -> Result { let data = self .rpc @@ -1245,7 +1561,8 @@ pub mod testkit { /// The checks [`X402Upto::verify_open_for_route`] runs before it /// broadcasts the open, at an explicit `now` (Unix seconds) and with the /// route's maximum already in base units, co-signature included (on a - /// local copy). `Ok` means the production path would go on to broadcast. + /// local copy). `Ok` means the production path would go on to its + /// settlement-readiness reads (`ensure_payouts_ready`) and broadcast. pub async fn verify_open_pre_broadcast( server: &X402Upto, header: &str, @@ -2497,17 +2814,58 @@ mod tests { ]) .is_err()); assert!(validate_layout(&[ + cu_limit_ix(1), cu_price_ix(pc::MAX_COMPUTE_UNIT_PRICE_MICROLAMPORTS), open_placeholder() ]) .is_ok()); assert!(validate_layout(&[ + cu_limit_ix(1), cu_price_ix(pc::MAX_COMPUTE_UNIT_PRICE_MICROLAMPORTS + 1), open_placeholder() ]) .is_err()); } + #[test] + fn bounds_the_priority_fee_the_operator_pays() { + let over_fee_cap = |result: Result<(), Error>| { + result.is_err_and(|e| e.to_string().contains("exceeds the sponsored fee maximum")) + }; + // Both fields at their ceilings: 400,000 x 5 lamports. + assert!(over_fee_cap(validate_layout(&[ + cu_limit_ix(pc::OPEN_MAX_COMPUTE_UNIT_LIMIT), + cu_price_ix(pc::MAX_COMPUTE_UNIT_PRICE_MICROLAMPORTS), + open_placeholder(), + ]))); + // The same price with no declared limit is charged on the runtime + // default for each of the five non-budget instructions. + assert!(over_fee_cap(validate_layout(&[ + cu_price_ix(pc::MAX_COMPUTE_UNIT_PRICE_MICROLAMPORTS), + open_placeholder(), + lighthouse_ix(), + lighthouse_ix(), + lighthouse_ix(), + memo_ix("x"), + ]))); + // Exactly the sponsored maximum, declared or implied. + let at_cap = crate::core::tx::MAX_SPONSORED_PRIORITY_FEE_LAMPORTS * 1_000_000 + / u64::from(pc::OPEN_MAX_COMPUTE_UNIT_LIMIT); + assert!(validate_layout(&[ + cu_limit_ix(pc::OPEN_MAX_COMPUTE_UNIT_LIMIT), + cu_price_ix(at_cap), + open_placeholder(), + ]) + .is_ok()); + // Two non-budget instructions imply the same 400,000 unit limit. + assert!(validate_layout(&[cu_price_ix(at_cap), open_placeholder(), memo_ix("x")]).is_ok()); + assert!(over_fee_cap(validate_layout(&[ + cu_price_ix(at_cap + 1), + open_placeholder(), + memo_ix("x"), + ]))); + } + #[test] fn rejects_an_over_long_or_unknown_suffix() { // A fourth Lighthouse assertion is past what either wallet injects. @@ -2799,13 +3157,19 @@ mod tests { /// up in the settlement voucher: the server signs its own deadline. #[tokio::test] async fn settlement_voucher_deadline_is_server_derived() { - let engine = multi_currency_engine(&["USDC"]); + let mut engine = multi_currency_engine(&["USDC"]); let mut open = engine.test_open(Pubkey::new_unique(), 1_000); + // The payer's refund account is usable, so settlement distributes. + engine.rpc = engine_reading( + token_account_json(&open.mint, &open.payer, &open.token_program), + vec![], + ) + .rpc; let now = now_unix(); open.expires_at = now + 1; let instructions = engine - .build_settlement_instructions(&open, 400, true) + .build_settlement_instructions(&open, 400) .await .unwrap(); let expiry = settled_voucher_expiry(&instructions, &open, 400); @@ -2816,7 +3180,7 @@ mod tests { open.expires_at = now - 10; let instructions = engine - .build_settlement_instructions(&open, 400, true) + .build_settlement_instructions(&open, 400) .await .unwrap(); assert!(settled_voucher_expiry(&instructions, &open, 400) > now); @@ -2888,36 +3252,279 @@ mod tests { assert!(match_offered_requirement(std::slice::from_ref(&a), &accepted_a).is_ok()); } - /// A payer that closed its token account after the open cannot make the - /// settlement fail as a whole: the charge is sealed without the refund. + /// The fee payer funds no account a distribution recipient owns: the + /// recipient could close it after each settlement and keep the rent. #[tokio::test] - async fn settlement_without_a_payer_account_still_seals_the_charge() { - let engine = multi_currency_engine(&["USDC"]); + async fn settlement_never_creates_a_recipient_account() { + let mut engine = multi_currency_engine(&["USDC"]); + let open = engine.test_open(Pubkey::new_unique(), 1_000); + // The payer's refund account is usable, so settlement distributes. + engine.rpc = engine_reading( + token_account_json(&open.mint, &open.payer, &open.token_program), + vec![], + ) + .rpc; + let created_for = |ixs: &[Instruction]| -> Vec { + ixs.iter() + .filter(|ix| ix.program_id == pc::associated_token_program_id()) + .map(|ix| ix.accounts[2].pubkey) + .collect() + }; + for actual in [0, 400, 1_000] { + let ixs = engine + .build_settlement_instructions(&open, actual) + .await + .unwrap(); + let created = created_for(&ixs); + for entry in &open.distribution { + assert!(!created.contains(&entry.recipient), "actual {actual}"); + } + // Positive control: the fee payer's own seat and the treasury. + assert!(created.contains(&engine.fee_payer)); + assert!(created.contains(&engine.treasury_owner())); + } + } + + #[test] + fn an_open_is_refused_until_every_payout_account_is_usable() { + let engine = |rpc: RpcClient| { + let mut engine = multi_currency_engine(&["USDC"]); + engine.rpc = Arc::new(rpc); + engine + }; + let answering = |value: serde_json::Value| { + let mut mocks = std::collections::HashMap::new(); + mocks.insert( + solana_rpc_client_api::request::RpcRequest::GetAccountInfo, + serde_json::json!({ "context": { "slot": 1 }, "value": value }), + ); + RpcClient::new_mock_with_mocks("succeeds".to_string(), mocks) + }; + let probe = multi_currency_engine(&["USDC"]); + let usdc = &probe.config.currencies[0]; + let (mint, token_program) = ( + probe.mint_for(usdc).unwrap(), + probe.token_program_for(usdc).unwrap(), + ); + let distribution = probe.distribution().unwrap(); + let recipient = distribution[0].recipient; + let token_account = |state: u8| { + use base64::Engine as _; + let mut data = vec![0u8; 165]; + data[..32].copy_from_slice(mint.as_ref()); + data[32..64].copy_from_slice(recipient.as_ref()); + data[108] = state; + serde_json::json!({ + "lamports": 2_039_280, + "data": [base64::engine::general_purpose::STANDARD.encode(&data), "base64"], + "owner": pc::pubkey_string(&token_program), + "executable": false, + "rentEpoch": 0, + "space": 165, + }) + }; + let check = + |engine: X402Upto| engine.ensure_payouts_ready(&mint, &token_program, &distribution); + + let err = check(engine(answering(serde_json::Value::Null))).unwrap_err(); + assert!(err.to_string().contains("does not exist"), "{err}"); + let err = check(engine(answering(token_account(2)))).unwrap_err(); + assert!(err.to_string().contains("frozen"), "{err}"); + assert!(check(engine(RpcClient::new_mock("fails".to_string()))).is_err()); + // Positive control: an initialized account of the recipient. + check(engine(answering(token_account(1)))).expect("usable payout account"); + // The default payout to the fee payer itself (`ReceiverKeepsAll` with + // no separate receiver authorizer) needs no account up front: + // settlement creates the fee payer's own seat. + let own = engine(answering(serde_json::Value::Null)); + let to_fee_payer = [pc::Distribution { + recipient: own.fee_payer, + bps: 10_000, + }]; + own.ensure_payouts_ready(&mint, &token_program, &to_fee_payer) + .expect("the fee payer's own payout needs no account yet"); + } + + /// The engine with its RPC answering `getAccountInfo` (the payer's refund + /// account) with `refund_account`, plus `extra` mocks. + fn engine_reading( + refund_account: serde_json::Value, + extra: Vec<( + solana_rpc_client_api::request::RpcRequest, + serde_json::Value, + )>, + ) -> X402Upto { + let mut engine = multi_currency_engine(&["USDC"]); + // A mock answers each request once: queue one answer per read. + let mut mocks = solana_rpc_client::mock_sender::MocksMap::default(); + for _ in 0..8 { + mocks.insert( + solana_rpc_client_api::request::RpcRequest::GetAccountInfo, + serde_json::json!({ "context": { "slot": 1 }, "value": refund_account }), + ); + } + for (request, value) in extra { + mocks.insert(request, value); + } + engine.rpc = Arc::new(RpcClient::new_mock_with_mocks_map( + "succeeds".to_string(), + mocks, + )); + engine + } + + /// A token account of `owner` for `mint`, as `getAccountInfo` returns it. + fn token_account_json( + mint: &Pubkey, + owner: &Pubkey, + token_program: &Pubkey, + ) -> serde_json::Value { + use base64::Engine as _; + let mut data = vec![0u8; 165]; + data[..32].copy_from_slice(mint.as_ref()); + data[32..64].copy_from_slice(owner.as_ref()); + data[108] = 1; + serde_json::json!({ + "lamports": 2_039_280, + "data": [base64::engine::general_purpose::STANDARD.encode(&data), "base64"], + "owner": pc::pubkey_string(token_program), + "executable": false, + "rentEpoch": 0, + "space": 165, + }) + } + + /// A payer that closed its token account after the open would have its + /// refund forfeited to the treasury by `distribute`, so settlement only + /// seals and defers the distribute (to `distribute_sealed`). With nothing + /// to refund, or a usable account, settlement still distributes. + #[tokio::test] + async fn settlement_defers_the_distribute_of_an_unpayable_refund() { + let engine = engine_reading(serde_json::Value::Null, vec![]); let open = engine.test_open(Pubkey::new_unique(), 1_000); let program_id = pc::default_program_id(); let is_distribute = |ix: &Instruction| { ix.program_id == program_id && ix.accounts.iter().any(|meta| meta.pubkey == open.payer) }; + let is_create = |ix: &Instruction| ix.program_id == pc::associated_token_program_id(); + + for actual in [0, 400] { + let ixs = engine.settlement_instructions(&open, actual).await.unwrap(); + assert!(!ixs.iter().any(is_distribute), "actual {actual}"); + assert!(!ixs.iter().any(is_create), "actual {actual}"); + if actual > 0 { + assert!(settled_voucher_expiry(&ixs, &open, actual) > now_unix()); + } + } + // Nothing is due back at the full amount: no account is read. + let ixs = engine.settlement_instructions(&open, 1_000).await.unwrap(); + assert!(ixs.last().is_some_and(is_distribute)); + // Positive control: a usable refund account distributes at once. + let mut engine = engine_reading(serde_json::Value::Null, vec![]); + let open = engine.test_open(Pubkey::new_unique(), 1_000); + engine.rpc = engine_reading( + token_account_json(&open.mint, &open.payer, &open.token_program), + vec![], + ) + .rpc; + let ixs = engine.settlement_instructions(&open, 400).await.unwrap(); + assert!(ixs.last().is_some_and(|ix| { + ix.program_id == program_id && ix.accounts.iter().any(|meta| meta.pubkey == open.payer) + })); + assert!( + !ixs.iter() + .filter(|ix| is_create(ix)) + .any(|ix| ix.accounts[2].pubkey == open.payer), + "the payer's account is never created at the fee payer's expense" + ); + } - let full = engine - .build_settlement_instructions(&open, 400, true) - .await - .unwrap(); - assert!(full.last().is_some_and(is_distribute)); + /// `distribute_sealed` finds this server's sealed channels on chain and + /// distributes a deferred one once the grace period after its open has + /// passed, even with the payer's account still unusable; inside it, + /// nothing is sent. + #[tokio::test(flavor = "multi_thread")] + async fn distribute_sealed_ends_a_deferral_at_the_deadline() { + use base64::Engine as _; + use solana_rpc_client_api::request::RpcRequest; - let sealed_only = engine - .build_settlement_instructions(&open, 400, false) - .await - .unwrap(); - assert!(!sealed_only.iter().any(is_distribute)); + let probe = multi_currency_engine(&["USDC"]); + let usdc = &probe.config.currencies[0]; + let mint = probe.mint_for(usdc).unwrap(); + let program_id = pc::default_program_id(); + let sealed_channel = |engine: &X402Upto| { + let payer = Pubkey::new_unique(); + let authorized = Pubkey::new_unique(); + let channel = Channel { + discriminator: 1, + version: 1, + bump: 1, + status: crate::core::payment_channels::generated::types::ChannelStatus::Sealed + as u8, + salt: 7, + deposit: 1_000, + settlement: crate::core::payment_channels::generated::types::SettlementWatermarks { + settled: 400, + payout_watermark: 0, + }, + closure_started_at: 0, + payer_withdrawn_at: 0, + grace_period: 900, + distribution_hash: pc::distribution_hash(&engine.distribution().unwrap()), + payer: pc::to_address(&payer), + payee: pc::to_address(&engine.fee_payer), + authorized_signer: pc::to_address(&authorized), + mint: pc::to_address(&mint), + rent_payer: pc::to_address(&engine.fee_payer), + open_slot: 42, + }; + let (address, _) = pc::find_channel_pda( + &payer, + &engine.fee_payer, + &mint, + &authorized, + 7, + 42, + &program_id, + ); + serde_json::json!([{ + "pubkey": pc::pubkey_string(&address), + "account": { + "lamports": 2_000_000, + "data": [base64::engine::general_purpose::STANDARD + .encode(borsh::to_vec(&channel).unwrap()), "base64"], + "owner": pc::pubkey_string(&program_id), + "executable": false, + "rentEpoch": 0, + "space": pc::CHANNEL_ACCOUNT_SIZE, + } + }]) + }; + let run = |opened_at: i64| { + let probe = multi_currency_engine(&["USDC"]); + let mut engine = engine_reading(serde_json::Value::Null, vec![]); + engine.fee_payer = probe.fee_payer; + engine.config = probe.config.clone(); + let accounts = sealed_channel(&engine); + let mut mocks = std::collections::HashMap::new(); + mocks.insert( + RpcRequest::GetAccountInfo, + serde_json::json!({ "context": { "slot": 1 }, "value": null }), + ); + mocks.insert(RpcRequest::GetProgramAccounts, accounts); + mocks.insert(RpcRequest::GetBlockTime, serde_json::json!(opened_at)); + engine.rpc = Arc::new(RpcClient::new_mock_with_mocks( + "succeeds".to_string(), + mocks, + )); + async move { engine.distribute_sealed().await.unwrap() } + }; + let now = now_unix(); assert!( - sealed_only - .iter() - .all(|ix| ix.program_id != pc::associated_token_program_id()), - "no account is created at the fee payer's expense" + run(now - 899).await.is_empty(), + "still inside the grace period" ); - assert!(sealed_only.iter().any(|ix| ix.program_id == program_id)); - assert!(settled_voucher_expiry(&sealed_only, &open, 400) > now_unix()); + assert_eq!(run(now - 900).await.len(), 1, "the deadline passed"); } /// A payer-chosen split keeps the channel address (recipients are not a From 14e59ef2cdc9250c57a32ceaef2607ebd1c0080b Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 26 Oct 2026 18:14:13 -0400 Subject: [PATCH 4/8] fix(ci): clear dependencies alerts, fix CI (#399) --- harness/package.json | 4 +- harness/pnpm-lock.yaml | 754 ++++++------ harness/pnpm-workspace.yaml | 7 +- harness/test/flow-conformance.test.ts | 52 +- harness/ts-client/package-lock.json | 246 ++-- harness/ts-client/package.json | 2 +- html/package-lock.json | 254 ++-- html/package.json | 2 +- playground/pnpm-lock.yaml | 62 +- playground/pnpm-workspace.yaml | 2 + python/pyproject.toml | 4 +- python/uv.lock | 58 +- rust/crates/kit/Cargo.toml | 12 +- .../codegen/package.json | 2 +- .../codegen/pnpm-lock.yaml | 226 ++-- .../examples/playground-api/pnpm-lock.yaml | 88 +- .../playground-api/pnpm-workspace.yaml | 6 +- typescript/package.json | 4 +- typescript/packages/mpp/package.json | 4 +- typescript/packages/pay-kit/package.json | 2 +- typescript/pnpm-lock.yaml | 1067 +++++++++-------- typescript/pnpm-workspace.yaml | 21 +- 22 files changed, 1420 insertions(+), 1459 deletions(-) diff --git a/harness/package.json b/harness/package.json index 9a6d9ccb4..f0b7e172d 100644 --- a/harness/package.json +++ b/harness/package.json @@ -26,9 +26,9 @@ "ajv": "^8.17.1", "express": "^4.21.0", "smol-toml": "^1.9.1", - "tsx": "^4.19.2", + "tsx": "^4.23.15", "typescript": "^5.9.3", - "vitest": "^4.1.11", + "vitest": "^4.1.12", "yaml": "^2.8.3" } } diff --git a/harness/pnpm-lock.yaml b/harness/pnpm-lock.yaml index 1ec228cbf..360b2df62 100644 --- a/harness/pnpm-lock.yaml +++ b/harness/pnpm-lock.yaml @@ -6,7 +6,9 @@ settings: overrides: '@toon-format/toon': 2.3.1 - fast-uri: 4.1.5 + body-parser@1: 1.20.9 + esbuild: 0.28.2 + fast-uri: 4.2.3 hono: 4.13.7 ip-address: 10.7.2 nanoid@3.3.11: 3.3.18 @@ -14,8 +16,9 @@ overrides: proxy-addr: 2.0.8 qs: 6.16.0 source-map-js: 1.2.2 - vite: 8.0.16 + vite: 8.3.5 ws: 8.21.0 + zod: 4.6.7 importers: @@ -26,16 +29,16 @@ importers: version: 6.8.0(typescript@5.9.3) '@solana/mpp': specifier: file:../typescript/packages/mpp - version: file:../typescript/packages/mpp(@solana/kit@6.8.0(typescript@5.9.3))(mppx@0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.4.3)))(typescript@5.9.3) + version: file:../typescript/packages/mpp(@solana/kit@6.8.0(typescript@5.9.3))(mppx@0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)))(typescript@5.9.3) '@solana/pay-kit': specifier: file:../typescript/packages/pay-kit - version: file:../typescript/packages/pay-kit(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3))(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.4.3)) + version: file:../typescript/packages/pay-kit(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3))(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)) '@solana/surfpool': specifier: 1.4.0 version: 1.4.0 mppx: specifier: ^0.8.2 - version: 0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.4.3)) + version: 0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)) devDependencies: '@solana-program/token': specifier: ^0.11.0 @@ -56,14 +59,14 @@ importers: specifier: ^1.9.1 version: 1.9.1 tsx: - specifier: ^4.19.2 - version: 4.21.0 + specifier: ^4.23.15 + version: 4.23.15 typescript: specifier: ^5.9.3 version: 5.9.3 vitest: - specifier: ^4.1.11 - version: 4.1.11(@types/node@25.6.0)(vite@8.0.16(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)(yaml@2.8.3)) + specifier: ^4.1.12 + version: 4.1.12(@types/node@25.6.0)(vite@8.3.5(@types/node@25.6.0)(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.8.3)) yaml: specifier: ^2.8.3 version: 2.8.3 @@ -73,167 +76,158 @@ packages: '@adraffy/ens-normalize@1.11.1': resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} - '@emnapi/core@1.10.0': - resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - - '@emnapi/runtime@1.10.0': - resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - - '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - - '@esbuild/aix-ppc64@0.27.7': - resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.7': - resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.7': - resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.7': - resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.7': - resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.7': - resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.7': - resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.7': - resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.7': - resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.7': - resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.7': - resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.7': - resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.7': - resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.7': - resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.7': - resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.7': - resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.7': - resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.7': - resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.7': - resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.7': - resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.7': - resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.7': - resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.7': - resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.7': - resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.7': - resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.7': - resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -241,12 +235,6 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@napi-rs/wasm-runtime@1.1.4': - resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} - peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 - '@noble/ciphers@1.3.0': resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} @@ -263,100 +251,101 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} - '@oxc-project/types@0.133.0': - resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + '@oxc-project/types@0.155.0': + resolution: {integrity: sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==} + + '@rolldown/binding-android-arm-eabi@1.2.15': + resolution: {integrity: sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] - '@rolldown/binding-android-arm64@1.0.3': - resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} + '@rolldown/binding-android-arm64@1.2.15': + resolution: {integrity: sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.3': - resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} + '@rolldown/binding-darwin-arm64@1.2.15': + resolution: {integrity: sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.3': - resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} + '@rolldown/binding-darwin-x64@1.2.15': + resolution: {integrity: sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.3': - resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} + '@rolldown/binding-freebsd-x64@1.2.15': + resolution: {integrity: sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.3': - resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.15': + resolution: {integrity: sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.3': - resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} + '@rolldown/binding-linux-arm64-gnu@1.2.15': + resolution: {integrity: sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.3': - resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} + '@rolldown/binding-linux-arm64-musl@1.2.15': + resolution: {integrity: sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.3': - resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} + '@rolldown/binding-linux-ppc64-gnu@1.2.15': + resolution: {integrity: sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.3': - resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} + '@rolldown/binding-linux-s390x-gnu@1.2.15': + resolution: {integrity: sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.3': - resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} + '@rolldown/binding-linux-x64-gnu@1.2.15': + resolution: {integrity: sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.3': - resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} + '@rolldown/binding-linux-x64-musl@1.2.15': + resolution: {integrity: sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.3': - resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} + '@rolldown/binding-openharmony-arm64@1.2.15': + resolution: {integrity: sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.3': - resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [wasm32] - - '@rolldown/binding-win32-arm64-msvc@1.0.3': - resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} + '@rolldown/binding-win32-arm64-msvc@1.2.15': + resolution: {integrity: sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.3': - resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} + '@rolldown/binding-win32-x64-msvc@1.2.15': + resolution: {integrity: sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1422,9 +1411,6 @@ packages: resolution: {integrity: sha512-/0c72BUgzzVkVTlsw5uBn8x3waTdVJ/PZGfQ6jY1eu6K7olUPf4d9lgDPA9/0sIdsR8j7o3QIG8fOCO6ItcL7A==} engines: {node: '>=12.16'} - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} - '@types/body-parser@1.19.6': resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} @@ -1464,40 +1450,40 @@ packages: '@types/serve-static@2.2.0': resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} - '@vitest/expect@4.1.11': - resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==} + '@vitest/expect@4.1.12': + resolution: {integrity: sha512-vFlTt+YEu9WBpNjdGayNmlMVzrWPi1+sv853/7t2FU7hpO5gAFBKHzQmkCq5Xjpr+evegF2994LQT3hF3mRlqQ==} - '@vitest/mocker@4.1.11': - resolution: {integrity: sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==} + '@vitest/mocker@4.1.12': + resolution: {integrity: sha512-fKShNpKZzupWZuY0z7egydvL0sqW4INEZBEExMBMAa6izlENEVHwoXgdaTCaBZ5fwlr4xf2o1wXC83n9RpO+NA==} peerDependencies: msw: ^2.4.9 - vite: 8.0.16 + vite: 8.3.5 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@4.1.11': - resolution: {integrity: sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==} + '@vitest/pretty-format@4.1.12': + resolution: {integrity: sha512-XW9O8+Mxx4VpCtkYdMJLZQQwsVryP9wk7cPKDxtXFfwSak6yRh5+2fep/Y0XF/ElBvJHq8bcYdi6aeuai0opZA==} - '@vitest/runner@4.1.11': - resolution: {integrity: sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==} + '@vitest/runner@4.1.12': + resolution: {integrity: sha512-NKlVKCr5QnCe8jijdMnmkpHHU+WTqiLFR6G0pHji9uRjXK9xJl1k1nTw6F3pOOj2PDcsDt2GKQMI7wIsaT491w==} - '@vitest/snapshot@4.1.11': - resolution: {integrity: sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==} + '@vitest/snapshot@4.1.12': + resolution: {integrity: sha512-ko1y1Qgb/slzQ9mr+b89Cuqud8WG1TKtsPD8r7ZUBdvVOGt85Af2HwCqHujrhwJq95hs/9RM7fcAPg57o1vlzw==} - '@vitest/spy@4.1.11': - resolution: {integrity: sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==} + '@vitest/spy@4.1.12': + resolution: {integrity: sha512-RGq9x4JNGNTZHEJxvN0oSiJjeSCExm0n2gZKKJZHY9cX5AVA6M7VJILBT3ZJ/tJ/0J9uWT7fETV9/btoi//vSg==} - '@vitest/utils@4.1.11': - resolution: {integrity: sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==} + '@vitest/utils@4.1.12': + resolution: {integrity: sha512-Q3awXrwOfEV+qc3WmO5ONyE0yO7Q1gQ9/oyHxGLZ/pl7N3NO/ZztqQwKLuwMkV+CA1JYSIeO3gkHnRDIo4AVaA==} abitype@1.2.3: resolution: {integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==} peerDependencies: typescript: '>=5.0.4' - zod: ^3.22.0 || ^4.0.0 + zod: 4.6.7 peerDependenciesMeta: typescript: optional: true @@ -1508,7 +1494,7 @@ packages: resolution: {integrity: sha512-dpKH+N27vRjarMVTFFkeY445VTKftzGWpL0FiT7xmVmzQRKazZexzC5uHG0f6XKsVLAuUlndnbGau6lRejClxg==} peerDependencies: typescript: '>=5.0.4' - zod: ^3.22.0 || ^4.0.0 + zod: 4.6.7 peerDependenciesMeta: typescript: optional: true @@ -1529,8 +1515,8 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - body-parser@1.20.5: - resolution: {integrity: sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==} + body-parser@1.20.9: + resolution: {integrity: sha512-FISIQxV5u91Y9gvuFq3q/tA/qTqLJn3AhRcEvyozyhJTh5OBFFtv827AdHU7Rbyct4r+Ba1/99oFa1Y3yuFsdw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} bytes@3.1.2: @@ -1625,8 +1611,8 @@ packages: resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} engines: {node: '>= 0.4'} - esbuild@0.27.7: - resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} hasBin: true @@ -1658,8 +1644,8 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-uri@4.1.5: - resolution: {integrity: sha512-vZeoMRB4epNr7QfdHxel7te/RcX16CxyXI07JCCTFWZA2s4v1azGNESRj+2EoaHSaWFL/Z3GmKT2jF6A202jLg==} + fast-uri@4.2.3: + resolution: {integrity: sha512-I1PXwP5eAhlNlcdpjt9CgB59op2ZvZfxw+BkqGFVIUOgNpCVTcTqp3HhTX7brxj5vsip+nSY4nTvff+eIA76hg==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} @@ -1698,9 +1684,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-tsconfig@4.14.0: - resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -1736,78 +1719,78 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} magic-string@0.30.21: @@ -1919,6 +1902,10 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + postcss@8.5.23: resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} engines: {node: ^10 || ^12 || >=14} @@ -1943,11 +1930,8 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - rolldown@1.0.3: - resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} + rolldown@1.2.15: + resolution: {integrity: sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2016,10 +2000,6 @@ packages: resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} engines: {node: '>=18'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -2032,11 +2012,8 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tsx@4.21.0: - resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + tsx@4.23.15: + resolution: {integrity: sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==} engines: {node: '>=18.0.0'} hasBin: true @@ -2075,14 +2052,14 @@ packages: typescript: optional: true - vite@8.0.16: - resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} + vite@8.3.5: + resolution: {integrity: sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.1.18 - esbuild: ^0.27.0 || ^0.28.0 + '@vitejs/devtools': ^0.7.1 || ^0.8.0 + esbuild: 0.28.2 jiti: '>=1.21.0' less: ^4.0.0 sass: ^1.70.0 @@ -2118,23 +2095,23 @@ packages: yaml: optional: true - vitest@4.1.11: - resolution: {integrity: sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==} + vitest@4.1.12: + resolution: {integrity: sha512-5eWdz2yb3ajxWF3C8C4TjkXl7FGm3n2E/VlazALrQHzK7nYMSGFnCZto0bbPNl77AwkOZVLk0YnBAejUu0NiWA==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.11 - '@vitest/browser-preview': 4.1.11 - '@vitest/browser-webdriverio': 4.1.11 - '@vitest/coverage-istanbul': 4.1.11 - '@vitest/coverage-v8': 4.1.11 - '@vitest/ui': 4.1.11 + '@vitest/browser-playwright': 4.1.12 + '@vitest/browser-preview': 4.1.12 + '@vitest/browser-webdriverio': ^4.1.11 + '@vitest/coverage-istanbul': 4.1.12 + '@vitest/coverage-v8': 4.1.12 + '@vitest/ui': 4.1.12 happy-dom: '*' jsdom: '*' - vite: 8.0.16 + vite: 8.3.5 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -2181,116 +2158,93 @@ packages: engines: {node: '>= 14.6'} hasBin: true - zod@4.4.3: - resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.6.7: + resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} snapshots: '@adraffy/ens-normalize@1.11.1': {} - '@emnapi/core@1.10.0': - dependencies: - '@emnapi/wasi-threads': 1.2.1 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.10.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.2.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@esbuild/aix-ppc64@0.27.7': + '@esbuild/aix-ppc64@0.28.2': optional: true - '@esbuild/android-arm64@0.27.7': + '@esbuild/android-arm64@0.28.2': optional: true - '@esbuild/android-arm@0.27.7': + '@esbuild/android-arm@0.28.2': optional: true - '@esbuild/android-x64@0.27.7': + '@esbuild/android-x64@0.28.2': optional: true - '@esbuild/darwin-arm64@0.27.7': + '@esbuild/darwin-arm64@0.28.2': optional: true - '@esbuild/darwin-x64@0.27.7': + '@esbuild/darwin-x64@0.28.2': optional: true - '@esbuild/freebsd-arm64@0.27.7': + '@esbuild/freebsd-arm64@0.28.2': optional: true - '@esbuild/freebsd-x64@0.27.7': + '@esbuild/freebsd-x64@0.28.2': optional: true - '@esbuild/linux-arm64@0.27.7': + '@esbuild/linux-arm64@0.28.2': optional: true - '@esbuild/linux-arm@0.27.7': + '@esbuild/linux-arm@0.28.2': optional: true - '@esbuild/linux-ia32@0.27.7': + '@esbuild/linux-ia32@0.28.2': optional: true - '@esbuild/linux-loong64@0.27.7': + '@esbuild/linux-loong64@0.28.2': optional: true - '@esbuild/linux-mips64el@0.27.7': + '@esbuild/linux-mips64el@0.28.2': optional: true - '@esbuild/linux-ppc64@0.27.7': + '@esbuild/linux-ppc64@0.28.2': optional: true - '@esbuild/linux-riscv64@0.27.7': + '@esbuild/linux-riscv64@0.28.2': optional: true - '@esbuild/linux-s390x@0.27.7': + '@esbuild/linux-s390x@0.28.2': optional: true - '@esbuild/linux-x64@0.27.7': + '@esbuild/linux-x64@0.28.2': optional: true - '@esbuild/netbsd-arm64@0.27.7': + '@esbuild/netbsd-arm64@0.28.2': optional: true - '@esbuild/netbsd-x64@0.27.7': + '@esbuild/netbsd-x64@0.28.2': optional: true - '@esbuild/openbsd-arm64@0.27.7': + '@esbuild/openbsd-arm64@0.28.2': optional: true - '@esbuild/openbsd-x64@0.27.7': + '@esbuild/openbsd-x64@0.28.2': optional: true - '@esbuild/openharmony-arm64@0.27.7': + '@esbuild/openharmony-arm64@0.28.2': optional: true - '@esbuild/sunos-x64@0.27.7': + '@esbuild/sunos-x64@0.28.2': optional: true - '@esbuild/win32-arm64@0.27.7': + '@esbuild/win32-arm64@0.28.2': optional: true - '@esbuild/win32-ia32@0.27.7': + '@esbuild/win32-ia32@0.28.2': optional: true - '@esbuild/win32-x64@0.27.7': + '@esbuild/win32-x64@0.28.2': optional: true '@jridgewell/sourcemap-codec@1.5.5': {} - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.1 - optional: true - '@noble/ciphers@1.3.0': {} '@noble/curves@1.9.1': @@ -2303,55 +2257,51 @@ snapshots: '@noble/hashes@1.8.0': {} - '@oxc-project/types@0.133.0': {} + '@oxc-project/types@0.155.0': {} - '@rolldown/binding-android-arm64@1.0.3': + '@rolldown/binding-android-arm-eabi@1.2.15': optional: true - '@rolldown/binding-darwin-arm64@1.0.3': + '@rolldown/binding-android-arm64@1.2.15': optional: true - '@rolldown/binding-darwin-x64@1.0.3': + '@rolldown/binding-darwin-arm64@1.2.15': optional: true - '@rolldown/binding-freebsd-x64@1.0.3': + '@rolldown/binding-darwin-x64@1.2.15': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + '@rolldown/binding-freebsd-x64@1.2.15': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.3': + '@rolldown/binding-linux-arm-gnueabihf@1.2.15': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.3': + '@rolldown/binding-linux-arm64-gnu@1.2.15': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.3': + '@rolldown/binding-linux-arm64-musl@1.2.15': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.3': + '@rolldown/binding-linux-ppc64-gnu@1.2.15': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.3': + '@rolldown/binding-linux-s390x-gnu@1.2.15': optional: true - '@rolldown/binding-linux-x64-musl@1.0.3': + '@rolldown/binding-linux-x64-gnu@1.2.15': optional: true - '@rolldown/binding-openharmony-arm64@1.0.3': + '@rolldown/binding-linux-x64-musl@1.2.15': optional: true - '@rolldown/binding-wasm32-wasi@1.0.3': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@rolldown/binding-openharmony-arm64@1.2.15': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.3': + '@rolldown/binding-win32-arm64-msvc@1.2.15': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.3': + '@rolldown/binding-win32-x64-msvc@1.2.15': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -2832,7 +2782,7 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate - '@solana/mpp@file:../typescript/packages/mpp(@solana/kit@6.8.0(typescript@5.9.3))(mppx@0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.4.3)))(typescript@5.9.3)': + '@solana/mpp@file:../typescript/packages/mpp(@solana/kit@6.8.0(typescript@5.9.3))(mppx@0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)))(typescript@5.9.3)': dependencies: '@solana-program/compute-budget': 0.15.0(@solana/kit@6.8.0(typescript@5.9.3)) '@solana-program/system': 0.12.0(@solana/kit@6.8.0(typescript@5.9.3)) @@ -2841,8 +2791,8 @@ snapshots: '@solana/kit': 6.8.0(typescript@5.9.3) '@solana/program-client-core': 6.10.0(typescript@5.9.3) '@solana/subscriptions': 0.5.0(@solana/kit@6.8.0(typescript@5.9.3))(typescript@5.9.3) - mppx: 0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.4.3)) - zod: 4.4.3 + mppx: 0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)) + zod: 4.6.7 transitivePeerDependencies: - '@solana/sysvars' - '@solana/zk-sdk' @@ -2918,14 +2868,14 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/pay-kit@file:../typescript/packages/pay-kit(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3))(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.4.3))': + '@solana/pay-kit@file:../typescript/packages/pay-kit(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3))(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7))': dependencies: '@solana-program/compute-budget': 0.15.0(@solana/kit@6.8.0(typescript@5.9.3)) '@solana-program/token': 0.13.0(@solana/kit@6.8.0(typescript@5.9.3)) '@solana-program/token-2022': 0.11.0(@solana/kit@6.8.0(typescript@5.9.3)) '@solana/keychain-memory': 1.4.0(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3)) '@solana/kit': 6.8.0(typescript@5.9.3) - mppx: 0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.4.3)) + mppx: 0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)) transitivePeerDependencies: - '@modelcontextprotocol/sdk' - '@solana/addresses' @@ -3578,11 +3528,6 @@ snapshots: '@stripe/stripe-js@9.13.0': {} - '@tybys/wasm-util@0.10.1': - dependencies: - tslib: 2.8.1 - optional: true - '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 @@ -3633,56 +3578,56 @@ snapshots: '@types/http-errors': 2.0.5 '@types/node': 25.6.0 - '@vitest/expect@4.1.11': + '@vitest/expect@4.1.12': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.11 - '@vitest/utils': 4.1.11 + '@vitest/spy': 4.1.12 + '@vitest/utils': 4.1.12 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.11(vite@8.0.16(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/mocker@4.1.12(vite@8.3.5(@types/node@25.6.0)(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.8.3))': dependencies: - '@vitest/spy': 4.1.11 + '@vitest/spy': 4.1.12 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.16(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.3.5(@types/node@25.6.0)(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.8.3) - '@vitest/pretty-format@4.1.11': + '@vitest/pretty-format@4.1.12': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.11': + '@vitest/runner@4.1.12': dependencies: - '@vitest/utils': 4.1.11 + '@vitest/utils': 4.1.12 pathe: 2.0.3 - '@vitest/snapshot@4.1.11': + '@vitest/snapshot@4.1.12': dependencies: - '@vitest/pretty-format': 4.1.11 - '@vitest/utils': 4.1.11 + '@vitest/pretty-format': 4.1.12 + '@vitest/utils': 4.1.12 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.11': {} + '@vitest/spy@4.1.12': {} - '@vitest/utils@4.1.11': + '@vitest/utils@4.1.12': dependencies: - '@vitest/pretty-format': 4.1.11 + '@vitest/pretty-format': 4.1.12 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 - abitype@1.2.3(typescript@5.9.3)(zod@4.4.3): + abitype@1.2.3(typescript@5.9.3)(zod@4.6.7): optionalDependencies: typescript: 5.9.3 - zod: 4.4.3 + zod: 4.6.7 - abitype@1.2.4(typescript@5.9.3)(zod@4.4.3): + abitype@1.2.4(typescript@5.9.3)(zod@4.6.7): optionalDependencies: typescript: 5.9.3 - zod: 4.4.3 + zod: 4.6.7 accepts@1.3.8: dependencies: @@ -3692,7 +3637,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 4.1.5 + fast-uri: 4.2.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -3700,7 +3645,7 @@ snapshots: assertion-error@2.0.1: {} - body-parser@1.20.5: + body-parser@1.20.9: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -3779,34 +3724,34 @@ snapshots: dependencies: es-errors: 1.3.0 - esbuild@0.27.7: + esbuild@0.28.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.7 - '@esbuild/android-arm': 0.27.7 - '@esbuild/android-arm64': 0.27.7 - '@esbuild/android-x64': 0.27.7 - '@esbuild/darwin-arm64': 0.27.7 - '@esbuild/darwin-x64': 0.27.7 - '@esbuild/freebsd-arm64': 0.27.7 - '@esbuild/freebsd-x64': 0.27.7 - '@esbuild/linux-arm': 0.27.7 - '@esbuild/linux-arm64': 0.27.7 - '@esbuild/linux-ia32': 0.27.7 - '@esbuild/linux-loong64': 0.27.7 - '@esbuild/linux-mips64el': 0.27.7 - '@esbuild/linux-ppc64': 0.27.7 - '@esbuild/linux-riscv64': 0.27.7 - '@esbuild/linux-s390x': 0.27.7 - '@esbuild/linux-x64': 0.27.7 - '@esbuild/netbsd-arm64': 0.27.7 - '@esbuild/netbsd-x64': 0.27.7 - '@esbuild/openbsd-arm64': 0.27.7 - '@esbuild/openbsd-x64': 0.27.7 - '@esbuild/openharmony-arm64': 0.27.7 - '@esbuild/sunos-x64': 0.27.7 - '@esbuild/win32-arm64': 0.27.7 - '@esbuild/win32-ia32': 0.27.7 - '@esbuild/win32-x64': 0.27.7 + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 escape-html@1.0.3: {} @@ -3826,7 +3771,7 @@ snapshots: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.5 + body-parser: 1.20.9 content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.7.2 @@ -3860,11 +3805,11 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-uri@4.1.5: {} + fast-uri@4.2.3: {} - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.7 finalhandler@1.3.2: dependencies: @@ -3905,10 +3850,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.2 - get-tsconfig@4.14.0: - dependencies: - resolve-pkg-maps: 1.0.0 - gopd@1.2.0: {} has-symbols@1.1.0: {} @@ -3939,54 +3880,54 @@ snapshots: json-schema-traverse@1.0.0: {} - lightningcss-android-arm64@1.32.0: + lightningcss-android-arm64@1.33.0: optional: true - lightningcss-darwin-arm64@1.32.0: + lightningcss-darwin-arm64@1.33.0: optional: true - lightningcss-darwin-x64@1.32.0: + lightningcss-darwin-x64@1.33.0: optional: true - lightningcss-freebsd-x64@1.32.0: + lightningcss-freebsd-x64@1.33.0: optional: true - lightningcss-linux-arm-gnueabihf@1.32.0: + lightningcss-linux-arm-gnueabihf@1.33.0: optional: true - lightningcss-linux-arm64-gnu@1.32.0: + lightningcss-linux-arm64-gnu@1.33.0: optional: true - lightningcss-linux-arm64-musl@1.32.0: + lightningcss-linux-arm64-musl@1.33.0: optional: true - lightningcss-linux-x64-gnu@1.32.0: + lightningcss-linux-x64-gnu@1.33.0: optional: true - lightningcss-linux-x64-musl@1.32.0: + lightningcss-linux-x64-musl@1.33.0: optional: true - lightningcss-win32-arm64-msvc@1.32.0: + lightningcss-win32-arm64-msvc@1.33.0: optional: true - lightningcss-win32-x64-msvc@1.32.0: + lightningcss-win32-x64-msvc@1.33.0: optional: true - lightningcss@1.32.0: + lightningcss@1.33.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 magic-string@0.30.21: dependencies: @@ -4008,14 +3949,14 @@ snapshots: mime@1.6.0: {} - mppx@0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.4.3)): + mppx@0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)): dependencies: '@stripe/stripe-js': 9.13.0 eventsource-parser: 3.1.1 - ox: 0.14.33(typescript@5.9.3)(zod@4.4.3) + ox: 0.14.33(typescript@5.9.3)(zod@4.6.7) structured-headers: 2.0.3 - viem: 2.57.2(typescript@5.9.3)(zod@4.4.3) - zod: 4.4.3 + viem: 2.57.2(typescript@5.9.3)(zod@4.6.7) + zod: 4.6.7 optionalDependencies: express: 4.22.2 transitivePeerDependencies: @@ -4037,7 +3978,7 @@ snapshots: dependencies: ee-first: 1.1.1 - ox@0.14.33(typescript@5.9.3)(zod@4.4.3): + ox@0.14.33(typescript@5.9.3)(zod@4.6.7): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -4045,14 +3986,14 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.4(typescript@5.9.3)(zod@4.4.3) + abitype: 1.2.4(typescript@5.9.3)(zod@4.6.7) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - zod - ox@0.14.45(typescript@5.9.3)(zod@4.4.3): + ox@0.14.45(typescript@5.9.3)(zod@4.6.7): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -4060,7 +4001,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.4(typescript@5.9.3)(zod@4.4.3) + abitype: 1.2.4(typescript@5.9.3)(zod@4.6.7) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.3 @@ -4077,6 +4018,8 @@ snapshots: picomatch@4.0.4: {} + picomatch@4.0.7: {} + postcss@8.5.23: dependencies: nanoid: 3.3.19 @@ -4104,28 +4047,26 @@ snapshots: require-from-string@2.0.2: {} - resolve-pkg-maps@1.0.0: {} - - rolldown@1.0.3: + rolldown@1.2.15: dependencies: - '@oxc-project/types': 0.133.0 + '@oxc-project/types': 0.155.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.3 - '@rolldown/binding-darwin-arm64': 1.0.3 - '@rolldown/binding-darwin-x64': 1.0.3 - '@rolldown/binding-freebsd-x64': 1.0.3 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 - '@rolldown/binding-linux-arm64-gnu': 1.0.3 - '@rolldown/binding-linux-arm64-musl': 1.0.3 - '@rolldown/binding-linux-ppc64-gnu': 1.0.3 - '@rolldown/binding-linux-s390x-gnu': 1.0.3 - '@rolldown/binding-linux-x64-gnu': 1.0.3 - '@rolldown/binding-linux-x64-musl': 1.0.3 - '@rolldown/binding-openharmony-arm64': 1.0.3 - '@rolldown/binding-wasm32-wasi': 1.0.3 - '@rolldown/binding-win32-arm64-msvc': 1.0.3 - '@rolldown/binding-win32-x64-msvc': 1.0.3 + '@rolldown/binding-android-arm-eabi': 1.2.15 + '@rolldown/binding-android-arm64': 1.2.15 + '@rolldown/binding-darwin-arm64': 1.2.15 + '@rolldown/binding-darwin-x64': 1.2.15 + '@rolldown/binding-freebsd-x64': 1.2.15 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.15 + '@rolldown/binding-linux-arm64-gnu': 1.2.15 + '@rolldown/binding-linux-arm64-musl': 1.2.15 + '@rolldown/binding-linux-ppc64-gnu': 1.2.15 + '@rolldown/binding-linux-s390x-gnu': 1.2.15 + '@rolldown/binding-linux-x64-gnu': 1.2.15 + '@rolldown/binding-linux-x64-musl': 1.2.15 + '@rolldown/binding-openharmony-arm64': 1.2.15 + '@rolldown/binding-win32-arm64-msvc': 1.2.15 + '@rolldown/binding-win32-x64-msvc': 1.2.15 safe-buffer@5.2.1: {} @@ -4206,27 +4147,18 @@ snapshots: tinyexec@1.1.1: {} - tinyglobby@0.2.16: - dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 tinyrainbow@3.1.0: {} toidentifier@1.0.1: {} - tslib@2.8.1: - optional: true - - tsx@4.21.0: + tsx@4.23.15: dependencies: - esbuild: 0.27.7 - get-tsconfig: 4.14.0 + esbuild: 0.28.2 optionalDependencies: fsevents: 2.3.3 @@ -4247,15 +4179,15 @@ snapshots: vary@1.1.2: {} - viem@2.57.2(typescript@5.9.3)(zod@4.4.3): + viem@2.57.2(typescript@5.9.3)(zod@4.6.7): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.3(typescript@5.9.3)(zod@4.4.3) + abitype: 1.2.3(typescript@5.9.3)(zod@4.6.7) isows: 1.0.7(ws@8.21.0) - ox: 0.14.45(typescript@5.9.3)(zod@4.4.3) + ox: 0.14.45(typescript@5.9.3)(zod@4.6.7) ws: 8.21.0 optionalDependencies: typescript: 5.9.3 @@ -4264,29 +4196,29 @@ snapshots: - utf-8-validate - zod - vite@8.0.16(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)(yaml@2.8.3): + vite@8.3.5(@types/node@25.6.0)(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.8.3): dependencies: - lightningcss: 1.32.0 - picomatch: 4.0.4 + lightningcss: 1.33.0 + picomatch: 4.0.7 postcss: 8.5.23 - rolldown: 1.0.3 + rolldown: 1.2.15 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 25.6.0 - esbuild: 0.27.7 + esbuild: 0.28.2 fsevents: 2.3.3 - tsx: 4.21.0 + tsx: 4.23.15 yaml: 2.8.3 - vitest@4.1.11(@types/node@25.6.0)(vite@8.0.16(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.12(@types/node@25.6.0)(vite@8.3.5(@types/node@25.6.0)(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.8.3)): dependencies: - '@vitest/expect': 4.1.11 - '@vitest/mocker': 4.1.11(vite@8.0.16(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)(yaml@2.8.3)) - '@vitest/pretty-format': 4.1.11 - '@vitest/runner': 4.1.11 - '@vitest/snapshot': 4.1.11 - '@vitest/spy': 4.1.11 - '@vitest/utils': 4.1.11 + '@vitest/expect': 4.1.12 + '@vitest/mocker': 4.1.12(vite@8.3.5(@types/node@25.6.0)(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.12 + '@vitest/runner': 4.1.12 + '@vitest/snapshot': 4.1.12 + '@vitest/spy': 4.1.12 + '@vitest/utils': 4.1.12 es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -4296,9 +4228,9 @@ snapshots: std-env: 4.1.0 tinybench: 2.9.0 tinyexec: 1.1.1 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.3.5(@types/node@25.6.0)(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.6.0 @@ -4314,4 +4246,4 @@ snapshots: yaml@2.8.3: {} - zod@4.4.3: {} + zod@4.6.7: {} diff --git a/harness/pnpm-workspace.yaml b/harness/pnpm-workspace.yaml index ff1f4c0b7..78f140f04 100644 --- a/harness/pnpm-workspace.yaml +++ b/harness/pnpm-workspace.yaml @@ -3,7 +3,9 @@ allowBuilds: overrides: '@toon-format/toon': '2.3.1' - fast-uri: '4.1.5' + 'body-parser@1': '1.20.9' + esbuild: '0.28.2' + fast-uri: '4.2.3' hono: '4.13.7' ip-address: '10.7.2' 'nanoid@3.3.11': '3.3.18' @@ -11,5 +13,6 @@ overrides: proxy-addr: '2.0.8' qs: '6.16.0' source-map-js: '1.2.2' - vite: '8.0.16' + vite: '8.3.5' ws: '8.21.0' + zod: '4.6.7' diff --git a/harness/test/flow-conformance.test.ts b/harness/test/flow-conformance.test.ts index 37f0e653c..259efee73 100644 --- a/harness/test/flow-conformance.test.ts +++ b/harness/test/flow-conformance.test.ts @@ -17,7 +17,7 @@ // harness/expectations/typescript.toml. import { spawn, type ChildProcess } from "node:child_process"; -import { createServer } from "node:net"; +import { createServer, type Server } from "node:net"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; import { afterAll, beforeAll, describe, expect, it } from "vitest"; @@ -50,22 +50,46 @@ const flowRefs: CaseRef[] = flowCases.map((c) => ({ suite: "flow", id: c.name, c // that claims `flow` without an adapter here is a configuration error. const FLOW_ADAPTERS = { typescript: typescriptProtocolAdapter } as const; -async function getFreePort(): Promise { - return await new Promise((resolve, reject) => { +function listen(port: number): Promise { + return new Promise((resolve) => { const probe = createServer(); - probe.once("error", reject); - probe.listen(0, "127.0.0.1", () => { - const address = probe.address(); - if (address === null || typeof address === "string") { - probe.close(() => reject(new Error("could not determine a free port"))); - return; - } - const { port } = address; - probe.close(() => resolve(port)); - }); + probe.once("error", () => resolve(undefined)); + // No host: the compliance server binds the unspecified address, so probe + // the same one. + try { + probe.listen(port, () => resolve(probe)); + } catch { + // An out-of-range port throws synchronously instead of emitting "error". + resolve(undefined); + } }); } +function close(probe: Server): Promise { + return new Promise((resolve) => probe.close(() => resolve())); +} + +// The compliance server listens on `port` and on `port + 1` (the redirect +// origin, `redirect_to_port_offset` in the flow cases), so both must be free. +async function getFreePortPair(attempts = 20): Promise { + for (let i = 0; i < attempts; i++) { + const first = await listen(0); + if (!first) continue; + try { + const address = first.address(); + // 65535 has no `port + 1`; draw again rather than probe an invalid port. + if (address === null || typeof address !== "object" || address.port >= 65535) continue; + const second = await listen(address.port + 1); + if (!second) continue; + await close(second); + return address.port; + } finally { + await close(first); + } + } + throw new Error("could not find two adjacent free ports"); +} + // Mirrors flow_runner.py's wait_for_server: poll GET /free until it answers // 200 or the deadline passes. async function waitForServer(baseUrl: string, timeoutMs = 15_000): Promise { @@ -110,7 +134,7 @@ describe("mpp-protocol flow conformance (canonical flows / TypeScript runner)", }; beforeAll(async () => { - const port = await getFreePort(); + const port = await getFreePortPair(); const baseUrl = `http://127.0.0.1:${port}`; server = spawn(tsxBin, [COMPLIANCE_SERVER_PATH], { cwd: harnessRoot, diff --git a/harness/ts-client/package-lock.json b/harness/ts-client/package-lock.json index c92bd8afb..257cf9243 100644 --- a/harness/ts-client/package-lock.json +++ b/harness/ts-client/package-lock.json @@ -11,13 +11,13 @@ "@solana-program/system": "^0.7.0", "@solana-program/token": "^0.5.0", "@solana/kit": "^2.1.0", - "tsx": "^4.19.0" + "tsx": "^4.23.15" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", "cpu": [ "ppc64" ], @@ -31,9 +31,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", "cpu": [ "arm" ], @@ -47,9 +47,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", "cpu": [ "arm64" ], @@ -63,9 +63,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", "cpu": [ "x64" ], @@ -79,9 +79,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", "cpu": [ "arm64" ], @@ -95,9 +95,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", "cpu": [ "x64" ], @@ -111,9 +111,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", "cpu": [ "arm64" ], @@ -127,9 +127,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", "cpu": [ "x64" ], @@ -143,9 +143,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", "cpu": [ "arm" ], @@ -159,9 +159,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", "cpu": [ "arm64" ], @@ -175,9 +175,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", "cpu": [ "ia32" ], @@ -191,9 +191,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", "cpu": [ "loong64" ], @@ -207,9 +207,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", "cpu": [ "mips64el" ], @@ -223,9 +223,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", "cpu": [ "ppc64" ], @@ -239,9 +239,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", "cpu": [ "riscv64" ], @@ -255,9 +255,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", "cpu": [ "s390x" ], @@ -271,9 +271,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", "cpu": [ "x64" ], @@ -287,9 +287,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", "cpu": [ "arm64" ], @@ -303,9 +303,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", "cpu": [ "x64" ], @@ -319,9 +319,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", "cpu": [ "arm64" ], @@ -335,9 +335,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", "cpu": [ "x64" ], @@ -351,9 +351,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", "cpu": [ "arm64" ], @@ -367,9 +367,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", "cpu": [ "x64" ], @@ -383,9 +383,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", "cpu": [ "arm64" ], @@ -399,9 +399,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", "cpu": [ "ia32" ], @@ -415,9 +415,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ "x64" ], @@ -1134,9 +1134,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -1146,32 +1146,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" } }, "node_modules/fastestsmallesttextencoderdecoder": { @@ -1195,35 +1195,13 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/get-tsconfig": { - "version": "4.13.7", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.7.tgz", - "integrity": "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==", - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "version": "4.23.15", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.15.tgz", + "integrity": "sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==", "license": "MIT", "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" + "esbuild": "~0.28.0" }, "bin": { "tsx": "dist/cli.mjs" diff --git a/harness/ts-client/package.json b/harness/ts-client/package.json index f625f4cd6..86a353706 100644 --- a/harness/ts-client/package.json +++ b/harness/ts-client/package.json @@ -11,7 +11,7 @@ "@solana/kit": "^2.1.0", "@solana-program/system": "^0.7.0", "@solana-program/token": "^0.5.0", - "tsx": "^4.19.0" + "tsx": "^4.23.15" }, "overrides": { "ws": "8.21.0" diff --git a/html/package-lock.json b/html/package-lock.json index be25e51e8..a5ad59fc1 100644 --- a/html/package-lock.json +++ b/html/package-lock.json @@ -15,7 +15,7 @@ "devDependencies": { "@playwright/test": "^1.59.1", "esbuild": "^0.25.0", - "tsx": "^4.19.0", + "tsx": "^4.23.15", "typescript": "^5.7.0" } }, @@ -1427,19 +1427,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/get-tsconfig": { - "version": "4.13.7", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.7.tgz", - "integrity": "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, "node_modules/incur": { "version": "0.4.26", "resolved": "https://registry.npmjs.org/incur/-/incur-0.4.26.tgz", @@ -1605,16 +1592,6 @@ "node": ">=18" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, "node_modules/tokenx": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/tokenx/-/tokenx-1.6.0.tgz", @@ -1622,14 +1599,13 @@ "license": "MIT" }, "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "version": "4.23.15", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.15.tgz", + "integrity": "sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" + "esbuild": "~0.28.0" }, "bin": { "tsx": "dist/cli.mjs" @@ -1642,9 +1618,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", "cpu": [ "ppc64" ], @@ -1659,9 +1635,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", "cpu": [ "arm" ], @@ -1676,9 +1652,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", "cpu": [ "arm64" ], @@ -1693,9 +1669,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", "cpu": [ "x64" ], @@ -1710,9 +1686,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", "cpu": [ "arm64" ], @@ -1727,9 +1703,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", "cpu": [ "x64" ], @@ -1744,9 +1720,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", "cpu": [ "arm64" ], @@ -1761,9 +1737,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", "cpu": [ "x64" ], @@ -1778,9 +1754,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", "cpu": [ "arm" ], @@ -1795,9 +1771,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", "cpu": [ "arm64" ], @@ -1812,9 +1788,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", "cpu": [ "ia32" ], @@ -1829,9 +1805,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", "cpu": [ "loong64" ], @@ -1846,9 +1822,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", "cpu": [ "mips64el" ], @@ -1863,9 +1839,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", "cpu": [ "ppc64" ], @@ -1880,9 +1856,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", "cpu": [ "riscv64" ], @@ -1897,9 +1873,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", "cpu": [ "s390x" ], @@ -1914,9 +1890,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", "cpu": [ "x64" ], @@ -1931,9 +1907,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", "cpu": [ "arm64" ], @@ -1948,9 +1924,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", "cpu": [ "x64" ], @@ -1965,9 +1941,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", "cpu": [ "arm64" ], @@ -1982,9 +1958,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", "cpu": [ "x64" ], @@ -1999,9 +1975,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", "cpu": [ "arm64" ], @@ -2016,9 +1992,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", "cpu": [ "x64" ], @@ -2033,9 +2009,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", "cpu": [ "arm64" ], @@ -2050,9 +2026,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", "cpu": [ "ia32" ], @@ -2067,9 +2043,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ "x64" ], @@ -2084,9 +2060,9 @@ } }, "node_modules/tsx/node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2097,32 +2073,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" } }, "node_modules/tsx/node_modules/fsevents": { @@ -2310,9 +2286,9 @@ } }, "node_modules/zod": { - "version": "4.6.5", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz", - "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==", + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz", + "integrity": "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/html/package.json b/html/package.json index e3b17e80d..885f9d69c 100644 --- a/html/package.json +++ b/html/package.json @@ -21,7 +21,7 @@ "devDependencies": { "@playwright/test": "^1.59.1", "esbuild": "^0.25.0", - "tsx": "^4.19.0", + "tsx": "^4.23.15", "typescript": "^5.7.0" }, "overrides": { diff --git a/playground/pnpm-lock.yaml b/playground/pnpm-lock.yaml index b24fadb69..df3a28487 100644 --- a/playground/pnpm-lock.yaml +++ b/playground/pnpm-lock.yaml @@ -8,6 +8,8 @@ overrides: baseline-browser-mapping: 2.11.0 browserslist: 4.28.7 nanoid@3.3.11: 3.3.18 + vite: 6.4.5 + zod: 4.6.7 postcss: 8.5.23 react-router: 7.18.2 shell-quote: 1.11.0 @@ -52,7 +54,7 @@ importers: version: 11.11.1 mppx: specifier: ^0.8.15 - version: 0.8.19(typescript@5.9.3)(viem@2.56.3(typescript@5.9.3)(zod@4.4.3)) + version: 0.8.19(typescript@5.9.3)(viem@2.56.3(typescript@5.9.3)(zod@4.6.7)) react: specifier: ^19.1.0 version: 19.2.7 @@ -77,13 +79,13 @@ importers: version: 19.2.3(@types/react@19.2.17) '@vitejs/plugin-react': specifier: ^4.4.0 - version: 4.7.0(vite@6.4.3(@types/node@25.9.6)(tsx@4.22.4)(yaml@2.9.0)) + version: 4.7.0(vite@6.4.5(@types/node@25.9.6)(tsx@4.22.4)(yaml@2.9.0)) typescript: specifier: ^5.7.0 version: 5.9.3 vite: - specifier: ^6.0.0 - version: 6.4.3(@types/node@25.9.6)(tsx@4.22.4)(yaml@2.9.0) + specifier: 6.4.5 + version: 6.4.5(@types/node@25.9.6)(tsx@4.22.4)(yaml@2.9.0) packages: @@ -1122,13 +1124,13 @@ packages: resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + vite: 6.4.5 abitype@1.2.3: resolution: {integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==} peerDependencies: typescript: '>=5.0.4' - zod: ^3.22.0 || ^4.0.0 + zod: 4.6.7 peerDependenciesMeta: typescript: optional: true @@ -1139,7 +1141,7 @@ packages: resolution: {integrity: sha512-dpKH+N27vRjarMVTFFkeY445VTKftzGWpL0FiT7xmVmzQRKazZexzC5uHG0f6XKsVLAuUlndnbGau6lRejClxg==} peerDependencies: typescript: '>=5.0.4' - zod: ^3.22.0 || ^4.0.0 + zod: 4.6.7 peerDependenciesMeta: typescript: optional: true @@ -1755,8 +1757,8 @@ packages: typescript: optional: true - vite@6.4.3: - resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==} + vite@6.4.5: + resolution: {integrity: sha512-4enwjFfi4IwtEh0w+jPzpLVOFQiPHmmzPxcHXQOyEur47o6u0jE573DmGpjA+7irXoMLYRZD5ZaFUEneS3abPg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -1831,8 +1833,8 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - zod@4.4.3: - resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.6.7: + resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -2776,7 +2778,7 @@ snapshots: '@ungap/structured-clone@1.3.1': {} - '@vitejs/plugin-react@4.7.0(vite@6.4.3(@types/node@25.9.6)(tsx@4.22.4)(yaml@2.9.0))': + '@vitejs/plugin-react@4.7.0(vite@6.4.5(@types/node@25.9.6)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) @@ -2784,19 +2786,19 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.3(@types/node@25.9.6)(tsx@4.22.4)(yaml@2.9.0) + vite: 6.4.5(@types/node@25.9.6)(tsx@4.22.4)(yaml@2.9.0) transitivePeerDependencies: - supports-color - abitype@1.2.3(typescript@5.9.3)(zod@4.4.3): + abitype@1.2.3(typescript@5.9.3)(zod@4.6.7): optionalDependencies: typescript: 5.9.3 - zod: 4.4.3 + zod: 4.6.7 - abitype@1.2.4(typescript@5.9.3)(zod@4.4.3): + abitype@1.2.4(typescript@5.9.3)(zod@4.6.7): optionalDependencies: typescript: 5.9.3 - zod: 4.4.3 + zod: 4.6.7 ansi-regex@5.0.1: {} @@ -3374,14 +3376,14 @@ snapshots: transitivePeerDependencies: - supports-color - mppx@0.8.19(typescript@5.9.3)(viem@2.56.3(typescript@5.9.3)(zod@4.4.3)): + mppx@0.8.19(typescript@5.9.3)(viem@2.56.3(typescript@5.9.3)(zod@4.6.7)): dependencies: '@stripe/stripe-js': 9.13.0 eventsource-parser: 3.1.1 - ox: 0.14.33(typescript@5.9.3)(zod@4.4.3) + ox: 0.14.33(typescript@5.9.3)(zod@4.6.7) structured-headers: 2.0.3 - viem: 2.56.3(typescript@5.9.3)(zod@4.4.3) - zod: 4.4.3 + viem: 2.56.3(typescript@5.9.3)(zod@4.6.7) + zod: 4.6.7 transitivePeerDependencies: - typescript @@ -3391,7 +3393,7 @@ snapshots: node-releases@2.0.57: {} - ox@0.14.33(typescript@5.9.3)(zod@4.4.3): + ox@0.14.33(typescript@5.9.3)(zod@4.6.7): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -3399,14 +3401,14 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.4(typescript@5.9.3)(zod@4.4.3) + abitype: 1.2.4(typescript@5.9.3)(zod@4.6.7) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - zod - ox@0.14.44(typescript@5.9.3)(zod@4.4.3): + ox@0.14.44(typescript@5.9.3)(zod@4.6.7): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -3414,7 +3416,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.4(typescript@5.9.3)(zod@4.4.3) + abitype: 1.2.4(typescript@5.9.3)(zod@4.6.7) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.3 @@ -3681,15 +3683,15 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - viem@2.56.3(typescript@5.9.3)(zod@4.4.3): + viem@2.56.3(typescript@5.9.3)(zod@4.6.7): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.3(typescript@5.9.3)(zod@4.4.3) + abitype: 1.2.3(typescript@5.9.3)(zod@4.6.7) isows: 1.0.7(ws@8.21.0) - ox: 0.14.44(typescript@5.9.3)(zod@4.4.3) + ox: 0.14.44(typescript@5.9.3)(zod@4.6.7) ws: 8.21.0 optionalDependencies: typescript: 5.9.3 @@ -3698,7 +3700,7 @@ snapshots: - utf-8-validate - zod - vite@6.4.3(@types/node@25.9.6)(tsx@4.22.4)(yaml@2.9.0): + vite@6.4.5(@types/node@25.9.6)(tsx@4.22.4)(yaml@2.9.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.4) @@ -3739,6 +3741,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - zod@4.4.3: {} + zod@4.6.7: {} zwitch@2.0.4: {} diff --git a/playground/pnpm-workspace.yaml b/playground/pnpm-workspace.yaml index 6468983e1..5270552da 100644 --- a/playground/pnpm-workspace.yaml +++ b/playground/pnpm-workspace.yaml @@ -8,6 +8,8 @@ overrides: baseline-browser-mapping: '2.11.0' browserslist: '4.28.7' 'nanoid@3.3.11': '3.3.18' + vite: '6.4.5' + zod: '4.6.7' postcss: '8.5.23' react-router: '7.18.2' shell-quote: '1.11.0' diff --git a/python/pyproject.toml b/python/pyproject.toml index 8faf2d366..a30428783 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "solana-pay-kit" -version = "0.10.0" +version = "0.11.0" description = "Building blocks for Agentic payments (x402, MPP, AP2)" readme = "README.md" requires-python = ">=3.11" @@ -47,7 +47,7 @@ packages = ["src/solana_pay_kit"] [tool.uv] # docspec-python constrains Black to the vulnerable 23.x line even though its # formatter integration remains compatible with current Black releases. -override-dependencies = ["black>=26.3.1"] +override-dependencies = ["black>=26.10.1"] [tool.ruff] target-version = "py311" diff --git a/python/uv.lock b/python/uv.lock index 66284fb52..9e1f8314a 100644 --- a/python/uv.lock +++ b/python/uv.lock @@ -14,7 +14,7 @@ resolution-markers = [ ] [manifest] -overrides = [{ name = "black", specifier = ">=26.3.1" }] +overrides = [{ name = "black", specifier = ">=26.10.1" }] [[package]] name = "aiolimiter" @@ -93,7 +93,7 @@ wheels = [ [[package]] name = "black" -version = "26.5.1" +version = "26.10.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -103,29 +103,29 @@ dependencies = [ { name = "platformdirs" }, { name = "pytokens" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/37/5628dd55bf2b34257fc7603f0fe97c40e3aaf24265f416a9c85c95ca1436/black-26.5.1.tar.gz", hash = "sha256:dd321f668053961824bcc1be1cc1df748b2d7e4fa28086b08331e577b0100a73", size = 679439, upload-time = "2026-05-18T16:53:36.107Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/96/3c3e09f09f44a37aac36b178a279cd19aa7001bd796187a7b162a294c81f/black-26.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:96ae2c733b2aabdd9986e2c5df628ff3473676cd1c5faded1ff496cf6d74083c", size = 1970639, upload-time = "2026-05-18T17:05:11.461Z" }, - { url = "https://files.pythonhosted.org/packages/83/ea/5ad117b9ee3ecd933c712bcbae610006e5b7cc9f41c526cd7ed3b6c4124c/black-26.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0e48b87e03bf109288e55cfceadcfa15ff5470aca2851a851950ed2926f450d7", size = 1792130, upload-time = "2026-05-18T17:05:12.983Z" }, - { url = "https://files.pythonhosted.org/packages/06/3a/7c448bc623fcdfa96672531beb5a616ea5e64f6975955254d7731ffb0ad9/black-26.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5119fa92ae61f786e8c3662fd60aece1d0a2dd5cca5d0c79417a95e7a4272a59", size = 1846134, upload-time = "2026-05-18T17:05:14.506Z" }, - { url = "https://files.pythonhosted.org/packages/a1/5b/0b39b3a5917f0657ac014ad2edb58c139553a478adfe7f817abf1622ff6e/black-26.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:30d3c14661f2792e9142cce3eeeb1cbc175b3eb5f733be0c8eeb99651e52b0c3", size = 1478883, upload-time = "2026-05-18T17:05:16.542Z" }, - { url = "https://files.pythonhosted.org/packages/4c/48/dc222692e0f95030db1bbfb6c857e76858bad09058221ea7aae815255327/black-26.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:1ef92b76f7733f282fd096ea406200b5a286c42947412b0eaff3a74e3616cefe", size = 1277776, upload-time = "2026-05-18T17:05:18.029Z" }, - { url = "https://files.pythonhosted.org/packages/24/99/7744b906703228264ef73bdd534df88ec1ef3de45c4e78f6d31b9e32d0c9/black-26.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4ad6fa01f941920f54f2bbb35f3df7673428a0ef98a0b0840c2eaef3b110efa8", size = 2012518, upload-time = "2026-05-18T17:05:20.108Z" }, - { url = "https://files.pythonhosted.org/packages/b7/c0/c5a3b1636dfd09c42534f2b3cf33506814f6d3e066fb0879ffa16c1ae860/black-26.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3915f256e75a2d7cf88d8953d37f780455dc586cc72dee059c528fe77f581217", size = 1816016, upload-time = "2026-05-18T17:05:21.84Z" }, - { url = "https://files.pythonhosted.org/packages/1f/0e/36044316b65ca471d3bb6d3703fd06fb50c6b727c3562f6a5a3153634f88/black-26.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d98d4137277c75dfb898ec8d846c4fd68ba1e9cf77f95e2865c203dc18f4c3d", size = 1884150, upload-time = "2026-05-18T17:05:23.546Z" }, - { url = "https://files.pythonhosted.org/packages/b3/33/dafc5808c2af43672912111d7c3354af1615f7e2be3bed7a878461abbe4d/black-26.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:a1dca32d9f1784af512a13410ec204c6f7f0aa9797a111c42e1c03449821c264", size = 1486825, upload-time = "2026-05-18T17:05:25.004Z" }, - { url = "https://files.pythonhosted.org/packages/82/14/b965ee6ad2a311f28bdbf692def3ee9848d2ae289dab28b27657fcee3e78/black-26.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:1037d5ac7b7b310b2632ad867ec8d0e4c4819dcdb0b820f63135da746a24e418", size = 1288646, upload-time = "2026-05-18T17:05:26.477Z" }, - { url = "https://files.pythonhosted.org/packages/3f/5c/c384363980e11e25ca6b93205949bb331fbf35f4e0dbec376dfa6326cec8/black-26.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b36cf2ddf5566e205f6535f782a62194a184d33e175b64ae8c40b1737522be3", size = 2009020, upload-time = "2026-05-18T17:05:28.132Z" }, - { url = "https://files.pythonhosted.org/packages/0b/df/9f31c5e0babbfed77d505fc5d120beb98b21b33feaeded3924ea941fe360/black-26.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f7ea64ebfa01b50f693508fc39f875e264446d3b097088f84f203b9d09618a0", size = 1813335, upload-time = "2026-05-18T17:05:31.266Z" }, - { url = "https://files.pythonhosted.org/packages/fb/24/8e7b9a2fa61b0afd82209efe937557d180a1fa055bd7f6161eb9defc3719/black-26.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecb3e624844c798144e9bd986954e0adc81d8911a1f30f375e1252fe26e8c294", size = 1881614, upload-time = "2026-05-18T17:05:32.718Z" }, - { url = "https://files.pythonhosted.org/packages/49/ad/b4e0d9365ba8ac34f6bbab62a4b1b2dd5d618fac3fa1b8db968c844201b5/black-26.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:e1a26503279b6b310669fb0b219c39e4820b77e8189fe80f522bb511f247db0a", size = 1488925, upload-time = "2026-05-18T17:05:34.259Z" }, - { url = "https://files.pythonhosted.org/packages/a1/4b/652b859bf5df88a751c30451b09338f7fd26a77d1271c666992f836b7711/black-26.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c34b25da232ead53a6f335b76dbea124f4d152ad568b9080d6f944bc2b34b52", size = 1289883, upload-time = "2026-05-18T17:05:36.019Z" }, - { url = "https://files.pythonhosted.org/packages/a6/16/a8da8eb208c51c7f4ce74609a45d0dcc6d8a2141e45e81ee5289d1bb0d59/black-26.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e88976690a64b0af98312ca958415849cb42423423c5f2ee74af4b49a97a2168", size = 2004800, upload-time = "2026-05-18T17:05:38.182Z" }, - { url = "https://files.pythonhosted.org/packages/11/8a/a479296a19e383b70a725882a6cf3d786540601ff03cabbaaf1cce864c5a/black-26.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32d5ea7f6c8bdfa6e648326ebca1f02b0764e2a029edc6f8dce2627e19d468c3", size = 1815576, upload-time = "2026-05-18T17:05:40.309Z" }, - { url = "https://files.pythonhosted.org/packages/81/6b/cfaf3d39f25132c156a068f6b805576c9103a84086019507c70e1911ee7d/black-26.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea8d16dc41655aa113cd64665e7219446cd7e4ff2248d7178eaa905190c86b18", size = 1877927, upload-time = "2026-05-18T17:05:42.463Z" }, - { url = "https://files.pythonhosted.org/packages/66/76/302e313964bcff7e28df329d39f84f5270095730d85ff0acc260610a0d82/black-26.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:577f21094ea469ef92ec1adaf2c9441a226d2144d01a5be2fa823cecf6543e50", size = 1511860, upload-time = "2026-05-18T17:05:43.943Z" }, - { url = "https://files.pythonhosted.org/packages/27/4e/a3827e35e0e567f9f9ee59e2a0ab979267dca98718f25547ca8c6733afd4/black-26.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:ed1a20af114c301a0269bf01163d51dbef72737fd65f850001e7cbe7f3c7abae", size = 1316632, upload-time = "2026-05-18T17:05:45.521Z" }, - { url = "https://files.pythonhosted.org/packages/94/51/f975cae76d44274cc2868dc9040ac5d58d464784610234455b4e7b19c6ef/black-26.5.1-py3-none-any.whl", hash = "sha256:4ed7f7da04046d2e488437170797d3b4a4ad83906683bcb7dfc68b673bbce5e2", size = 213693, upload-time = "2026-05-18T16:53:33.964Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f8/65/a9611a6ec0a8c88d86e59385da02d68d9533f7e86a05913d20c67be54029/black-26.10.1.tar.gz", hash = "sha256:5f9f83beae62437e060dafd53d7f1fc327e3d3494f74d72ee5c2b73eb90fc4e7", size = 741979, upload-time = "2026-10-10T04:13:40.776Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/1e/c1d4f71299d45f4ff54c9c42ef9214d6b228223f196bc1bb2ee196aeaeee/black-26.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a0219b29cd70e49f920acb7081e6ce5025c719008447c521d0200dcad93206a", size = 2121821, upload-time = "2026-10-10T04:18:36.793Z" }, + { url = "https://files.pythonhosted.org/packages/7f/e2/43944049c0945199bbd5c8b291b85306bfd0eeccbc908bf65538a69ff1b0/black-26.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7bdade400bfe24d78a7762896acc2f9a8e1a17fb0fd0536bf6b7c7097cf3eec7", size = 1961908, upload-time = "2026-10-10T04:18:38.942Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/9616d58f69f0e4bfa89ebe8686b6ef50f4b4f0f91237ae4c76f34dabf8aa/black-26.10.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ff57f63029aa1353fa8b1b0c8971fd88a6c92dc766608d2eee33ad2deb23270e", size = 2019042, upload-time = "2026-10-10T04:18:40.612Z" }, + { url = "https://files.pythonhosted.org/packages/c5/de/0415cce69e2402a5c186cdb5462a0edd3fa44d69d1a1630e68e58daaa6a4/black-26.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:3414a0c52901964dceabd98c7c56beac0f964115a116ecedcce7247359b14017", size = 1608383, upload-time = "2026-10-10T04:18:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/a9/61/af18e716432e932f166ce9dfa419ce3f05fd5ef8c52c0510d27ae41aaa51/black-26.10.1-cp311-cp311-win_arm64.whl", hash = "sha256:1935b32f5326028019856e18cb42b4da63db23765dc84464cec723e0de478a9b", size = 1466048, upload-time = "2026-10-10T04:18:44.271Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ca/357ccdd12e8f8429539f8f52edc153de58acba84f6670ac36c254a276691/black-26.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe85fc4019bee59bc495c0f2a8ee76c5cd02c7015508d94a967ba2376f39a52c", size = 2167369, upload-time = "2026-10-10T04:18:45.948Z" }, + { url = "https://files.pythonhosted.org/packages/a5/a2/4709110a7ca326ba7b4f81a669fbebc20653c79a972b0f8de4ba5b5c5e68/black-26.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:182f6c32be38074b16d378498c498b32cb51928178ee611485344972c35ec9c6", size = 1990732, upload-time = "2026-10-10T04:18:48.252Z" }, + { url = "https://files.pythonhosted.org/packages/1e/96/9f8fa839c169d19c38ce6582d9449f2d7d70dabd313ac28f15a930260c1f/black-26.10.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b5347d760f0c02bb00dd249384cab71c3bf828b4f68d5b401eb116e0390f147d", size = 2065235, upload-time = "2026-10-10T04:18:50.064Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ee/929eaf7de6f05a3141d6df72acf9248118f49a5e48f9375be3180e9babf7/black-26.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:4d9a90516db1d99c25dbb20cc0998e0e01531dd903466c7744e56d66f864220a", size = 1621579, upload-time = "2026-10-10T04:18:51.59Z" }, + { url = "https://files.pythonhosted.org/packages/90/3a/8b6a44abf9648b087311003b91298226c1763172cd8d223ece5b7cf8f795/black-26.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:2ffbc023a12d0c729408823b8f10514490bd0baa301d0d4e21a7240249f9507f", size = 1469662, upload-time = "2026-10-10T04:18:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/99/6b/bc0d39990bd7a71457d669639fa06acf6191bec28bafe8b8103f597cce76/black-26.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b6272cfd7e1e8e271f5b0e0207259fe2834687e5cb9b5f620b34a44db9754993", size = 2153812, upload-time = "2026-10-10T04:18:55.041Z" }, + { url = "https://files.pythonhosted.org/packages/85/0e/cc83b88a6b1a51fc051aa4e24663918f0bf4fa9fca98552ee93a125a6780/black-26.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:978113a40223a6aaefc17364176a809a320e6b288683841427fff04c6d7b4130", size = 1980352, upload-time = "2026-10-10T04:18:56.849Z" }, + { url = "https://files.pythonhosted.org/packages/7b/0f/4dd24ea0ebadbe05e293c3ea7fbebd4389f50508f714640c9b309a0849d2/black-26.10.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03c0ddd93bb392e71209903a691767eb366fe1a76deb9509ccbaae9e1f14bb52", size = 2055268, upload-time = "2026-10-10T04:18:58.974Z" }, + { url = "https://files.pythonhosted.org/packages/a2/06/221f8e81891ecf5e4df9c258a11037997f1f218533ffe4fa1dc4db37f19c/black-26.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6dba8138cdc99061ef07b958ac082d2aa057b6961d1936f9717c350f02bab5f", size = 1625938, upload-time = "2026-10-10T04:19:00.65Z" }, + { url = "https://files.pythonhosted.org/packages/2b/3b/763d2dd073fc1e2cbf0fe5e584fe96913bf0d14cd725d1116f4b38453adf/black-26.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:d42dd2fac7c342ae67e64ee99c9532e20b2a84e92c79ed3317fa2ef54c801d93", size = 1470752, upload-time = "2026-10-10T04:19:03.009Z" }, + { url = "https://files.pythonhosted.org/packages/76/7b/e8d275b23f3023881c0b0d8ce3bbda0d100c79bdef87fb6518bf9e0c5040/black-26.10.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:8375962579d537364cc0efa19b1474481915d3a793f9fc0774901814c5e5b5f4", size = 2147731, upload-time = "2026-10-10T04:19:04.643Z" }, + { url = "https://files.pythonhosted.org/packages/ee/62/e44f86ee5fc7b893ee0ee935a79c785932da7758d2c339749d90a20ef213/black-26.10.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d8b3a9074a680b3c5749633714e9ae3992a1e5a23343a97ad61cd9b119b444d2", size = 1981714, upload-time = "2026-10-10T04:19:06.287Z" }, + { url = "https://files.pythonhosted.org/packages/89/2f/e12ca76edfcd037fe9e7e7635d9468d1d51255cf25a01b2f8f97a38f147d/black-26.10.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:289282aa2e09d3162312a3be1788ff21b08e9ea9cc4a81e656024728b32428fb", size = 2047807, upload-time = "2026-10-10T04:19:08.193Z" }, + { url = "https://files.pythonhosted.org/packages/c3/af/676d3c5cbb2ab0f17c8459b3ae8ea15ebdcc5a2f1c1c586228ec85b8897f/black-26.10.1-cp314-cp314-win_amd64.whl", hash = "sha256:5cd88fd7b444ca51f3fc883b6f6657ea53a258b0b2eef6d9f2dfcfa17ce0e27b", size = 1652537, upload-time = "2026-10-10T04:19:09.817Z" }, + { url = "https://files.pythonhosted.org/packages/ad/7b/860022d369fdd5fe14280b1e7109f58753c371ff91ce2311d68a056e488a/black-26.10.1-cp314-cp314-win_arm64.whl", hash = "sha256:2520037aa62f8a1454d0811b8f5c88b444445b03a4bfba480d8d220893b64c34", size = 1504226, upload-time = "2026-10-10T04:19:11.367Z" }, + { url = "https://files.pythonhosted.org/packages/b1/28/9dd29175c1db777e6189e2a0bb5f37101adf19c3e509b236c8920f778d0b/black-26.10.1-py3-none-any.whl", hash = "sha256:28842f9a8207cc1df6eb983a35a14c5a0dfcd603d214fe82d84bef552afd2e3a", size = 239267, upload-time = "2026-10-10T04:13:38.808Z" }, ] [[package]] @@ -1931,7 +1931,7 @@ gcp-kms = [ [[package]] name = "solana-pay-kit" -version = "0.10.0" +version = "0.11.0" source = { editable = "." } dependencies = [ { name = "certifi" }, @@ -2369,14 +2369,14 @@ wheels = [ [[package]] name = "werkzeug" -version = "3.1.8" +version = "3.1.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/b2/381be8cfdee792dd117872481b6e378f85c957dd7c5bca38897b08f765fd/werkzeug-3.1.8.tar.gz", hash = "sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44", size = 875852, upload-time = "2026-04-02T18:49:14.268Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/34/4dd12fc8bb7d61c91467ec3efe415ffa7d5456f799954b40c5bbaeae470e/werkzeug-3.1.9.tar.gz", hash = "sha256:55ca7c70a75689be937aa27f8ff4b018f06ff4838fc73045560bf0f5a1291060", size = 940188, upload-time = "2026-09-27T18:33:41.637Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/8c/2e650f2afeb7ee576912636c23ddb621c91ac6a98e66dc8d29c3c69446e1/werkzeug-3.1.8-py3-none-any.whl", hash = "sha256:63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50", size = 226459, upload-time = "2026-04-02T18:49:12.72Z" }, + { url = "https://files.pythonhosted.org/packages/a1/38/df03f564f43cec2684823f3cccae1a652ee7face1cbaa76fb223096e64d7/werkzeug-3.1.9-py3-none-any.whl", hash = "sha256:6392e50c78460ba618e5b21f08a71f59c99ce99cdc6cf6e3dd7e6ccca8754fab", size = 228700, upload-time = "2026-09-27T18:33:39.685Z" }, ] [[package]] diff --git a/rust/crates/kit/Cargo.toml b/rust/crates/kit/Cargo.toml index 656c3c4b6..459237ae1 100644 --- a/rust/crates/kit/Cargo.toml +++ b/rust/crates/kit/Cargo.toml @@ -193,12 +193,12 @@ async-trait = "0.1" redis = { version = "0.32.5", optional = true, features = ["tokio-rustls-comp", "connection-manager"] } # OpenTelemetry (feature `otel`) — optional. -opentelemetry = { version = "0.31", optional = true } -opentelemetry_sdk = { version = "0.31", features = ["logs"], optional = true } -opentelemetry-otlp = { version = "0.31", default-features = false, features = ["http-proto", "reqwest-blocking-client", "trace", "metrics", "logs"], optional = true } -opentelemetry-appender-tracing = { version = "0.31", optional = true } -opentelemetry-semantic-conventions = { version = "0.31", optional = true } -tracing-opentelemetry = { version = "0.32", optional = true } +opentelemetry = { version = "0.33", optional = true } +opentelemetry_sdk = { version = "0.33", features = ["logs"], optional = true } +opentelemetry-otlp = { version = "0.33", default-features = false, features = ["http-proto", "reqwest-blocking-client", "trace", "metrics", "logs"], optional = true } +opentelemetry-appender-tracing = { version = "0.33", optional = true } +opentelemetry-semantic-conventions = { version = "0.33", optional = true } +tracing-opentelemetry = { version = "0.34", optional = true } tracing-subscriber = { version = "0.3", features = ["env-filter"], optional = true } # Errors diff --git a/skills/pay-sdk-implementation/codegen/package.json b/skills/pay-sdk-implementation/codegen/package.json index 14c2a3e44..fc893c3be 100644 --- a/skills/pay-sdk-implementation/codegen/package.json +++ b/skills/pay-sdk-implementation/codegen/package.json @@ -19,7 +19,7 @@ }, "devDependencies": { "@types/node": "^22.0.0", - "tsx": "^4.20.6", + "tsx": "^4.23.15", "typescript": "^5.6.3" } } diff --git a/skills/pay-sdk-implementation/codegen/pnpm-lock.yaml b/skills/pay-sdk-implementation/codegen/pnpm-lock.yaml index d71675b0d..af250c748 100644 --- a/skills/pay-sdk-implementation/codegen/pnpm-lock.yaml +++ b/skills/pay-sdk-implementation/codegen/pnpm-lock.yaml @@ -28,8 +28,8 @@ importers: specifier: ^22.0.0 version: 22.20.5 tsx: - specifier: ^4.20.6 - version: 4.22.4 + specifier: ^4.23.15 + version: 4.23.15 typescript: specifier: ^5.6.3 version: 5.9.3 @@ -99,158 +99,158 @@ packages: '@codama/visitors@1.10.2': resolution: {integrity: sha512-DUkpq9TEuevg4mEOW9fyBJiYHGzj6ByNtgVAyLRWcUEz6Mz3Qn8+lRDpqqVyuzRbAdurf9bWsO8ln+zswPP4hg==} - '@esbuild/aix-ppc64@0.28.0': - resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.28.0': - resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.28.0': - resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.28.0': - resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.28.0': - resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.28.0': - resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.28.0': - resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.28.0': - resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.28.0': - resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.28.0': - resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.28.0': - resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.28.0': - resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.28.0': - resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.28.0': - resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.28.0': - resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.28.0': - resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.28.0': - resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.28.0': - resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.28.0': - resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.28.0': - resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.28.0': - resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.28.0': - resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.28.0': - resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.28.0': - resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.28.0': - resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.28.0': - resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -439,8 +439,8 @@ packages: resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} engines: {node: '>= 0.4'} - esbuild@0.28.0: - resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} hasBin: true @@ -531,8 +531,8 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - tsx@4.22.4: - resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} + tsx@4.23.15: + resolution: {integrity: sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==} engines: {node: '>=18.0.0'} hasBin: true @@ -679,82 +679,82 @@ snapshots: '@codama/nodes': 1.10.2 '@codama/visitors-core': 1.10.2 - '@esbuild/aix-ppc64@0.28.0': + '@esbuild/aix-ppc64@0.28.2': optional: true - '@esbuild/android-arm64@0.28.0': + '@esbuild/android-arm64@0.28.2': optional: true - '@esbuild/android-arm@0.28.0': + '@esbuild/android-arm@0.28.2': optional: true - '@esbuild/android-x64@0.28.0': + '@esbuild/android-x64@0.28.2': optional: true - '@esbuild/darwin-arm64@0.28.0': + '@esbuild/darwin-arm64@0.28.2': optional: true - '@esbuild/darwin-x64@0.28.0': + '@esbuild/darwin-x64@0.28.2': optional: true - '@esbuild/freebsd-arm64@0.28.0': + '@esbuild/freebsd-arm64@0.28.2': optional: true - '@esbuild/freebsd-x64@0.28.0': + '@esbuild/freebsd-x64@0.28.2': optional: true - '@esbuild/linux-arm64@0.28.0': + '@esbuild/linux-arm64@0.28.2': optional: true - '@esbuild/linux-arm@0.28.0': + '@esbuild/linux-arm@0.28.2': optional: true - '@esbuild/linux-ia32@0.28.0': + '@esbuild/linux-ia32@0.28.2': optional: true - '@esbuild/linux-loong64@0.28.0': + '@esbuild/linux-loong64@0.28.2': optional: true - '@esbuild/linux-mips64el@0.28.0': + '@esbuild/linux-mips64el@0.28.2': optional: true - '@esbuild/linux-ppc64@0.28.0': + '@esbuild/linux-ppc64@0.28.2': optional: true - '@esbuild/linux-riscv64@0.28.0': + '@esbuild/linux-riscv64@0.28.2': optional: true - '@esbuild/linux-s390x@0.28.0': + '@esbuild/linux-s390x@0.28.2': optional: true - '@esbuild/linux-x64@0.28.0': + '@esbuild/linux-x64@0.28.2': optional: true - '@esbuild/netbsd-arm64@0.28.0': + '@esbuild/netbsd-arm64@0.28.2': optional: true - '@esbuild/netbsd-x64@0.28.0': + '@esbuild/netbsd-x64@0.28.2': optional: true - '@esbuild/openbsd-arm64@0.28.0': + '@esbuild/openbsd-arm64@0.28.2': optional: true - '@esbuild/openbsd-x64@0.28.0': + '@esbuild/openbsd-x64@0.28.2': optional: true - '@esbuild/openharmony-arm64@0.28.0': + '@esbuild/openharmony-arm64@0.28.2': optional: true - '@esbuild/sunos-x64@0.28.0': + '@esbuild/sunos-x64@0.28.2': optional: true - '@esbuild/win32-arm64@0.28.0': + '@esbuild/win32-arm64@0.28.2': optional: true - '@esbuild/win32-ia32@0.28.0': + '@esbuild/win32-ia32@0.28.2': optional: true - '@esbuild/win32-x64@0.28.0': + '@esbuild/win32-x64@0.28.2': optional: true '@iarna/toml@2.2.5': {} @@ -918,34 +918,34 @@ snapshots: dependencies: es-errors: 1.3.0 - esbuild@0.28.0: + esbuild@0.28.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.28.0 - '@esbuild/android-arm': 0.28.0 - '@esbuild/android-arm64': 0.28.0 - '@esbuild/android-x64': 0.28.0 - '@esbuild/darwin-arm64': 0.28.0 - '@esbuild/darwin-x64': 0.28.0 - '@esbuild/freebsd-arm64': 0.28.0 - '@esbuild/freebsd-x64': 0.28.0 - '@esbuild/linux-arm': 0.28.0 - '@esbuild/linux-arm64': 0.28.0 - '@esbuild/linux-ia32': 0.28.0 - '@esbuild/linux-loong64': 0.28.0 - '@esbuild/linux-mips64el': 0.28.0 - '@esbuild/linux-ppc64': 0.28.0 - '@esbuild/linux-riscv64': 0.28.0 - '@esbuild/linux-s390x': 0.28.0 - '@esbuild/linux-x64': 0.28.0 - '@esbuild/netbsd-arm64': 0.28.0 - '@esbuild/netbsd-x64': 0.28.0 - '@esbuild/openbsd-arm64': 0.28.0 - '@esbuild/openbsd-x64': 0.28.0 - '@esbuild/openharmony-arm64': 0.28.0 - '@esbuild/sunos-x64': 0.28.0 - '@esbuild/win32-arm64': 0.28.0 - '@esbuild/win32-ia32': 0.28.0 - '@esbuild/win32-x64': 0.28.0 + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 fsevents@2.3.3: optional: true @@ -1028,9 +1028,9 @@ snapshots: sisteransi@1.0.5: {} - tsx@4.22.4: + tsx@4.23.15: dependencies: - esbuild: 0.28.0 + esbuild: 0.28.2 optionalDependencies: fsevents: 2.3.3 diff --git a/typescript/examples/playground-api/pnpm-lock.yaml b/typescript/examples/playground-api/pnpm-lock.yaml index 9d6698356..f6be46c52 100644 --- a/typescript/examples/playground-api/pnpm-lock.yaml +++ b/typescript/examples/playground-api/pnpm-lock.yaml @@ -8,8 +8,10 @@ overrides: '@hono/node-server': 1.19.15 '@modelcontextprotocol/sdk': 1.31.0 fast-uri: 4.1.5 - hono: 4.13.7 - ip-address: 10.7.2 + hono: 4.13.14 + body-parser@1: 1.20.9 + zod: 4.6.7 + ip-address: 10.7.4 proxy-addr: 2.0.8 qs: 6.16.0 ws: 8.21.0 @@ -26,10 +28,10 @@ importers: version: 6.9.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/mpp': specifier: file:../../packages/mpp - version: file:../../packages/mpp(@solana/kit@6.9.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(mppx@0.8.19(express@4.22.2)(hono@4.13.7)(typescript@5.9.3)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(typescript@5.9.3) + version: file:../../packages/mpp(@solana/kit@6.9.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(mppx@0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.6.7)))(typescript@5.9.3) '@solana/pay-kit': specifier: file:../../packages/pay-kit - version: file:../../packages/pay-kit(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3))(bufferutil@4.1.0)(express@4.22.2)(hono@4.13.7)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + version: file:../../packages/pay-kit(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3))(bufferutil@4.1.0)(express@4.22.2)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.6.7)) cors: specifier: ^2.8.5 version: 2.8.6 @@ -41,7 +43,7 @@ importers: version: 8.7.1(express@4.22.2) mppx: specifier: ^0.8.15 - version: 0.8.19(express@4.22.2)(hono@4.13.7)(typescript@5.9.3)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + version: 0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.6.7)) devDependencies: '@types/cors': specifier: ^2.8.17 @@ -1314,7 +1316,7 @@ packages: resolution: {integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==} peerDependencies: typescript: '>=5.0.4' - zod: ^3.22.0 || ^4.0.0 + zod: 4.6.7 peerDependenciesMeta: typescript: optional: true @@ -1325,7 +1327,7 @@ packages: resolution: {integrity: sha512-dpKH+N27vRjarMVTFFkeY445VTKftzGWpL0FiT7xmVmzQRKazZexzC5uHG0f6XKsVLAuUlndnbGau6lRejClxg==} peerDependencies: typescript: '>=5.0.4' - zod: ^3.22.0 || ^4.0.0 + zod: 4.6.7 peerDependenciesMeta: typescript: optional: true @@ -1339,8 +1341,8 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - body-parser@1.20.5: - resolution: {integrity: sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==} + body-parser@1.20.9: + resolution: {integrity: sha512-FISIQxV5u91Y9gvuFq3q/tA/qTqLJn3AhRcEvyozyhJTh5OBFFtv827AdHU7Rbyct4r+Ba1/99oFa1Y3yuFsdw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} bufferutil@4.1.0: @@ -1507,10 +1509,6 @@ packages: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} - hono@4.13.7: - resolution: {integrity: sha512-c8/gF9ac8Y78/agExVocyLevgR+JlpNB444Py0FSX8pJoPdYUfUzRcXtYEYGwt6l19qIlVZPN5Mfsw9jFShmQQ==} - engines: {node: '>=16.9.0'} - http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -1522,8 +1520,8 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ip-address@10.7.2: - resolution: {integrity: sha512-7H/2gFSIitxc0hG3nOI1glS8QLo/EHBFFLk8vEUjXY/xu0AdL8jZ9U1IzO2PUm0d2D/ofQcAifb0g6OBkt8U7w==} + ip-address@10.7.4: + resolution: {integrity: sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==} engines: {node: '>= 12'} ipaddr.js@1.9.1: @@ -1570,7 +1568,7 @@ packages: '@modelcontextprotocol/sdk': 1.31.0 elysia: '>=1' express: '>=5' - hono: 4.13.7 + hono: 4.13.14 viem: '>=2.54.0' peerDependenciesMeta: '@modelcontextprotocol/sdk': @@ -1748,8 +1746,8 @@ packages: utf-8-validate: optional: true - zod@4.4.3: - resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.6.7: + resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} snapshots: @@ -2329,7 +2327,7 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate - '@solana/mpp@file:../../packages/mpp(@solana/kit@6.9.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(mppx@0.8.19(express@4.22.2)(hono@4.13.7)(typescript@5.9.3)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(typescript@5.9.3)': + '@solana/mpp@file:../../packages/mpp(@solana/kit@6.9.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(mppx@0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.6.7)))(typescript@5.9.3)': dependencies: '@solana-program/compute-budget': 0.15.0(@solana/kit@6.9.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) '@solana-program/system': 0.12.2(@solana/kit@6.9.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) @@ -2338,8 +2336,8 @@ snapshots: '@solana/kit': 6.9.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/program-client-core': 6.10.0(typescript@5.9.3) '@solana/subscriptions': 0.5.0(@solana/kit@6.9.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(typescript@5.9.3) - mppx: 0.8.19(express@4.22.2)(hono@4.13.7)(typescript@5.9.3)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) - zod: 4.4.3 + mppx: 0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.6.7)) + zod: 4.6.7 transitivePeerDependencies: - '@solana/sysvars' - '@solana/zk-sdk' @@ -2415,14 +2413,14 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/pay-kit@file:../../packages/pay-kit(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3))(bufferutil@4.1.0)(express@4.22.2)(hono@4.13.7)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': + '@solana/pay-kit@file:../../packages/pay-kit(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3))(bufferutil@4.1.0)(express@4.22.2)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.6.7))': dependencies: '@solana-program/compute-budget': 0.15.0(@solana/kit@6.9.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) '@solana-program/token': 0.13.0(@solana/kit@6.9.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) '@solana-program/token-2022': 0.11.0(@solana/kit@6.9.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) '@solana/keychain-memory': 1.3.0(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3)) '@solana/kit': 6.9.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - mppx: 0.8.19(express@4.22.2)(hono@4.13.7)(typescript@5.9.3)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + mppx: 0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.6.7)) transitivePeerDependencies: - '@modelcontextprotocol/sdk' - '@solana/addresses' @@ -3104,15 +3102,15 @@ snapshots: '@types/http-errors': 2.0.5 '@types/node': 25.9.3 - abitype@1.2.3(typescript@5.9.3)(zod@4.4.3): + abitype@1.2.3(typescript@5.9.3)(zod@4.6.7): optionalDependencies: typescript: 5.9.3 - zod: 4.4.3 + zod: 4.6.7 - abitype@1.2.4(typescript@5.9.3)(zod@4.4.3): + abitype@1.2.4(typescript@5.9.3)(zod@4.6.7): optionalDependencies: typescript: 5.9.3 - zod: 4.4.3 + zod: 4.6.7 accepts@1.3.8: dependencies: @@ -3121,7 +3119,7 @@ snapshots: array-flatten@1.1.1: {} - body-parser@1.20.5: + body-parser@1.20.9: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -3247,7 +3245,7 @@ snapshots: dependencies: debug: 4.4.3 express: 4.22.2 - ip-address: 10.7.2 + ip-address: 10.7.4 transitivePeerDependencies: - supports-color @@ -3255,7 +3253,7 @@ snapshots: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.5 + body-parser: 1.20.9 content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.7.2 @@ -3334,9 +3332,6 @@ snapshots: dependencies: function-bind: 1.1.2 - hono@4.13.7: - optional: true - http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -3351,7 +3346,7 @@ snapshots: inherits@2.0.4: {} - ip-address@10.7.2: {} + ip-address@10.7.4: {} ipaddr.js@1.9.1: {} @@ -3375,17 +3370,16 @@ snapshots: mime@1.6.0: {} - mppx@0.8.19(express@4.22.2)(hono@4.13.7)(typescript@5.9.3)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)): + mppx@0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.6.7)): dependencies: '@stripe/stripe-js': 9.13.0 eventsource-parser: 3.1.1 - ox: 0.14.33(typescript@5.9.3)(zod@4.4.3) + ox: 0.14.33(typescript@5.9.3)(zod@4.6.7) structured-headers: 2.0.3 - viem: 2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) - zod: 4.4.3 + viem: 2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.6.7) + zod: 4.6.7 optionalDependencies: express: 4.22.2 - hono: 4.13.7 transitivePeerDependencies: - typescript @@ -3406,7 +3400,7 @@ snapshots: dependencies: ee-first: 1.1.1 - ox@0.14.33(typescript@5.9.3)(zod@4.4.3): + ox@0.14.33(typescript@5.9.3)(zod@4.6.7): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -3414,14 +3408,14 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.4(typescript@5.9.3)(zod@4.4.3) + abitype: 1.2.4(typescript@5.9.3)(zod@4.6.7) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - zod - ox@0.14.44(typescript@5.9.3)(zod@4.4.3): + ox@0.14.44(typescript@5.9.3)(zod@4.6.7): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -3429,7 +3423,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.4(typescript@5.9.3)(zod@4.4.3) + abitype: 1.2.4(typescript@5.9.3)(zod@4.6.7) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.3 @@ -3554,15 +3548,15 @@ snapshots: vary@1.1.2: {} - viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3): + viem@2.56.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.6.7): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.3(typescript@5.9.3)(zod@4.4.3) + abitype: 1.2.3(typescript@5.9.3)(zod@4.6.7) isows: 1.0.7(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - ox: 0.14.44(typescript@5.9.3)(zod@4.4.3) + ox: 0.14.44(typescript@5.9.3)(zod@4.6.7) ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.9.3 @@ -3576,4 +3570,4 @@ snapshots: bufferutil: 4.1.0 utf-8-validate: 5.0.10 - zod@4.4.3: {} + zod@4.6.7: {} diff --git a/typescript/examples/playground-api/pnpm-workspace.yaml b/typescript/examples/playground-api/pnpm-workspace.yaml index 0678df252..fcb412b80 100644 --- a/typescript/examples/playground-api/pnpm-workspace.yaml +++ b/typescript/examples/playground-api/pnpm-workspace.yaml @@ -9,8 +9,10 @@ overrides: '@hono/node-server': '1.19.15' '@modelcontextprotocol/sdk': '1.31.0' fast-uri: '4.1.5' - hono: '4.13.7' - ip-address: '10.7.2' + hono: '4.13.14' + 'body-parser@1': '1.20.9' + zod: '4.6.7' + ip-address: '10.7.4' proxy-addr: '2.0.8' qs: '6.16.0' ws: '8.21.0' diff --git a/typescript/package.json b/typescript/package.json index 7bb687118..21ce36d1c 100644 --- a/typescript/package.json +++ b/typescript/package.json @@ -27,12 +27,12 @@ "@solana/prettier-config-solana": "^0.0.6", "@typescript-eslint/eslint-plugin": "^8.57.1", "@typescript-eslint/parser": "^8.57.1", - "@vitest/coverage-v8": "4.1.11", + "@vitest/coverage-v8": "4.1.12", "eslint": "^9.39.4", "prettier": "^3.8.1", "typedoc": "^0.28.0", "typedoc-plugin-markdown": "^4.12.0", "typescript": "^5.7.0", - "vitest": "4.1.11" + "vitest": "4.1.12" } } diff --git a/typescript/packages/mpp/package.json b/typescript/packages/mpp/package.json index dbbca2ce3..060ce8ee9 100644 --- a/typescript/packages/mpp/package.json +++ b/typescript/packages/mpp/package.json @@ -1,6 +1,6 @@ { "name": "@solana/mpp", - "version": "0.11.0", + "version": "0.11.1", "description": "Solana payment method for the MPP protocol", "repository": { "type": "git", @@ -37,7 +37,7 @@ "@solana/addresses": "^6.10.0", "@solana/program-client-core": "^6.10.0", "@solana/subscriptions": "^0.5.0", - "zod": "^4.4.3" + "zod": "^4.6.6" }, "peerDependencies": { "@solana/kit": ">=6.10.0", diff --git a/typescript/packages/pay-kit/package.json b/typescript/packages/pay-kit/package.json index 57ff0bfd7..cd6906fd4 100644 --- a/typescript/packages/pay-kit/package.json +++ b/typescript/packages/pay-kit/package.json @@ -1,6 +1,6 @@ { "name": "@solana/pay-kit", - "version": "0.13.1", + "version": "0.14.0", "description": "Building blocks for Agentic payments (x402, MPP, AP2)", "repository": { "type": "git", diff --git a/typescript/pnpm-lock.yaml b/typescript/pnpm-lock.yaml index e46c3e554..e05817b61 100644 --- a/typescript/pnpm-lock.yaml +++ b/typescript/pnpm-lock.yaml @@ -16,12 +16,14 @@ overrides: brace-expansion@5.0.4: 5.0.12 brace-expansion@5.0.6: 5.0.12 linkify-it: 5.0.2 - markdown-it: 14.3.1 + markdown-it: '>=14.3.3 <15' nanoid@3.3.11: 3.3.18 picomatch@2.3.1: 2.3.2 postcss: 8.5.23 source-map-js: 1.2.2 - vite: 8.0.16 + vite: '>=8.1.6 <9' + esbuild: '>=0.28.1 <0.29' + '@babel/core': '>=7.29.6 <8' '@modelcontextprotocol/sdk': '>=1.31.0' fast-uri: '>=4.1.5' hono: '>=4.13.11' @@ -30,7 +32,8 @@ overrides: path-to-regexp: '>=8.4.0' qs: '>=6.16.0' yaml: '>=2.8.3' - body-parser: '>=2.3.0' + body-parser: '>=2.4.0' + zod: '>=4.6.6 <5' proxy-addr: '>=2.0.8' '@toon-format/toon': 2.3.1 @@ -51,8 +54,8 @@ importers: specifier: ^8.57.1 version: 8.57.1(eslint@9.39.4)(typescript@5.9.3) '@vitest/coverage-v8': - specifier: 4.1.11 - version: 4.1.11(vitest@4.1.11) + specifier: 4.1.12 + version: 4.1.12(vitest@4.1.12) eslint: specifier: ^9.39.4 version: 9.39.4 @@ -69,8 +72,8 @@ importers: specifier: ^5.7.0 version: 5.9.3 vitest: - specifier: 4.1.11 - version: 4.1.11(@types/node@25.5.0)(@vitest/coverage-v8@4.1.11)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)(yaml@2.9.0)) + specifier: 4.1.12 + version: 4.1.12(@types/node@25.5.0)(@vitest/coverage-v8@4.1.12)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.2)(tsx@4.21.0)(yaml@2.9.0)) packages/mpp: dependencies: @@ -93,8 +96,8 @@ importers: specifier: ^0.5.0 version: 0.5.0(@solana/kit@6.10.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6))(@solana/sysvars@7.1.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) zod: - specifier: ^4.4.3 - version: 4.4.3 + specifier: '>=4.6.6 <5' + version: 4.6.7 devDependencies: '@solana/kit': specifier: ^6.10.0 @@ -107,7 +110,7 @@ importers: version: 25.5.0 mppx: specifier: ^0.8.15 - version: 0.8.15(express@5.2.1)(typescript@5.9.3)(viem@2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.4.3)) + version: 0.8.15(express@5.2.1)(typescript@5.9.3)(viem@2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.6.7)) surfpool-sdk: specifier: ^1.2.0 version: 1.2.0 @@ -134,7 +137,7 @@ importers: version: 6.10.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) mppx: specifier: '>=0.8.15' - version: 0.8.15(express@5.2.1)(typescript@5.9.3)(viem@2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.4.3)) + version: 0.8.15(express@5.2.1)(typescript@5.9.3)(viem@2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.6.7)) devDependencies: '@solana/mpp': specifier: workspace:^ @@ -161,35 +164,43 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} '@babel/generator@7.29.1': resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': '>=7.29.6 <8' '@babel/helper-plugin-utils@7.28.6': resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} @@ -199,18 +210,31 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.11': + resolution: {integrity: sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.2': - resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + '@babel/helpers@7.29.10': + resolution: {integrity: sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==} engines: {node: '>=6.9.0'} + '@babel/parser@7.29.11': + resolution: {integrity: sha512-OZ6+oaK7GMyg3IfCpj8JOmn8n+w2rJbDT0LLfVDTLb1ZFeKDh3AiNELgCMUw175IJHSkLl74hG0M0VLsvx+gag==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/parser@7.29.2': resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} engines: {node: '>=6.0.0'} @@ -219,106 +243,110 @@ packages: '@babel/plugin-syntax-async-generators@7.8.4': resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-bigint@7.8.3': resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-class-properties@7.12.13': resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-class-static-block@7.14.5': resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-import-attributes@7.28.6': resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-import-meta@7.10.4': resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-json-strings@7.8.3': resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-jsx@7.28.6': resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-logical-assignment-operators@7.10.4': resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-numeric-separator@7.10.4': resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-object-rest-spread@7.8.3': resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-optional-catch-binding@7.8.3': resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-optional-chaining@7.8.3': resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-private-property-in-object@7.14.5': resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-top-level-await@7.14.5': resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' '@babel/plugin-syntax-typescript@7.28.6': resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': '>=7.29.6 <8' - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + '@babel/traverse@7.29.10': + resolution: {integrity: sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==} engines: {node: '>=6.9.0'} '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.11': + resolution: {integrity: sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -338,158 +366,158 @@ packages: '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@esbuild/aix-ppc64@0.27.4': - resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.4': - resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.4': - resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.4': - resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.4': - resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.4': - resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.4': - resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.4': - resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.4': - resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.4': - resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.4': - resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.4': - resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.4': - resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.4': - resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.4': - resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.4': - resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.4': - resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.4': - resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.4': - resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.4': - resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.4': - resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.4': - resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.4': - resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.4': - resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.4': - resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.4': - resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -675,13 +703,6 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@napi-rs/wasm-runtime@1.2.4': - resolution: {integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==} - engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} - peerDependencies: - '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 - '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 - '@noble/ciphers@1.3.0': resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} @@ -710,8 +731,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/types@0.133.0': - resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + '@oxc-project/types@0.155.0': + resolution: {integrity: sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -721,97 +742,98 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@rolldown/binding-android-arm64@1.0.3': - resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} + '@rolldown/binding-android-arm-eabi@1.2.15': + resolution: {integrity: sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@rolldown/binding-android-arm64@1.2.15': + resolution: {integrity: sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.3': - resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} + '@rolldown/binding-darwin-arm64@1.2.15': + resolution: {integrity: sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.3': - resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} + '@rolldown/binding-darwin-x64@1.2.15': + resolution: {integrity: sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.3': - resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} + '@rolldown/binding-freebsd-x64@1.2.15': + resolution: {integrity: sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.3': - resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.15': + resolution: {integrity: sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.3': - resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} + '@rolldown/binding-linux-arm64-gnu@1.2.15': + resolution: {integrity: sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.3': - resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} + '@rolldown/binding-linux-arm64-musl@1.2.15': + resolution: {integrity: sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.3': - resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} + '@rolldown/binding-linux-ppc64-gnu@1.2.15': + resolution: {integrity: sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.3': - resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} + '@rolldown/binding-linux-s390x-gnu@1.2.15': + resolution: {integrity: sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.3': - resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} + '@rolldown/binding-linux-x64-gnu@1.2.15': + resolution: {integrity: sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.3': - resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} + '@rolldown/binding-linux-x64-musl@1.2.15': + resolution: {integrity: sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.3': - resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} + '@rolldown/binding-openharmony-arm64@1.2.15': + resolution: {integrity: sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.3': - resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [wasm32] - - '@rolldown/binding-win32-arm64-msvc@1.0.3': - resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} + '@rolldown/binding-win32-arm64-msvc@1.2.15': + resolution: {integrity: sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.3': - resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} + '@rolldown/binding-win32-x64-msvc@1.2.15': + resolution: {integrity: sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -2239,43 +2261,43 @@ packages: cpu: [x64] os: [win32] - '@vitest/coverage-v8@4.1.11': - resolution: {integrity: sha512-8MVGEFnJIcdGjcbfKmeq8z0pZHH0JlVtoVZH9Q/qwUp6wyFnEJUBMrw9DCaj+ra3vShGmhavjalMIhPNxZAUcw==} + '@vitest/coverage-v8@4.1.12': + resolution: {integrity: sha512-6S7/iVknKglLAxMFxQGNppBI0iqJS2NgM6FBxavitj7KaDq/vywOWGf6dGu7F2L1Qy0G6S3uTp7aGshHrzK8JA==} peerDependencies: - '@vitest/browser': 4.1.11 - vitest: 4.1.11 + '@vitest/browser': 4.1.12 + vitest: 4.1.12 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.1.11': - resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==} + '@vitest/expect@4.1.12': + resolution: {integrity: sha512-vFlTt+YEu9WBpNjdGayNmlMVzrWPi1+sv853/7t2FU7hpO5gAFBKHzQmkCq5Xjpr+evegF2994LQT3hF3mRlqQ==} - '@vitest/mocker@4.1.11': - resolution: {integrity: sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==} + '@vitest/mocker@4.1.12': + resolution: {integrity: sha512-fKShNpKZzupWZuY0z7egydvL0sqW4INEZBEExMBMAa6izlENEVHwoXgdaTCaBZ5fwlr4xf2o1wXC83n9RpO+NA==} peerDependencies: msw: ^2.4.9 - vite: 8.0.16 + vite: '>=8.1.6 <9' peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@4.1.11': - resolution: {integrity: sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==} + '@vitest/pretty-format@4.1.12': + resolution: {integrity: sha512-XW9O8+Mxx4VpCtkYdMJLZQQwsVryP9wk7cPKDxtXFfwSak6yRh5+2fep/Y0XF/ElBvJHq8bcYdi6aeuai0opZA==} - '@vitest/runner@4.1.11': - resolution: {integrity: sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==} + '@vitest/runner@4.1.12': + resolution: {integrity: sha512-NKlVKCr5QnCe8jijdMnmkpHHU+WTqiLFR6G0pHji9uRjXK9xJl1k1nTw6F3pOOj2PDcsDt2GKQMI7wIsaT491w==} - '@vitest/snapshot@4.1.11': - resolution: {integrity: sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==} + '@vitest/snapshot@4.1.12': + resolution: {integrity: sha512-ko1y1Qgb/slzQ9mr+b89Cuqud8WG1TKtsPD8r7ZUBdvVOGt85Af2HwCqHujrhwJq95hs/9RM7fcAPg57o1vlzw==} - '@vitest/spy@4.1.11': - resolution: {integrity: sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==} + '@vitest/spy@4.1.12': + resolution: {integrity: sha512-RGq9x4JNGNTZHEJxvN0oSiJjeSCExm0n2gZKKJZHY9cX5AVA6M7VJILBT3ZJ/tJ/0J9uWT7fETV9/btoi//vSg==} - '@vitest/utils@4.1.11': - resolution: {integrity: sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==} + '@vitest/utils@4.1.12': + resolution: {integrity: sha512-Q3awXrwOfEV+qc3WmO5ONyE0yO7Q1gQ9/oyHxGLZ/pl7N3NO/ZztqQwKLuwMkV+CA1JYSIeO3gkHnRDIo4AVaA==} '@x402/core@file:.x402-vendor/x402-core-2.26.0.tgz': resolution: {integrity: sha512-ZbdBfsnze0M4GOx1vnNsPp37qz6UtzLtLVEmEmlJJeiUueVPnm5nCiGd8j8pJWP+UH004IpMmHo/j63YKKlYuQ==, tarball: file:.x402-vendor/x402-core-2.26.0.tgz} @@ -2291,7 +2313,7 @@ packages: resolution: {integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==} peerDependencies: typescript: '>=5.0.4' - zod: ^3.22.0 || ^4.0.0 + zod: '>=4.6.6 <5' peerDependenciesMeta: typescript: optional: true @@ -2369,7 +2391,7 @@ packages: resolution: {integrity: sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.11.0 || ^8.0.0-0 + '@babel/core': '>=7.29.6 <8' babel-plugin-istanbul@7.0.1: resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} @@ -2382,13 +2404,13 @@ packages: babel-preset-current-node-syntax@1.2.0: resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: - '@babel/core': ^7.0.0 || ^8.0.0-0 + '@babel/core': '>=7.29.6 <8' babel-preset-jest@30.3.0: resolution: {integrity: sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.11.0 || ^8.0.0-beta.1 + '@babel/core': '>=7.29.6 <8' balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2402,8 +2424,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - body-parser@2.3.0: - resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + body-parser@2.4.0: + resolution: {integrity: sha512-Ifk1KcLrxaGt1occQagQNFNNOqRt1LFuehEnHHzB8Z6cRgIxRU1TBaiIsUiCdA+gy5PL7Y1IX31DNKkRmxtXjQ==} engines: {node: '>=18'} brace-expansion@1.1.21: @@ -2439,7 +2461,7 @@ packages: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: - esbuild: '>=0.18' + esbuild: '>=0.28.1 <0.29' bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} @@ -2547,8 +2569,8 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - content-type@2.0.0: - resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} engines: {node: '>=18'} convert-source-map@2.0.0: @@ -2655,8 +2677,8 @@ packages: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - esbuild@0.27.4: - resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} hasBin: true @@ -2987,8 +3009,8 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} engines: {node: '>=0.10.0'} ignore@5.3.2: @@ -3267,78 +3289,78 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} lilconfig@3.1.3: @@ -3388,8 +3410,8 @@ packages: makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - markdown-it@14.3.1: - resolution: {integrity: sha512-4Ej49aYTDFIQ+uBkfX8GBvJGccoARxxPep+7aWTs55ozbjQJpW9M26Fe53vnGgvLeVzva/amzjQQaQu9w0vMhA==} + markdown-it@14.3.3: + resolution: {integrity: sha512-L//tDAkjTjJCU6pBUSBTgs3Kg4InVaZuUZog/b6V12UKhcDQ7S78877ibbCanRExwPuYP1CZD7Gd2dxSy1GXRg==} hasBin: true math-intrinsics@1.1.0: @@ -3733,8 +3755,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rolldown@1.0.3: - resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} + rolldown@1.2.15: + resolution: {integrity: sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -4097,14 +4119,14 @@ packages: typescript: optional: true - vite@8.0.16: - resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} + vite@8.3.5: + resolution: {integrity: sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.1.18 - esbuild: ^0.27.0 || ^0.28.0 + '@vitejs/devtools': ^0.7.1 || ^0.8.0 + esbuild: '>=0.28.1 <0.29' jiti: '>=1.21.0' less: ^4.0.0 sass: ^1.70.0 @@ -4140,23 +4162,23 @@ packages: yaml: optional: true - vitest@4.1.11: - resolution: {integrity: sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==} + vitest@4.1.12: + resolution: {integrity: sha512-5eWdz2yb3ajxWF3C8C4TjkXl7FGm3n2E/VlazALrQHzK7nYMSGFnCZto0bbPNl77AwkOZVLk0YnBAejUu0NiWA==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.11 - '@vitest/browser-preview': 4.1.11 - '@vitest/browser-webdriverio': 4.1.11 - '@vitest/coverage-istanbul': 4.1.11 - '@vitest/coverage-v8': 4.1.11 - '@vitest/ui': 4.1.11 + '@vitest/browser-playwright': 4.1.12 + '@vitest/browser-preview': 4.1.12 + '@vitest/browser-webdriverio': ^4.1.11 + '@vitest/coverage-istanbul': 4.1.12 + '@vitest/coverage-v8': 4.1.12 + '@vitest/ui': 4.1.12 happy-dom: '*' jsdom: '*' - vite: 8.0.16 + vite: '>=8.1.6 <9' peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -4253,13 +4275,10 @@ packages: resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} engines: {node: '>=18.0.0'} peerDependencies: - zod: ^3.25.0 || ^4.0.0 + zod: '>=4.6.6 <5' - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - - zod@4.4.3: - resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.6.7: + resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} snapshots: @@ -4271,19 +4290,25 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.0': {} + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 - '@babel/core@7.29.0': + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.2 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.10 + '@babel/parser': 7.29.11 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.10 + '@babel/types': 7.29.11 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -4301,29 +4326,37 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.28.6': + '@babel/generator@7.29.8': dependencies: - '@babel/compat-data': 7.29.0 - '@babel/helper-validator-option': 7.27.1 + '@babel/parser': 7.29.11 + '@babel/types': 7.29.11 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 browserslist: 4.28.7 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@7.29.7': {} - '@babel/helper-module-imports@7.28.6': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.10 + '@babel/types': 7.29.11 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.10 transitivePeerDependencies: - supports-color @@ -4331,118 +4364,126 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.11': {} + '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helpers@7.29.2': + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.10': dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/types': 7.29.11 + + '@babel/parser@7.29.11': + dependencies: + '@babel/types': 7.29.11 '@babel/parser@7.29.2': dependencies: '@babel/types': 7.29.0 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/template@7.28.6': + '@babel/template@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.11 + '@babel/types': 7.29.11 - '@babel/traverse@7.29.0': + '@babel/traverse@7.29.10': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.2 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.11 + '@babel/template': 7.29.7 + '@babel/types': 7.29.11 debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -4452,6 +4493,11 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.11': + dependencies: + '@babel/helper-string-parser': 7.29.11 + '@babel/helper-validator-identifier': 7.29.7 + '@bcoe/v8-coverage@0.2.3': {} '@bcoe/v8-coverage@1.0.2': {} @@ -4474,82 +4520,82 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.27.4': + '@esbuild/aix-ppc64@0.28.2': optional: true - '@esbuild/android-arm64@0.27.4': + '@esbuild/android-arm64@0.28.2': optional: true - '@esbuild/android-arm@0.27.4': + '@esbuild/android-arm@0.28.2': optional: true - '@esbuild/android-x64@0.27.4': + '@esbuild/android-x64@0.28.2': optional: true - '@esbuild/darwin-arm64@0.27.4': + '@esbuild/darwin-arm64@0.28.2': optional: true - '@esbuild/darwin-x64@0.27.4': + '@esbuild/darwin-x64@0.28.2': optional: true - '@esbuild/freebsd-arm64@0.27.4': + '@esbuild/freebsd-arm64@0.28.2': optional: true - '@esbuild/freebsd-x64@0.27.4': + '@esbuild/freebsd-x64@0.28.2': optional: true - '@esbuild/linux-arm64@0.27.4': + '@esbuild/linux-arm64@0.28.2': optional: true - '@esbuild/linux-arm@0.27.4': + '@esbuild/linux-arm@0.28.2': optional: true - '@esbuild/linux-ia32@0.27.4': + '@esbuild/linux-ia32@0.28.2': optional: true - '@esbuild/linux-loong64@0.27.4': + '@esbuild/linux-loong64@0.28.2': optional: true - '@esbuild/linux-mips64el@0.27.4': + '@esbuild/linux-mips64el@0.28.2': optional: true - '@esbuild/linux-ppc64@0.27.4': + '@esbuild/linux-ppc64@0.28.2': optional: true - '@esbuild/linux-riscv64@0.27.4': + '@esbuild/linux-riscv64@0.28.2': optional: true - '@esbuild/linux-s390x@0.27.4': + '@esbuild/linux-s390x@0.28.2': optional: true - '@esbuild/linux-x64@0.27.4': + '@esbuild/linux-x64@0.28.2': optional: true - '@esbuild/netbsd-arm64@0.27.4': + '@esbuild/netbsd-arm64@0.28.2': optional: true - '@esbuild/netbsd-x64@0.27.4': + '@esbuild/netbsd-x64@0.28.2': optional: true - '@esbuild/openbsd-arm64@0.27.4': + '@esbuild/openbsd-arm64@0.28.2': optional: true - '@esbuild/openbsd-x64@0.27.4': + '@esbuild/openbsd-x64@0.28.2': optional: true - '@esbuild/openharmony-arm64@0.27.4': + '@esbuild/openharmony-arm64@0.28.2': optional: true - '@esbuild/sunos-x64@0.27.4': + '@esbuild/sunos-x64@0.28.2': optional: true - '@esbuild/win32-arm64@0.27.4': + '@esbuild/win32-arm64@0.28.2': optional: true - '@esbuild/win32-ia32@0.27.4': + '@esbuild/win32-ia32@0.28.2': optional: true - '@esbuild/win32-x64@0.27.4': + '@esbuild/win32-x64@0.28.2': optional: true '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': @@ -4791,7 +4837,7 @@ snapshots: '@jest/transform@30.3.0': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@jest/types': 30.3.0 '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 7.0.1 @@ -4841,7 +4887,7 @@ snapshots: '@modelcontextprotocol/server@2.0.0-alpha.4': dependencies: - zod: 4.4.3 + zod: 4.6.7 '@napi-rs/wasm-runtime@0.2.12': dependencies: @@ -4850,13 +4896,6 @@ snapshots: '@tybys/wasm-util': 0.10.4 optional: true - '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.4 - optional: true - '@noble/ciphers@1.3.0': {} '@noble/curves@1.9.1': @@ -4881,60 +4920,56 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@oxc-project/types@0.133.0': {} + '@oxc-project/types@0.155.0': {} '@pkgjs/parseargs@0.11.0': optional: true '@pkgr/core@0.2.9': {} - '@rolldown/binding-android-arm64@1.0.3': + '@rolldown/binding-android-arm-eabi@1.2.15': optional: true - '@rolldown/binding-darwin-arm64@1.0.3': + '@rolldown/binding-android-arm64@1.2.15': optional: true - '@rolldown/binding-darwin-x64@1.0.3': + '@rolldown/binding-darwin-arm64@1.2.15': optional: true - '@rolldown/binding-freebsd-x64@1.0.3': + '@rolldown/binding-darwin-x64@1.2.15': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + '@rolldown/binding-freebsd-x64@1.2.15': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.3': + '@rolldown/binding-linux-arm-gnueabihf@1.2.15': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.3': + '@rolldown/binding-linux-arm64-gnu@1.2.15': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.3': + '@rolldown/binding-linux-arm64-musl@1.2.15': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.3': + '@rolldown/binding-linux-ppc64-gnu@1.2.15': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.3': + '@rolldown/binding-linux-s390x-gnu@1.2.15': optional: true - '@rolldown/binding-linux-x64-musl@1.0.3': + '@rolldown/binding-linux-x64-gnu@1.2.15': optional: true - '@rolldown/binding-openharmony-arm64@1.0.3': + '@rolldown/binding-linux-x64-musl@1.2.15': optional: true - '@rolldown/binding-wasm32-wasi@1.0.3': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@rolldown/binding-openharmony-arm64@1.2.15': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.3': + '@rolldown/binding-win32-arm64-msvc@1.2.15': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.3': + '@rolldown/binding-win32-x64-msvc@1.2.15': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -6414,10 +6449,10 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitest/coverage-v8@4.1.11(vitest@4.1.11)': + '@vitest/coverage-v8@4.1.12(vitest@4.1.12)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.11 + '@vitest/utils': 4.1.12 ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -6426,52 +6461,52 @@ snapshots: obug: 2.2.1 std-env: 4.2.0 tinyrainbow: 3.1.1 - vitest: 4.1.11(@types/node@25.5.0)(@vitest/coverage-v8@4.1.11)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)(yaml@2.9.0)) + vitest: 4.1.12(@types/node@25.5.0)(@vitest/coverage-v8@4.1.12)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.2)(tsx@4.21.0)(yaml@2.9.0)) - '@vitest/expect@4.1.11': + '@vitest/expect@4.1.12': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.11 - '@vitest/utils': 4.1.11 + '@vitest/spy': 4.1.12 + '@vitest/utils': 4.1.12 chai: 6.2.2 tinyrainbow: 3.1.1 - '@vitest/mocker@4.1.11(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.12(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.2)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.11 + '@vitest/spy': 4.1.12 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)(yaml@2.9.0) + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.2)(tsx@4.21.0)(yaml@2.9.0) - '@vitest/pretty-format@4.1.11': + '@vitest/pretty-format@4.1.12': dependencies: tinyrainbow: 3.1.1 - '@vitest/runner@4.1.11': + '@vitest/runner@4.1.12': dependencies: - '@vitest/utils': 4.1.11 + '@vitest/utils': 4.1.12 pathe: 2.0.3 - '@vitest/snapshot@4.1.11': + '@vitest/snapshot@4.1.12': dependencies: - '@vitest/pretty-format': 4.1.11 - '@vitest/utils': 4.1.11 + '@vitest/pretty-format': 4.1.12 + '@vitest/utils': 4.1.12 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.11': {} + '@vitest/spy@4.1.12': {} - '@vitest/utils@4.1.11': + '@vitest/utils@4.1.12': dependencies: - '@vitest/pretty-format': 4.1.11 + '@vitest/pretty-format': 4.1.12 convert-source-map: 2.0.0 tinyrainbow: 3.1.1 '@x402/core@file:.x402-vendor/x402-core-2.26.0.tgz': dependencies: - zod: 3.25.76 + zod: 4.6.7 '@x402/svm@file:.x402-vendor/x402-svm-2.26.0.tgz(@solana/kit@6.10.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6))(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: @@ -6487,10 +6522,10 @@ snapshots: - fastestsmallesttextencoderdecoder - typescript - abitype@1.2.3(typescript@5.9.3)(zod@4.4.3): + abitype@1.2.3(typescript@5.9.3)(zod@4.6.7): optionalDependencies: typescript: 5.9.3 - zod: 4.4.3 + zod: 4.6.7 accepts@2.0.0: dependencies: @@ -6552,13 +6587,13 @@ snapshots: estree-walker: 3.0.3 js-tokens: 10.0.0 - babel-jest@30.3.0(@babel/core@7.29.0): + babel-jest@30.3.0(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@jest/transform': 30.3.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 7.0.1 - babel-preset-jest: 30.3.0(@babel/core@7.29.0) + babel-preset-jest: 30.3.0(@babel/core@7.29.7) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -6579,30 +6614,30 @@ snapshots: dependencies: '@types/babel__core': 7.20.5 - babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) - - babel-preset-jest@30.3.0(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 + babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.7) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7) + + babel-preset-jest@30.3.0(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 babel-plugin-jest-hoist: 30.3.0 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) balanced-match@1.0.2: {} @@ -6610,13 +6645,13 @@ snapshots: baseline-browser-mapping@2.11.0: {} - body-parser@2.3.0: + body-parser@2.4.0: dependencies: bytes: 3.1.2 - content-type: 2.0.0 + content-type: 2.1.0 debug: 4.4.3 http-errors: 2.0.1 - iconv-lite: 0.7.2 + iconv-lite: 0.7.3 on-finished: 2.4.1 qs: 6.16.0 raw-body: 3.0.2 @@ -6661,9 +6696,9 @@ snapshots: node-gyp-build: 4.8.4 optional: true - bundle-require@5.1.0(esbuild@0.27.4): + bundle-require@5.1.0(esbuild@0.28.2): dependencies: - esbuild: 0.27.4 + esbuild: 0.28.2 load-tsconfig: 0.2.5 bytes@3.1.2: @@ -6744,7 +6779,7 @@ snapshots: content-type@1.0.5: optional: true - content-type@2.0.0: + content-type@2.1.0: optional: true convert-source-map@2.0.0: {} @@ -6824,34 +6859,34 @@ snapshots: es-errors: 1.3.0 optional: true - esbuild@0.27.4: + esbuild@0.28.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.4 - '@esbuild/android-arm': 0.27.4 - '@esbuild/android-arm64': 0.27.4 - '@esbuild/android-x64': 0.27.4 - '@esbuild/darwin-arm64': 0.27.4 - '@esbuild/darwin-x64': 0.27.4 - '@esbuild/freebsd-arm64': 0.27.4 - '@esbuild/freebsd-x64': 0.27.4 - '@esbuild/linux-arm': 0.27.4 - '@esbuild/linux-arm64': 0.27.4 - '@esbuild/linux-ia32': 0.27.4 - '@esbuild/linux-loong64': 0.27.4 - '@esbuild/linux-mips64el': 0.27.4 - '@esbuild/linux-ppc64': 0.27.4 - '@esbuild/linux-riscv64': 0.27.4 - '@esbuild/linux-s390x': 0.27.4 - '@esbuild/linux-x64': 0.27.4 - '@esbuild/netbsd-arm64': 0.27.4 - '@esbuild/netbsd-x64': 0.27.4 - '@esbuild/openbsd-arm64': 0.27.4 - '@esbuild/openbsd-x64': 0.27.4 - '@esbuild/openharmony-arm64': 0.27.4 - '@esbuild/sunos-x64': 0.27.4 - '@esbuild/win32-arm64': 0.27.4 - '@esbuild/win32-ia32': 0.27.4 - '@esbuild/win32-x64': 0.27.4 + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 escalade@3.2.0: {} @@ -6875,12 +6910,12 @@ snapshots: eslint-plugin-react-hooks@7.0.1(eslint@9.39.4): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/parser': 7.29.2 eslint: 9.39.4 hermes-parser: 0.25.1 - zod: 4.4.3 - zod-validation-error: 4.0.2(zod@4.4.3) + zod: 4.6.7 + zod-validation-error: 4.0.2(zod@4.6.7) transitivePeerDependencies: - supports-color @@ -7028,7 +7063,7 @@ snapshots: express@5.2.1: dependencies: accepts: 2.0.0 - body-parser: 2.3.0 + body-parser: 2.4.0 content-disposition: 1.0.1 content-type: 1.0.5 cookie: 0.7.2 @@ -7255,7 +7290,7 @@ snapshots: human-signals@2.1.0: {} - iconv-lite@0.7.2: + iconv-lite@0.7.3: dependencies: safer-buffer: 2.1.2 optional: true @@ -7284,7 +7319,7 @@ snapshots: '@toon-format/toon': 2.3.1 tokenx: 1.3.0 yaml: 2.9.0 - zod: 4.4.3 + zod: 4.6.7 inflight@1.0.6: dependencies: @@ -7325,7 +7360,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/parser': 7.29.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 @@ -7411,12 +7446,12 @@ snapshots: jest-config@30.3.0(@types/node@25.5.0): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@jest/get-type': 30.1.0 '@jest/pattern': 30.0.1 '@jest/test-sequencer': 30.3.0 '@jest/types': 30.3.0 - babel-jest: 30.3.0(@babel/core@7.29.0) + babel-jest: 30.3.0(@babel/core@7.29.7) chalk: 4.1.2 ci-info: 4.4.0 deepmerge: 4.3.1 @@ -7594,17 +7629,17 @@ snapshots: jest-snapshot@30.3.0: dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/generator': 7.29.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.7) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.7) '@babel/types': 7.29.0 '@jest/expect-utils': 30.3.0 '@jest/get-type': 30.1.0 '@jest/snapshot-utils': 30.3.0 '@jest/transform': 30.3.0 '@jest/types': 30.3.0 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) chalk: 4.1.2 expect: 30.3.0 graceful-fs: 4.2.11 @@ -7703,54 +7738,54 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lightningcss-android-arm64@1.32.0: + lightningcss-android-arm64@1.33.0: optional: true - lightningcss-darwin-arm64@1.32.0: + lightningcss-darwin-arm64@1.33.0: optional: true - lightningcss-darwin-x64@1.32.0: + lightningcss-darwin-x64@1.33.0: optional: true - lightningcss-freebsd-x64@1.32.0: + lightningcss-freebsd-x64@1.33.0: optional: true - lightningcss-linux-arm-gnueabihf@1.32.0: + lightningcss-linux-arm-gnueabihf@1.33.0: optional: true - lightningcss-linux-arm64-gnu@1.32.0: + lightningcss-linux-arm64-gnu@1.33.0: optional: true - lightningcss-linux-arm64-musl@1.32.0: + lightningcss-linux-arm64-musl@1.33.0: optional: true - lightningcss-linux-x64-gnu@1.32.0: + lightningcss-linux-x64-gnu@1.33.0: optional: true - lightningcss-linux-x64-musl@1.32.0: + lightningcss-linux-x64-musl@1.33.0: optional: true - lightningcss-win32-arm64-msvc@1.32.0: + lightningcss-win32-arm64-msvc@1.33.0: optional: true - lightningcss-win32-x64-msvc@1.32.0: + lightningcss-win32-x64-msvc@1.33.0: optional: true - lightningcss@1.32.0: + lightningcss@1.33.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 lilconfig@3.1.3: {} @@ -7798,7 +7833,7 @@ snapshots: dependencies: tmpl: 1.0.5 - markdown-it@14.3.1: + markdown-it@14.3.3: dependencies: argparse: 2.0.1 entities: 4.5.0 @@ -7862,14 +7897,14 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.4 - mppx@0.8.15(express@5.2.1)(typescript@5.9.3)(viem@2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.4.3)): + mppx@0.8.15(express@5.2.1)(typescript@5.9.3)(viem@2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.6.7)): dependencies: '@stripe/stripe-js': 9.9.0 eventsource-parser: 3.1.0 incur: 0.4.26 - ox: 0.14.33(typescript@5.9.3)(zod@4.4.3) - viem: 2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.4.3) - zod: 4.4.3 + ox: 0.14.33(typescript@5.9.3)(zod@4.6.7) + viem: 2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.6.7) + zod: 4.6.7 optionalDependencies: express: 5.2.1 transitivePeerDependencies: @@ -7936,7 +7971,7 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ox@0.14.33(typescript@5.9.3)(zod@4.4.3): + ox@0.14.33(typescript@5.9.3)(zod@4.6.7): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -7944,7 +7979,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.3(typescript@5.9.3)(zod@4.4.3) + abitype: 1.2.3(typescript@5.9.3)(zod@4.6.7) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.3 @@ -8072,7 +8107,7 @@ snapshots: dependencies: bytes: 3.1.2 http-errors: 2.0.1 - iconv-lite: 0.7.2 + iconv-lite: 0.7.3 unpipe: 1.0.0 optional: true @@ -8096,26 +8131,26 @@ snapshots: reusify@1.1.0: {} - rolldown@1.0.3: + rolldown@1.2.15: dependencies: - '@oxc-project/types': 0.133.0 + '@oxc-project/types': 0.155.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.3 - '@rolldown/binding-darwin-arm64': 1.0.3 - '@rolldown/binding-darwin-x64': 1.0.3 - '@rolldown/binding-freebsd-x64': 1.0.3 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 - '@rolldown/binding-linux-arm64-gnu': 1.0.3 - '@rolldown/binding-linux-arm64-musl': 1.0.3 - '@rolldown/binding-linux-ppc64-gnu': 1.0.3 - '@rolldown/binding-linux-s390x-gnu': 1.0.3 - '@rolldown/binding-linux-x64-gnu': 1.0.3 - '@rolldown/binding-linux-x64-musl': 1.0.3 - '@rolldown/binding-openharmony-arm64': 1.0.3 - '@rolldown/binding-wasm32-wasi': 1.0.3 - '@rolldown/binding-win32-arm64-msvc': 1.0.3 - '@rolldown/binding-win32-x64-msvc': 1.0.3 + '@rolldown/binding-android-arm-eabi': 1.2.15 + '@rolldown/binding-android-arm64': 1.2.15 + '@rolldown/binding-darwin-arm64': 1.2.15 + '@rolldown/binding-darwin-x64': 1.2.15 + '@rolldown/binding-freebsd-x64': 1.2.15 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.15 + '@rolldown/binding-linux-arm64-gnu': 1.2.15 + '@rolldown/binding-linux-arm64-musl': 1.2.15 + '@rolldown/binding-linux-ppc64-gnu': 1.2.15 + '@rolldown/binding-linux-s390x-gnu': 1.2.15 + '@rolldown/binding-linux-x64-gnu': 1.2.15 + '@rolldown/binding-linux-x64-musl': 1.2.15 + '@rolldown/binding-openharmony-arm64': 1.2.15 + '@rolldown/binding-win32-arm64-msvc': 1.2.15 + '@rolldown/binding-win32-x64-msvc': 1.2.15 rollup@4.62.0: dependencies: @@ -8394,12 +8429,12 @@ snapshots: tsup@8.5.1(postcss@8.5.23)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.9.0): dependencies: - bundle-require: 5.1.0(esbuild@0.27.4) + bundle-require: 5.1.0(esbuild@0.28.2) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 debug: 4.4.3 - esbuild: 0.27.4 + esbuild: 0.28.2 fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 @@ -8427,7 +8462,7 @@ snapshots: tsx@4.21.0: dependencies: - esbuild: 0.27.4 + esbuild: 0.28.2 get-tsconfig: 4.13.6 optionalDependencies: fsevents: 2.3.3 @@ -8442,7 +8477,7 @@ snapshots: type-is@2.1.0: dependencies: - content-type: 2.0.0 + content-type: 2.1.0 media-typer: 1.1.0 mime-types: 3.0.2 optional: true @@ -8455,7 +8490,7 @@ snapshots: dependencies: '@gerrit0/mini-shiki': 3.23.0 lunr: 2.3.9 - markdown-it: 14.3.1 + markdown-it: 14.3.3 minimatch: 10.2.5 typescript: 5.9.3 yaml: 2.9.0 @@ -8532,15 +8567,15 @@ snapshots: vary@1.1.2: optional: true - viem@2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.4.3): + viem@2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.6.7): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.3(typescript@5.9.3)(zod@4.4.3) + abitype: 1.2.3(typescript@5.9.3)(zod@4.6.7) isows: 1.0.7(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) - ox: 0.14.33(typescript@5.9.3)(zod@4.4.3) + ox: 0.14.33(typescript@5.9.3)(zod@4.6.7) ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: typescript: 5.9.3 @@ -8549,29 +8584,29 @@ snapshots: - utf-8-validate - zod - vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)(yaml@2.9.0): + vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.2)(tsx@4.21.0)(yaml@2.9.0): dependencies: - lightningcss: 1.32.0 + lightningcss: 1.33.0 picomatch: 4.0.7 postcss: 8.5.23 - rolldown: 1.0.3 + rolldown: 1.2.15 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 25.5.0 - esbuild: 0.27.4 + esbuild: 0.28.2 fsevents: 2.3.3 tsx: 4.21.0 yaml: 2.9.0 - vitest@4.1.11(@types/node@25.5.0)(@vitest/coverage-v8@4.1.11)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)(yaml@2.9.0)): + vitest@4.1.12(@types/node@25.5.0)(@vitest/coverage-v8@4.1.12)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.2)(tsx@4.21.0)(yaml@2.9.0)): dependencies: - '@vitest/expect': 4.1.11 - '@vitest/mocker': 4.1.11(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.11 - '@vitest/runner': 4.1.11 - '@vitest/snapshot': 4.1.11 - '@vitest/spy': 4.1.11 - '@vitest/utils': 4.1.11 + '@vitest/expect': 4.1.12 + '@vitest/mocker': 4.1.12(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.2)(tsx@4.21.0)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.12 + '@vitest/runner': 4.1.12 + '@vitest/snapshot': 4.1.12 + '@vitest/spy': 4.1.12 + '@vitest/utils': 4.1.12 es-module-lexer: 2.3.2 expect-type: 1.4.0 magic-string: 0.30.21 @@ -8583,11 +8618,11 @@ snapshots: tinyexec: 1.3.1 tinyglobby: 0.2.17 tinyrainbow: 3.1.1 - vite: 8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)(yaml@2.9.0) + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.2)(tsx@4.21.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.5.0 - '@vitest/coverage-v8': 4.1.11(vitest@4.1.11) + '@vitest/coverage-v8': 4.1.12(vitest@4.1.12) transitivePeerDependencies: - msw @@ -8650,10 +8685,8 @@ snapshots: yocto-queue@0.1.0: {} - zod-validation-error@4.0.2(zod@4.4.3): + zod-validation-error@4.0.2(zod@4.6.7): dependencies: - zod: 4.4.3 - - zod@3.25.76: {} + zod: 4.6.7 - zod@4.4.3: {} + zod@4.6.7: {} diff --git a/typescript/pnpm-workspace.yaml b/typescript/pnpm-workspace.yaml index e3019811e..653c85f61 100644 --- a/typescript/pnpm-workspace.yaml +++ b/typescript/pnpm-workspace.yaml @@ -26,12 +26,21 @@ overrides: 'brace-expansion@5.0.4': '5.0.12' 'brace-expansion@5.0.6': '5.0.12' 'linkify-it': '5.0.2' - 'markdown-it': '14.3.1' + # GHSA-r7fv-28h4-cvq7, GHSA-gfr2-rv44-r23c, GHSA-vfgh-jcmw-g37q: quadratic-time + # parsing, patched in 14.3.3. Reaches us via typedoc. + 'markdown-it': '>=14.3.3 <15' 'nanoid@3.3.11': '3.3.18' 'picomatch@2.3.1': '2.3.2' postcss: '8.5.23' source-map-js: '1.2.2' - vite: '8.0.16' + # GHSA-587h-7wmj-h5pm and siblings (launch-editor, fs.allow, custom + # middleware), patched in 8.1.6. Reaches us via vitest. + vite: '>=8.1.6 <9' + # GHSA-g7r4-m6w7-qqqr: dev-server file read on Windows, patched in 0.28.1. + # Reaches us via tsx, tsup and vite. + esbuild: '>=0.28.1 <0.29' + # GHSA-4x5r-pxfx-6jf8: file read via sourceMappingURL, patched in 7.29.6. + '@babel/core': '>=7.29.6 <8' # fast-uri/hono/ip-address floors below track advisories reached via # @modelcontextprotocol/sdk (see `pnpm why `); bump as new CVEs land. '@modelcontextprotocol/sdk': '>=1.31.0' @@ -42,7 +51,13 @@ overrides: path-to-regexp: '>=8.4.0' qs: '>=6.16.0' yaml: '>=2.8.3' - body-parser: '>=2.3.0' + # GHSA-27r3-jxmh-p828: compressed-body trailing-bytes denial of service, + # patched in 2.4.0. Reaches us via mppx > express. + body-parser: '>=2.4.0' + # GHSA-mrhx-c7xc-m3w5: memory exhaustion validating oversized constrained + # collections, patched in 4.6.6. Reaches us directly (packages/mpp) and via + # mppx > incur. + zod: '>=4.6.6 <5' # GHSA-jqcg-44mw-7w3h: forwarded-header denial of service, patched in 2.0.8. # Reaches us via mppx > express. proxy-addr: '>=2.0.8' From a5b400b5ebd80df7282783ae4795da5567061683 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Tue, 27 Oct 2026 09:00:54 -0400 Subject: [PATCH 5/8] feat: x402 client-built transaction v1, cross-tested TypeScript and Rust (#401) --- .github/workflows/conformance.yml | 2 +- .gitmodules | 5 +- external/x402-txv1 | 2 +- harness/README.md | 352 ++-- harness/expectations/FINDINGS.md | 262 +-- harness/expectations/RULINGS.md | 140 +- harness/expectations/go.toml | 10 +- harness/expectations/lua.toml | 10 +- harness/expectations/php.toml | 11 +- harness/expectations/python.toml | 11 +- harness/expectations/ruby.toml | 12 +- harness/expectations/rust.toml | 2 +- harness/expectations/swift.toml | 5 + harness/expectations/typescript.toml | 348 +--- harness/interop-plan.json | 27 +- harness/package.json | 4 +- harness/pnpm-lock.yaml | 1425 +++++++++-------- harness/requirements/x402-txv1.toml | 51 +- harness/requirements/x402.toml | 26 +- harness/src/conformance/contract-schema.ts | 13 + .../src/conformance/intents/subscription.ts | 4 +- .../intents/x402-batch-settlement.ts | 31 +- harness/src/conformance/intents/x402-upto.ts | 32 + harness/src/conformance/reject.ts | 12 +- harness/src/conformance/schema.ts | 20 +- harness/src/conformance/ts-runner.ts | 16 +- harness/src/expectations.ts | 1 + .../src/fixtures/typescript/charge-client.ts | 8 + .../src/fixtures/typescript/upto-server.ts | 141 ++ harness/test/onchain.e2e.test.ts | 5 +- harness/vectors/FILL.sha256 | 65 +- ...xv1-top-up-legacy-policed-as-v0-reject.txt | 2 + .../batch-txv1-top-up-v0-on-v1-route.txt | 2 + ...-txv1-top-up-v0-over-1232-bytes-reject.txt | 2 + .../batch-txv1-top-up-v1-advertised.txt | 2 + ...p-v1-compute-budget-instruction-reject.txt | 2 + ...-txv1-top-up-v1-loaded-limit-below-max.txt | 2 + ...-top-up-v1-missing-loaded-limit-reject.txt | 2 + ...v1-top-up-v1-missing-unit-limit-reject.txt | 2 + .../batch-txv1-top-up-v1-over-1232-bytes.txt | 2 + ...tch-txv1-top-up-v1-priority-fee-at-cap.txt | 2 + ...top-up-v1-priority-fee-over-cap-reject.txt | 2 + ...1-priority-fee-over-sponsor-cap-reject.txt | 2 + ...1-top-up-v1-unit-limit-over-cap-reject.txt | 2 + ...wire-redemption-claim-eighteen-entries.txt | 5 + ...e-redemption-claim-five-entries-reject.txt | 3 - ...demption-claim-nineteen-entries-reject.txt | 3 + ...mption-settle-fourteen-channels-reject.txt | 3 + ...re-redemption-settle-thirteen-channels.txt | 5 + ...-wire-requirements-redemption-capacity.txt | 5 + ...wire-requirements-transaction-versions.txt | 4 +- ...-verify-v1-compute-limit-at-cap-accept.txt | 2 +- ...erify-v1-compute-limit-over-cap-reject.txt | 2 +- .../x402-verify-v1-heap-size-reject.txt | 50 + ...erify-v1-loaded-data-limit-4mib-accept.txt | 50 + ...rify-v1-loaded-data-limit-small-accept.txt | 50 + harness/vectors/batch-build.json | 2 + harness/vectors/batch-txv1.json | 104 +- harness/vectors/batch-verify-refund.json | 1 + .../vectors/batch-verify-setup-policy.json | 30 +- harness/vectors/batch-verify-voucher.json | 18 + harness/vectors/batch-wire.json | 1376 ++++++++++++++-- harness/vectors/x402-tx-versions.json | 848 ++++++++-- harness/vectors/x402-upto-build.json | 120 -- harness/vectors/x402-upto-open-policy.json | 24 +- harness/vectors/x402-upto-txv1.json | 50 +- harness/vectors/x402-verify-mutations.json | 7 + harness/vectors/x402-verify-policy.json | 20 +- playground/app/package.json | 4 +- playground/pnpm-lock.yaml | 778 ++++----- playground/test-results/.last-run.json | 4 + rust/crates/conformance/src/case.rs | 57 + rust/crates/conformance/src/cases/mod.rs | 9 + .../conformance/src/cases/x402_batch.rs | 148 +- .../conformance/src/cases/x402_exact.rs | 4 + .../conformance/src/cases/x402_policy.rs | 11 +- .../conformance/src/cases/x402_tx_versions.rs | 95 +- .../crates/conformance/src/cases/x402_upto.rs | 58 +- .../conformance/src/interop/adapters.rs | 33 +- rust/crates/conformance/src/interop/chain.rs | 37 +- rust/crates/conformance/src/interop/claims.rs | 9 +- rust/crates/conformance/src/interop/runner.rs | 126 +- .../conformance/src/interop/scenarios.rs | 83 +- rust/crates/conformance/src/interop/settle.rs | 64 +- rust/crates/conformance/src/main.rs | 16 + rust/crates/conformance/src/mutate.rs | 27 +- rust/crates/conformance/src/realize.rs | 21 +- rust/crates/conformance/src/realize/batch.rs | 31 +- rust/crates/conformance/src/realize/upto.rs | 4 +- rust/crates/conformance/src/run/judge.rs | 67 +- rust/crates/conformance/src/run/vectors.rs | 21 +- rust/crates/harness-bins/Cargo.toml | 8 + .../src/bin/x402_harness_batch_client.rs | 181 +++ .../src/bin/x402_harness_batch_server.rs | 268 ++++ .../src/bin/x402_harness_server.rs | 6 +- .../src/bin/x402_harness_upto_server.rs | 6 +- .../crates/kit/src/core/payment_channel/v1.rs | 38 +- rust/crates/kit/src/core/tx/mod.rs | 6 +- rust/crates/kit/src/core/tx/policy.rs | 15 + rust/crates/kit/src/core/tx/version.rs | 10 +- .../x402/client/batch_settlement/payment.rs | 2 + .../kit/src/x402/client/exact/payment.rs | 12 +- .../schemes/batch_settlement/tx_policy.rs | 2 + .../schemes/batch_settlement/types.rs | 123 +- .../schemes/batch_settlement/verify.rs | 2 + .../src/x402/protocol/schemes/exact/types.rs | 69 +- .../src/x402/protocol/schemes/exact/verify.rs | 108 +- .../kit/src/x402/server/batch_settlement.rs | 91 +- rust/crates/kit/src/x402/server/upto.rs | 1 + typescript/.x402-vendor/x402-core-2.26.0.tgz | Bin 420604 -> 0 bytes typescript/.x402-vendor/x402-core-2.28.0.tgz | Bin 0 -> 422113 bytes typescript/.x402-vendor/x402-svm-2.26.0.tgz | Bin 1255102 -> 0 bytes typescript/.x402-vendor/x402-svm-2.28.0.tgz | Bin 0 -> 1524166 bytes .../examples/playground-api/package.json | 4 +- .../examples/playground-api/pnpm-lock.yaml | 1289 ++++++++------- typescript/external/x402 | 2 +- typescript/packages/mpp/src/Methods.ts | 57 +- .../packages/mpp/src/__tests__/charge.test.ts | 82 + .../client-charge-validation.test.ts | 128 ++ .../mpp/src/__tests__/methods.test.ts | 34 + .../src/__tests__/subscription-client.test.ts | 210 ++- .../src/__tests__/subscription-server.test.ts | 400 +++-- .../mpp/src/__tests__/subscription.test.ts | 70 + typescript/packages/mpp/src/client/Charge.ts | 55 +- .../packages/mpp/src/client/Subscription.ts | 120 +- typescript/packages/mpp/src/server/Charge.ts | 46 +- .../packages/mpp/src/server/Subscription.ts | 293 ++-- .../packages/mpp/src/shared/subscription.ts | 32 +- typescript/packages/pay-kit/package.json | 12 +- .../pay-kit/src/__tests__/client.test.ts | 42 +- .../pay-kit/src/__tests__/x402.test.ts | 23 +- .../pay-kit/src/adapters/x402-upto.ts | 37 +- .../packages/pay-kit/src/adapters/x402.ts | 21 +- .../packages/pay-kit/src/client/index.ts | 24 +- typescript/packages/pay-kit/src/config.ts | 6 + typescript/pnpm-lock.yaml | 1198 ++++++++++---- typescript/pnpm-workspace.yaml | 2 +- 137 files changed, 8917 insertions(+), 3786 deletions(-) create mode 100644 harness/src/fixtures/typescript/upto-server.ts create mode 100644 harness/vectors/annotated/batch-wire-redemption-claim-eighteen-entries.txt delete mode 100644 harness/vectors/annotated/batch-wire-redemption-claim-five-entries-reject.txt create mode 100644 harness/vectors/annotated/batch-wire-redemption-claim-nineteen-entries-reject.txt create mode 100644 harness/vectors/annotated/batch-wire-redemption-settle-fourteen-channels-reject.txt create mode 100644 harness/vectors/annotated/batch-wire-redemption-settle-thirteen-channels.txt create mode 100644 harness/vectors/annotated/batch-wire-requirements-redemption-capacity.txt create mode 100644 harness/vectors/annotated/x402-verify-v1-heap-size-reject.txt create mode 100644 harness/vectors/annotated/x402-verify-v1-loaded-data-limit-4mib-accept.txt create mode 100644 harness/vectors/annotated/x402-verify-v1-loaded-data-limit-small-accept.txt create mode 100644 playground/test-results/.last-run.json create mode 100644 rust/crates/harness-bins/src/bin/x402_harness_batch_client.rs create mode 100644 rust/crates/harness-bins/src/bin/x402_harness_batch_server.rs delete mode 100644 typescript/.x402-vendor/x402-core-2.26.0.tgz create mode 100644 typescript/.x402-vendor/x402-core-2.28.0.tgz delete mode 100644 typescript/.x402-vendor/x402-svm-2.26.0.tgz create mode 100644 typescript/.x402-vendor/x402-svm-2.28.0.tgz diff --git a/.github/workflows/conformance.yml b/.github/workflows/conformance.yml index 75e1b21f8..65e4f305e 100644 --- a/.github/workflows/conformance.yml +++ b/.github/workflows/conformance.yml @@ -277,7 +277,7 @@ jobs: path: harness/results/ if-no-files-found: ignore - # Real on-chain settlement: forks mainnet (surfpool 1.4) and executes the + # Real on-chain settlement: forks mainnet (surfpool 1.5) and executes the # deployed payment-channels program, so a green run proves settlement lands. onchain: name: onchain diff --git a/.gitmodules b/.gitmodules index 8791df3a4..2a94027f1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,7 @@ [submodule "typescript/external/x402"] path = typescript/external/x402 - url = https://github.com/x402-foundation/x402.git - branch = main + url = https://github.com/solana-foundation/x402.git + branch = feat/svm-client-transaction-v1 [submodule "external/mpp-specs"] path = external/mpp-specs url = https://github.com/tempoxyz/mpp-specs.git @@ -16,3 +16,4 @@ path = external/x402-txv1 url = https://github.com/solana-foundation/x402.git shallow = true + branch = feat/svm-client-transaction-v1 diff --git a/external/x402-txv1 b/external/x402-txv1 index 3d723dd54..d411aea10 160000 --- a/external/x402-txv1 +++ b/external/x402-txv1 @@ -1 +1 @@ -Subproject commit 3d723dd54706b9edab8a33dc2c4e9cad22f35745 +Subproject commit d411aea104d17926465c91755fdfe12b0f445fc0 diff --git a/harness/README.md b/harness/README.md index 10838a45a..fe4a3b236 100644 --- a/harness/README.md +++ b/harness/README.md @@ -107,7 +107,10 @@ cargo run -q -p paykit-conformance --bin pkc -- help ``` `pkc` judges every result itself (outcome, `rejectCode`, exact bytes, x402 -envelope shape, transaction shape) and, for every accepted build, decodes the +envelope shape, transaction shape; a vector whose spec leaves the verdict to +the implementation lists the other conformant verdicts in +`expect.alsoConformant`, see [RULINGS.md](expectations/RULINGS.md#harness-consequences)) +and, for every accepted build, decodes the built transaction, runs the Rust kit's verifier on it against the vector's request and compares its instruction multiset (program, set of accounts, data; signatures excluded, ordering free) with the kit's own build of the same case. @@ -257,12 +260,12 @@ regenerated with `pnpm coverage` and CI fails when it is stale. | --- | ---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | | flow | 34 | — | — | — | — | — | — | — | — | 30 · 4u | | protocol | 91 | 91 | — | 91 | 91 | 91 | 91 | 91 | — | 91 | -| vector charge | 117 | 71 · 46k | — | 57 · 29u · 31k | 59 · 29u · 29k | 79 · 38k | 60 · 29u · 28k | 117 | 29 · 72u · 16k | 74 · 2u · 41k | -| vector session | 192 | 8 · 184u | 3 · 189u | — | — | 36 · 149u · 7k | — | 192 | 3 · 189u | 36 · 149u · 7k | -| vector subscription | 123 | — | — | — | — | — | — | 123 | — | 70 · 15u · 38k | -| vector x402-batch-settlement | 171 | — | — | — | — | — | — | 171 | — | 67 · 27u · 77k | -| vector x402-exact | 73 | 47 · 26k | — | 32 · 19u · 22k | 32 · 21u · 20k | 44 · 2u · 27k | 29 · 19u · 25k | 73 | 14 · 52u · 7k | 35 · 29u · 9k | -| vector x402-upto | 129 | — | — | — | — | — | — | 129 | — | 105 · 2u · 22k | +| vector charge | 117 | 71 · 46k | — | 57 · 29u · 31k | 59 · 29u · 29k | 79 · 38k | 60 · 29u · 28k | 117 | 29 · 72u · 16k | 82 · 2u · 33k | +| vector session | 192 | 8 · 184u | 3 · 189u | — | — | 36 · 149u · 7k | — | 192 | 3 · 189u | 37 · 149u · 6k | +| vector subscription | 123 | — | — | — | — | — | — | 123 | — | 97 · 15u · 11k | +| vector x402-batch-settlement | 175 | — | — | — | — | — | — | 175 | — | 134 · 35u · 6k | +| vector x402-exact | 78 | 49 · 29k | — | 34 · 21u · 23k | 34 · 23u · 21k | 45 · 2u · 31k | 30 · 21u · 27k | 78 | 14 · 55u · 9k | 66 · 9u · 3k | +| vector x402-upto | 128 | — | — | — | — | — | — | 128 | — | 121 · 4u · 3k | Each cell counts the cases that must pass, then `u` unsupported (declared, executed, must report unsupported) and `k` known failing (declared with tracking, executed, must fail). `—` means the SDK does not claim the suite. Source: `harness/expectations/.toml`. @@ -280,21 +283,21 @@ when the table is stale. | client \ server | go | lua | php | python | ruby | rust | typescript | | --- | :---: | :---: | :---: | :---: | :---: | :---: | :---: | -| go | **11**/14 | **11**/14 | **11**/14 | **11**/14 | **11**/14 | 14/14 | **11**/14 | -| python | **11**/14 | **11**/14 | **11**/14 | **11**/14 | **11**/14 | 14/14 | **11**/14 | +| go | **11**/14 | **11**/14 | **11**/14 | **11**/14 | **11**/14 | 14/14 | **12**/14 | +| python | **11**/14 | **11**/14 | **11**/14 | **11**/14 | **11**/14 | 14/14 | **12**/14 | | rust | **8**/14 | **8**/14 | **8**/14 | 14/14 | **8**/14 | 14/14 | **8**/14 | -| swift | **11**/14 | **11**/14 | **11**/14 | **11**/14 | **11**/14 | 14/14 | **11**/14 | -| typescript | **10**/13 | **10**/13 | **10**/13 | **10**/13 | **10**/13 | 13/13 | **10**/13 | +| swift | **11**/14 | **11**/14 | **11**/14 | **11**/14 | **11**/14 | 14/14 | **12**/14 | +| typescript | **10**/13 | **10**/13 | **10**/13 | **10**/13 | **10**/13 | 13/13 | **11**/13 | **x402-exact**: builds by the client SDK (rows) verified by the server SDK (columns), agreeing with the Rust judge / total. | client \ server | go | lua | php | python | ruby | rust | typescript | | --- | :---: | :---: | :---: | :---: | :---: | :---: | :---: | -| go | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 10/10 · 5u | -| python | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 10/10 · 5u | -| rust | **13**/15 | **13**/15 | **13**/15 | **13**/15 | **13**/15 | 15/15 | 10/10 · 5u | -| swift | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 10/10 · 5u | -| typescript | 10/10 | 10/10 | 10/10 | 10/10 | 10/10 | 10/10 | 8/8 · 2u | +| go | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 12/12 · 3u | +| python | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 12/12 · 3u | +| rust | **13**/15 | **13**/15 | **13**/15 | **13**/15 | **13**/15 | 15/15 | 12/12 · 3u | +| swift | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 12/12 · 3u | +| typescript | **9**/11 | **9**/11 | **9**/11 | **9**/11 | **9**/11 | 11/11 | 10/10 · 1u | A server agrees with a build when it accepts what the Rust judge accepted (verifier plus instruction multiset against the kit's own build) and refuses what it refused; `u` counts builds the server reports it cannot express. Disagreements are listed in `harness/results/cross.json`. @@ -314,7 +317,7 @@ files (`pkc report`; `pkc report --check` fails when stale). The counts come from the same extraction as `pkc req-lint`. -1732 normative sentences in the pinned specs: 407 mapped to a requirement, 1305 unmapped. +1896 normative sentences in the pinned specs: 416 mapped to a requirement, 1460 unmapped. | Spec file | Normative | Mapped | Ignored | Unmapped | | --- | ---: | ---: | ---: | ---: | @@ -323,20 +326,20 @@ come from the same extraction as `pkc req-lint`. | `mpp-specs/draft-payment-intent-subscription-00.md` | 44 | 2 | 0 | 42 | | `mpp-specs/draft-solana-charge-00.md` | 145 | 47 | 0 | 98 | | `mpp-specs/draft-solana-session-00.md` | 219 | 98 | 0 | 121 | -| `x402/x402-specification-v2.md` | 10 | 0 | 0 | 10 | -| `x402/scheme_exact.md` | 42 | 4 | 20 | 18 | -| `x402/scheme_exact_svm.md` | 35 | 17 | 0 | 18 | +| `x402/x402-specification-v2.md` | 11 | 0 | 0 | 11 | +| `x402/scheme_exact.md` | 53 | 4 | 20 | 29 | +| `x402/scheme_exact_svm.md` | 91 | 17 | 0 | 74 | | `x402/payment_identifier.md` | 0 | 0 | 0 | 0 | | `x402/scheme_upto.md` | 13 | 2 | 0 | 11 | -| `x402/scheme_upto_svm.md` | 87 | 42 | 0 | 45 | +| `x402/scheme_upto_svm.md` | 105 | 42 | 0 | 63 | | `x402/scheme_batch_settlement.md` | 2 | 0 | 0 | 2 | -| `x402/scheme_batch_settlement_svm.md` | 200 | 80 | 0 | 120 | +| `x402/scheme_batch_settlement_svm.md` | 223 | 82 | 0 | 141 | | `mpp-specs-solana/draft-solana-subscription-00.md` | 93 | 40 | 0 | 53 | | `mpp-specs-txv1/draft-solana-charge-00.md` | 156 | 18 | 0 | 138 | | `mpp-specs-txv1/draft-solana-session-00.md` | 229 | 12 | 0 | 217 | -| `x402-txv1/scheme_exact_svm.md` | 48 | 18 | 0 | 30 | -| `x402-txv1/scheme_upto_svm.md` | 101 | 12 | 0 | 89 | -| `x402-txv1/scheme_batch_settlement_svm.md` | 215 | 13 | 0 | 202 | +| `x402-txv1/scheme_exact_svm.md` | 91 | 21 | 0 | 70 | +| `x402-txv1/scheme_upto_svm.md` | 105 | 14 | 0 | 91 | +| `x402-txv1/scheme_batch_settlement_svm.md` | 223 | 15 | 0 | 208 | **Requirements × SDK**: cases per requirement, and per SDK the cases it must pass, then `u` unsupported and `k` known failing; `—` means the SDK claims none of them. `*` marks `required = true` (req-lint fails if its last case goes). @@ -345,7 +348,7 @@ come from the same extraction as `pkc req-lint`. | `MPP-5a84bf0d0b`* | draft-httpauth-payment-01.md § Challenge Binding | 13 | — | — | — | — | — | — | 13 | — | 2 · 11k | | `MPP-8a3cdc949b`* | draft-httpauth-payment-01.md § Challenge Binding | 5 | 5 | — | 5 | 5 | 5 | 5 | 5 | 5 | 5 | | `MPP-3688fa68c7`* | draft-payment-intent-subscription-00.md § Required Fields | 1 | — | — | — | — | — | — | 1 | — | 1 | -| `MPP-c1bffbb1a3`* | draft-payment-intent-subscription-00.md § Shared Fields | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | +| `MPP-c1bffbb1a3`* | draft-payment-intent-subscription-00.md § Shared Fields | 1 | — | — | — | — | — | — | 1 | — | 1 | | `MPP-de0815e07c`* | draft-solana-charge-00.md § Client Requirements | 5 | 5 | — | 3 · 2u | 3 · 2u | 5 | 3 · 2u | 5 | 2 · 3u | 5 | | `MPP-51806e831a`* | draft-solana-charge-00.md § Encoding Conventions | 3 | 3 | — | 3 | 3 | 3 | 3 | 3 | 3 | 3 | | `MPP-71198689c1`* | draft-solana-charge-00.md § Encoding Conventions | 5 | 5 | — | 5 | 5 | 5 | 5 | 5 | 5 | 5 | @@ -353,7 +356,7 @@ come from the same extraction as `pkc req-lint`. | `MPP-837333ec9f`* | draft-solana-charge-00.md § Fee Payer Configuration | 2 | 2 | — | 0 · 2u | 0 · 2u | 2 | 0 · 2u | 2 | 2 | 2 | | `MPP-b4a76cab12`* | draft-solana-charge-00.md § Fee Payer Configuration | 1 | 1 | — | 0 · 1u | 0 · 1u | 1 | 0 · 1u | 1 | 1 | 1 | | `MPP-1180595e82`* | draft-solana-charge-00.md § Method Details | 4 | 4 | — | 4 | 4 | 4 | 4 | 4 | 0 · 4u | 4 | -| `MPP-4b02ff0c39`* | draft-solana-charge-00.md § Method Details | 2 | 2 | — | 0 · 2u | 0 · 2u | 2 | 0 · 2u | 2 | 2 | 1 · 1k | +| `MPP-4b02ff0c39`* | draft-solana-charge-00.md § Method Details | 2 | 2 | — | 0 · 2u | 0 · 2u | 2 | 0 · 2u | 2 | 2 | 2 | | `MPP-5348f3f797`* | draft-solana-charge-00.md § Method Details | 1 | 1 | — | 0 · 1u | 0 · 1u | 1 | 0 · 1u | 1 | 1 | 1 | | `MPP-58f2b1922a`* | draft-solana-charge-00.md § Method Details | 1 | 0 · 1k | — | 0 · 1u | 0 · 1u | 0 · 1k | 0 · 1u | 1 | 1 | 1 | | `MPP-6ce505e77b`* | draft-solana-charge-00.md § Method Details | 4 | 4 | — | 4 | 4 | 4 | 4 | 4 | 0 · 4u | 4 | @@ -364,8 +367,8 @@ come from the same extraction as `pkc req-lint`. | `MPP-b134044e08`* | draft-solana-charge-00.md § Method Details | 1 | 1 | — | 0 · 1u | 0 · 1u | 1 | 0 · 1u | 1 | 1 | 1 | | `MPP-b769615b39`* | draft-solana-charge-00.md § Method Details | 2 | 0 · 2k | — | 1 · 1u | 1 · 1u | 1 · 1k | 1 · 1u | 2 | 1 · 1u | 2 | | `MPP-c189ef935e`* | draft-solana-charge-00.md § Method Details | 2 | 2 | — | 0 · 2u | 0 · 2u | 2 | 0 · 2u | 2 | 2 | 2 | -| `MPP-ec29292f9d`* | draft-solana-charge-00.md § Method Details | 2 | 0 · 1u · 1k | 0 · 1u | 0 · 1u | 0 · 1u | 0 · 1u · 1k | 0 · 1u | 2 | 0 · 1u · 1k | 0 · 1u · 1k | -| `MPP-fde6ebf8c7`* | draft-solana-charge-00.md § Method Details | 1 | 0 · 1k | — | 0 · 1u | 0 · 1u | 0 · 1k | 0 · 1u | 1 | 0 · 1k | 0 · 1k | +| `MPP-ec29292f9d`* | draft-solana-charge-00.md § Method Details | 2 | 0 · 1u · 1k | 0 · 1u | 0 · 1u | 0 · 1u | 0 · 1u · 1k | 0 · 1u | 2 | 0 · 1u · 1k | 1 · 1u | +| `MPP-fde6ebf8c7`* | draft-solana-charge-00.md § Method Details | 1 | 0 · 1k | — | 0 · 1u | 0 · 1u | 0 · 1k | 0 · 1u | 1 | 0 · 1k | 1 | | `MPP-e02293d02d`* | draft-solana-charge-00.md § Native SOL | 1 | 1 | — | 0 · 1u | 0 · 1u | 1 | 0 · 1u | 1 | 1 | 1 | | `MPP-1659a03107`* | draft-solana-charge-00.md § Native SOL Verification | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 1 | | `MPP-4a77950278`* | draft-solana-charge-00.md § Native SOL Verification | 2 | 2 | — | 2 | 2 | 2 | 2 | 2 | 0 · 2u | 2 | @@ -379,14 +382,14 @@ come from the same extraction as `pkc req-lint`. | `MPP-64da85f4f3`* | draft-solana-charge-00.md § SPL Tokens | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 1 | | `MPP-2d30d806c0`* | draft-solana-charge-00.md § Server Requirements | 7 | 7 | — | 7 | 7 | 7 | 7 | 7 | 0 · 7u | 7 | | `MPP-3d2ad6ef40`* | draft-solana-charge-00.md § Shared Fields | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 1 | -| `MPP-a6f3950ec9`* | draft-solana-charge-00.md § Shared Fields | 2 | 2 | — | 0 · 2u | 0 · 2u | 1 · 1k | 0 · 2u | 2 | 2 | 1 · 1k | +| `MPP-a6f3950ec9`* | draft-solana-charge-00.md § Shared Fields | 2 | 2 | — | 0 · 2u | 0 · 2u | 1 · 1k | 0 · 2u | 2 | 2 | 2 | | `MPP-0399450c79`* | draft-solana-charge-00.md § Split Recipient ATA Creation | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 1 | | `MPP-197d674f50`* | draft-solana-charge-00.md § Split Recipient ATA Creation | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 1 | | `MPP-304370cfc4`* | draft-solana-charge-00.md § Split Recipient ATA Creation | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 1 | | `MPP-438c3bfb12`* | draft-solana-charge-00.md § Split Recipient ATA Creation | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 1 | | `MPP-681f5e090f`* | draft-solana-charge-00.md § Split Recipient ATA Creation | 2 | 1 · 1k | — | 2 | 2 | 2 | 2 | 2 | 0 · 2u | 2 | | `MPP-74cf327879`* | draft-solana-charge-00.md § Split Recipient ATA Creation | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 1 | -| `MPP-ab401714b4`* | draft-solana-charge-00.md § Split Recipient ATA Creation | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 0 · 1k | +| `MPP-ab401714b4`* | draft-solana-charge-00.md § Split Recipient ATA Creation | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 1 | | `MPP-b333c50e7e`* | draft-solana-charge-00.md § Split Recipient ATA Creation | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 1 | | `MPP-baa94f08cb`* | draft-solana-charge-00.md § Split Recipient ATA Creation | 2 | 0 · 2k | — | 2 | 2 | 2 | 2 | 2 | 0 · 2u | 2 | | `MPP-d63913e921`* | draft-solana-charge-00.md § Split Recipient ATA Creation | 2 | 1 · 1k | — | 2 | 2 | 2 | 2 | 2 | 0 · 2u | 2 | @@ -410,7 +413,7 @@ come from the same extraction as `pkc req-lint`. | `MPP-53a60f6563`* | draft-solana-session-00.md § Action: "open" | 1 | 0 · 1u | 0 · 1u | — | — | 0 · 1u | — | 1 | 0 · 1u | 0 · 1u | | `MPP-7126d3b0b5`* | draft-solana-session-00.md § Action: "open" | 3 | 0 · 3u | 0 · 3u | — | — | 0 · 3u | — | 3 | 0 · 3u | 0 · 3u | | `MPP-73f0b859d9`* | draft-solana-session-00.md § Action: "open" | 1 | 0 · 1u | 0 · 1u | — | — | 0 · 1u | — | 1 | 0 · 1u | 0 · 1u | -| `MPP-89f2059960`* | draft-solana-session-00.md § Action: "open" | 2 | 0 · 2u | 0 · 2u | — | — | 0 · 1u · 1k | — | 2 | 0 · 2u | 0 · 1u · 1k | +| `MPP-89f2059960`* | draft-solana-session-00.md § Action: "open" | 2 | 0 · 2u | 0 · 2u | — | — | 0 · 1u · 1k | — | 2 | 0 · 2u | 1 · 1u | | `MPP-a5edb594a1`* | draft-solana-session-00.md § Action: "open" | 3 | 0 · 3u | 0 · 3u | — | — | 1 · 2u | — | 3 | 0 · 3u | 1 · 2u | | `MPP-a9cb73c5b3`* | draft-solana-session-00.md § Action: "open" | 4 | 0 · 4u | 0 · 4u | — | — | 0 · 4u | — | 4 | 0 · 4u | 0 · 4u | | `MPP-a9eb047d07`* | draft-solana-session-00.md § Action: "open" | 2 | 0 · 2u | 0 · 2u | — | — | 1 · 1u | — | 2 | 0 · 2u | 1 · 1u | @@ -493,44 +496,44 @@ come from the same extraction as `pkc req-lint`. | `MPP-b87a0cd7d3`* | draft-solana-subscription-00.md § Account Ownership and Program-ID Validation | 2 | — | — | — | — | — | — | 2 | — | 0 · 2u | | `MPP-9255227955`* | draft-solana-subscription-00.md § Activation | 4 | — | — | — | — | — | — | 4 | — | 3 · 1k | | `MPP-e0965cb0fe`* | draft-solana-subscription-00.md § Activation | 2 | — | — | — | — | — | — | 2 | — | 2 | -| `MPP-4a9406cfcb`* | draft-solana-subscription-00.md § Amount and Period Verification | 4 | — | — | — | — | — | — | 4 | — | 3 · 1k | +| `MPP-4a9406cfcb`* | draft-solana-subscription-00.md § Amount and Period Verification | 4 | — | — | — | — | — | — | 4 | — | 4 | | `MPP-62866c1462`* | draft-solana-subscription-00.md § Amount and Period Verification | 4 | — | — | — | — | — | — | 4 | — | 4 | | `MPP-449b853cb2`* | draft-solana-subscription-00.md § Authorization Scope Verification | 1 | — | — | — | — | — | — | 1 | — | 1 | -| `MPP-89be025a89`* | draft-solana-subscription-00.md § Authorization Scope Verification | 13 | — | — | — | — | — | — | 13 | — | 11 · 2k | +| `MPP-89be025a89`* | draft-solana-subscription-00.md § Authorization Scope Verification | 13 | — | — | — | — | — | — | 13 | — | 13 | | `MPP-1ec64dcbc6`* | draft-solana-subscription-00.md § Bearer Proof Theft | 3 | — | — | — | — | — | — | 3 | — | 0 · 3u | | `MPP-9dab72f223`* | draft-solana-subscription-00.md § Cancellation | 1 | — | — | — | — | — | — | 1 | — | 0 · 1u | -| `MPP-5d14dd20cb`* | draft-solana-subscription-00.md § Currency Formats | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | -| `MPP-12c23b8418`* | draft-solana-subscription-00.md § Definition | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | +| `MPP-5d14dd20cb`* | draft-solana-subscription-00.md § Currency Formats | 1 | — | — | — | — | — | — | 1 | — | 1 | +| `MPP-12c23b8418`* | draft-solana-subscription-00.md § Definition | 1 | — | — | — | — | — | — | 1 | — | 1 | | `MPP-83bfc235ab`* | draft-solana-subscription-00.md § Destination Scoping | 1 | — | — | — | — | — | — | 1 | — | 1 | -| `MPP-1d44630921`* | draft-solana-subscription-00.md § Method Details | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | -| `MPP-327d9b66ba`* | draft-solana-subscription-00.md § Method Details | 2 | — | — | — | — | — | — | 2 | — | 0 · 2k | +| `MPP-1d44630921`* | draft-solana-subscription-00.md § Method Details | 1 | — | — | — | — | — | — | 1 | — | 1 | +| `MPP-327d9b66ba`* | draft-solana-subscription-00.md § Method Details | 2 | — | — | — | — | — | — | 2 | — | 2 | | `MPP-463ea35304`* | draft-solana-subscription-00.md § Method Details | 1 | — | — | — | — | — | — | 1 | — | 1 | | `MPP-4a98642d3c`* | draft-solana-subscription-00.md § Method Details | 1 | — | — | — | — | — | — | 1 | — | 1 | | `MPP-60413f3bf6`* | draft-solana-subscription-00.md § Method Details | 1 | — | — | — | — | — | — | 1 | — | 1 | -| `MPP-634239a4f5`* | draft-solana-subscription-00.md § Method Details | 2 | — | — | — | — | — | — | 2 | — | 0 · 2k | +| `MPP-634239a4f5`* | draft-solana-subscription-00.md § Method Details | 2 | — | — | — | — | — | — | 2 | — | 2 | | `MPP-7ebd75eefc`* | draft-solana-subscription-00.md § Method Details | 2 | — | — | — | — | — | — | 2 | — | 2 | | `MPP-f90bd07116`* | draft-solana-subscription-00.md § Method Details | 1 | — | — | — | — | — | — | 1 | — | 1 | -| `MPP-fc9334823a`* | draft-solana-subscription-00.md § Method Details | 3 | — | — | — | — | — | — | 3 | — | 0 · 3k | -| `MPP-58828c88cd`* | draft-solana-subscription-00.md § Optional Fields | 10 | — | — | — | — | — | — | 10 | — | 9 · 1k | -| `MPP-6739698bb1`* | draft-solana-subscription-00.md § Optional Fields | 2 | — | — | — | — | — | — | 2 | — | 0 · 2k | -| `MPP-95dab3a64d`* | draft-solana-subscription-00.md § Optional Fields | 3 | — | — | — | — | — | — | 3 | — | 0 · 3k | -| `MPP-aadffadc90`* | draft-solana-subscription-00.md § Optional Fields | 8 | — | — | — | — | — | — | 8 | — | 2 · 6k | +| `MPP-fc9334823a`* | draft-solana-subscription-00.md § Method Details | 3 | — | — | — | — | — | — | 3 | — | 3 | +| `MPP-58828c88cd`* | draft-solana-subscription-00.md § Optional Fields | 10 | — | — | — | — | — | — | 10 | — | 10 | +| `MPP-6739698bb1`* | draft-solana-subscription-00.md § Optional Fields | 2 | — | — | — | — | — | — | 2 | — | 2 | +| `MPP-95dab3a64d`* | draft-solana-subscription-00.md § Optional Fields | 3 | — | — | — | — | — | — | 3 | — | 3 | +| `MPP-aadffadc90`* | draft-solana-subscription-00.md § Optional Fields | 8 | — | — | — | — | — | — | 8 | — | 8 | | `MPP-d063521350`* | draft-solana-subscription-00.md § Optional Fields | 2 | — | — | — | — | — | — | 2 | — | 2 | -| `MPP-45b8ba4317`* | draft-solana-subscription-00.md § Payload | 3 | — | — | — | — | — | — | 3 | — | 2 · 1k | +| `MPP-45b8ba4317`* | draft-solana-subscription-00.md § Payload | 3 | — | — | — | — | — | — | 3 | — | 3 | | `MPP-52f835b76c`* | draft-solana-subscription-00.md § Payload | 3 | — | — | — | — | — | — | 3 | — | 3 | | `MPP-98987d4454`* | draft-solana-subscription-00.md § Payload | 1 | — | — | — | — | — | — | 1 | — | 1 | | `MPP-42cf63c8b8`* | draft-solana-subscription-00.md § Request Schema | 2 | — | — | — | — | — | — | 2 | — | 2 | | `MPP-cdbcb3a843`* | draft-solana-subscription-00.md § Required Fields | 3 | — | — | — | — | — | — | 3 | — | 3 | | `MPP-0a7c7d7791`* | draft-solana-subscription-00.md § Server Accounting and Idempotency | 14 | — | — | — | — | — | — | 14 | — | 2 · 12u | | `MPP-2bbba2b551`* | draft-solana-subscription-00.md § Shared Fields | 2 | — | — | — | — | — | — | 2 | — | 2 | -| `MPP-0e0da9c6a6`* | draft-solana-subscription-00.md § Source Verification | 2 | — | — | — | — | — | — | 2 | — | 0 · 2k | +| `MPP-0e0da9c6a6`* | draft-solana-subscription-00.md § Source Verification | 2 | — | — | — | — | — | — | 2 | — | 2 | | `MPP-afd07e174b`* | draft-solana-subscription-00.md § Source Verification | 2 | — | — | — | — | — | — | 2 | — | 2 | -| `MPP-11cddfe4f2`* | draft-solana-subscription-00.md § Subscription Bearer Proof | 8 | — | — | — | — | — | — | 8 | — | 1 · 2u · 5k | -| `MPP-8a193ab322`* | draft-solana-subscription-00.md § Subscription Bearer Proof | 4 | — | — | — | — | — | — | 4 | — | 3 · 1k | +| `MPP-11cddfe4f2`* | draft-solana-subscription-00.md § Subscription Bearer Proof | 8 | — | — | — | — | — | — | 8 | — | 6 · 2u | +| `MPP-8a193ab322`* | draft-solana-subscription-00.md § Subscription Bearer Proof | 4 | — | — | — | — | — | — | 4 | — | 4 | | `MPP-9edde7b556`* | draft-solana-subscription-00.md § Subscription Bearer Proof | 4 | 0 · 2u | 0 · 2u | — | — | 2 | — | 4 | 0 · 2u | 4 | | `MPP-dcaa3d63c8`* | draft-solana-subscription-00.md § Subscription Bearer Proof | 6 | — | — | — | — | — | — | 6 | — | 6 | | `MPP-ef1bb057fc`* | draft-solana-subscription-00.md § Subscription Bearer Proof | 10 | — | — | — | — | — | — | 10 | — | 10 | -| `MPPTX-507629a4fa`* | draft-solana-charge-00.md § Fee Payer Configuration | 3 | 0 · 3k | — | 0 · 2u · 1k | 0 · 2u · 1k | 0 · 3k | 1 · 2u | 3 | 0 · 1u · 2k | 0 · 3k | +| `MPPTX-507629a4fa`* | draft-solana-charge-00.md § Fee Payer Configuration | 3 | 0 · 3k | — | 0 · 2u · 1k | 0 · 2u · 1k | 0 · 3k | 1 · 2u | 3 | 0 · 1u · 2k | 1 · 2k | | `MPPTX-102b6dc2a5`* | draft-solana-charge-00.md § Method Details | 19 | 2 · 7u · 10k | 0 · 7u | 2 · 10k | 2 · 10k | 2 · 2u · 15k | 2 · 10k | 19 | 0 · 14u · 5k | 2 · 2u · 15k | | `MPPTX-6e9ac6c31d`* | draft-solana-charge-00.md § Native SOL Verification | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 1 | 0 · 1k | 1 | 0 · 1u | 0 · 1k | | `MPPTX-96ba338b1e`* | draft-solana-charge-00.md § SPL Token Verification | 3 | 0 · 3k | — | 0 · 3k | 0 · 3k | 3 | 0 · 3k | 3 | 0 · 3u | 0 · 3k | @@ -538,100 +541,102 @@ come from the same extraction as `pkc req-lint`. | `MPPTX-c483036092`* | draft-solana-charge-00.md § Transaction Payload Security | 2 | 0 · 2k | — | 0 · 2k | 0 · 2k | 1 · 1k | 0 · 2k | 2 | 0 · 2u | 0 · 2k | | `MPPTX-4f1a73dd49`* | draft-solana-charge-00.md § Transaction Payload — Pull Mode | 3 | 0 · 3k | — | 0 · 3k | 0 · 3k | 0 · 3k | 0 · 3k | 3 | 0 · 3u | 0 · 3k | | `MPPTX-d5e5d796c6`* | draft-solana-charge-00.md § Transaction Payload — Pull Mode | 4 | 0 · 4k | — | 0 · 1u · 3k | 0 · 1u · 3k | 1 · 3k | 0 · 1u · 3k | 4 | 0 · 3u · 1k | 0 · 4k | -| `MPPTX-f8468a31de`* | draft-solana-charge-00.md § Transaction Payload — Pull Mode | 2 | 0 · 2k | — | 0 · 2k | 0 · 2k | 0 · 2k | 0 · 2k | 2 | 0 · 2u | 0 · 2k | +| `MPPTX-f8468a31de`* | draft-solana-charge-00.md § Transaction Payload — Pull Mode | 2 | 0 · 2k | — | 0 · 2k | 0 · 2k | 0 · 2k | 0 · 2k | 2 | 0 · 2u | 1 · 1k | | `MPPTX-27a6fd4f3f`* | draft-solana-charge-00.md § Transaction Versions | 6 | 0 · 1u · 5k | 0 · 1u | 0 · 5k | 1 · 4k | 0 · 1u · 5k | 0 · 5k | 6 | 0 · 6u | 1 · 1u · 4k | | `MPPTX-2855caa59a`* | draft-solana-charge-00.md § Transaction Versions | 1 | 0 · 1k | — | 0 · 1k | 1 | 0 · 1k | 0 · 1k | 1 | 0 · 1u | 1 | -| `MPPTX-3f51d8e008`* | draft-solana-charge-00.md § Transaction Versions | 3 | 0 · 3k | — | 0 · 1u · 2k | 0 · 1u · 2k | 0 · 3k | 0 · 1u · 2k | 3 | 0 · 2u · 1k | 0 · 3k | +| `MPPTX-3f51d8e008`* | draft-solana-charge-00.md § Transaction Versions | 3 | 0 · 3k | — | 0 · 1u · 2k | 0 · 1u · 2k | 0 · 3k | 0 · 1u · 2k | 3 | 0 · 2u · 1k | 1 · 2k | | `MPPTX-46848f6fce`* | draft-solana-charge-00.md § Transaction Versions | 2 | 0 · 1u · 1k | 0 · 1u | 0 · 1k | 0 · 1k | 0 · 1u · 1k | 0 · 1k | 2 | 0 · 2u | 0 · 1u · 1k | | `MPPTX-5b29a4494f`* | draft-solana-charge-00.md § Transaction Versions | 5 | 0 · 2u · 3k | 0 · 2u | 0 · 3k | 0 · 3k | 0 · 1u · 4k | 0 · 3k | 5 | 0 · 4u · 1k | 0 · 1u · 4k | | `MPPTX-8a036b6610`* | draft-solana-charge-00.md § Transaction Versions | 2 | 0 · 1u · 1k | 0 · 1u | 0 · 1k | 0 · 1k | 0 · 1u · 1k | 0 · 1k | 2 | 0 · 2u | 0 · 1u · 1k | | `MPPTX-8a988b0f7a`* | draft-solana-charge-00.md § Transaction Versions | 6 | 0 · 1u · 5k | 0 · 1u | 0 · 5k | 0 · 5k | 0 · 1u · 5k | 0 · 5k | 6 | 0 · 6u | 0 · 1u · 5k | | `MPPTX-d180d03a99`* | draft-solana-charge-00.md § Transaction Versions | 11 | 3 · 8k | — | 0 · 11u | 0 · 11u | 3 · 8k | 0 · 11u | 11 | 3 · 8k | 2 · 2u · 7k | -| `MPPTX-d53a9f42dd`* | draft-solana-charge-00.md § Transaction Versions | 3 | 0 · 1u · 2k | 0 · 1u | 0 · 2k | 0 · 2k | 0 · 1u · 2k | 2 | 3 | 0 · 3u | 0 · 1u · 2k | +| `MPPTX-d53a9f42dd`* | draft-solana-charge-00.md § Transaction Versions | 3 | 0 · 1u · 2k | 0 · 1u | 0 · 2k | 0 · 2k | 0 · 1u · 2k | 2 | 3 | 0 · 3u | 2 · 1u | | `MPPTX-5410e1de47`* | draft-solana-session-00.md § Action: "open" | 7 | 0 · 7u | 0 · 7u | — | — | 0 · 5u · 2k | — | 7 | 0 · 7u | 0 · 5u · 2k | | `MPPTX-4563533e08`* | draft-solana-session-00.md § Action: "topUp" | 1 | 0 · 1u | 0 · 1u | — | — | 0 · 1k | — | 1 | 0 · 1u | 0 · 1k | -| `X402-063b58b983`* | scheme_batch_settlement_svm.md § 3. Payment-Channel Method | 5 | — | — | — | — | — | — | 5 | — | 0 · 1u · 4k | -| `X402-556df29ac2`* | scheme_batch_settlement_svm.md § 3. Payment-Channel Method | 2 | — | — | — | — | — | — | 2 | — | 0 · 1u · 1k | +| `X402-063b58b983`* | scheme_batch_settlement_svm.md § 3. Payment-Channel Method | 5 | — | — | — | — | — | — | 5 | — | 4 · 1u | +| `X402-556df29ac2`* | scheme_batch_settlement_svm.md § 3. Payment-Channel Method | 2 | — | — | — | — | — | — | 2 | — | 1 · 1u | | `X402-c0dd3bd5b3`* | scheme_batch_settlement_svm.md § 3. Payment-Channel Method | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-1230bb35a3`* | scheme_batch_settlement_svm.md § 4.1 PaymentRequirements (in PAYMENT-REQUIRED.accepts[]) | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-180abaa115`* | scheme_batch_settlement_svm.md § 4.1 PaymentRequirements (in PAYMENT-REQUIRED.accepts[]) | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-7556a4ec7c`* | scheme_batch_settlement_svm.md § 4.1 PaymentRequirements (in PAYMENT-REQUIRED.accepts[]) | 5 | — | — | — | — | — | — | 5 | — | 4 · 1u | -| `X402-bde1322bb3`* | scheme_batch_settlement_svm.md § 4.1 PaymentRequirements (in PAYMENT-REQUIRED.accepts[]) | 2 | — | — | — | — | — | — | 2 | — | 1 · 1k | +| `X402-bde1322bb3`* | scheme_batch_settlement_svm.md § 4.1 PaymentRequirements (in PAYMENT-REQUIRED.accepts[]) | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-df15443ca9`* | scheme_batch_settlement_svm.md § 4.1 PaymentRequirements (in PAYMENT-REQUIRED.accepts[]) | 1 | — | — | — | — | — | — | 1 | — | 1 | -| `X402-f265c321e3`* | scheme_batch_settlement_svm.md § 4.1 PaymentRequirements (in PAYMENT-REQUIRED.accepts[]) | 4 | — | — | — | — | — | — | 4 | — | 2 · 2k | -| `X402-22712c36e1`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | +| `X402-f265c321e3`* | scheme_batch_settlement_svm.md § 4.1 PaymentRequirements (in PAYMENT-REQUIRED.accepts[]) | 4 | — | — | — | — | — | — | 4 | — | 4 | +| `X402-22712c36e1`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-23747f44c3`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-2f8ea170e2`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 1 | — | — | — | — | — | — | 1 | — | 1 | -| `X402-87c5fe8803`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 5 | — | — | — | — | — | — | 5 | — | 0 · 5k | +| `X402-87c5fe8803`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 5 | — | — | — | — | — | — | 5 | — | 5 | | `X402-a2dd2eb911`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-ae5ee4f564`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-d171becfd9`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 2 | — | — | — | — | — | — | 2 | — | 1 · 1k | | `X402-d71a021041`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 2 | — | — | — | — | — | — | 2 | — | 1 · 1u | -| `X402-f0a4201d93`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 2 | — | — | — | — | — | — | 2 | — | 1 · 1k | +| `X402-f0a4201d93`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-fb76d46cb8`* | scheme_batch_settlement_svm.md § 4.2 Shared Wire Objects and Program Mapping | 7 | — | — | — | — | — | — | 7 | — | 7 | | `X402-24cd5fed02`* | scheme_batch_settlement_svm.md § 4.3 Client PaymentPayload Variants | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-492eabbfab`* | scheme_batch_settlement_svm.md § 4.3 Client PaymentPayload Variants | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-62a1b36ba4`* | scheme_batch_settlement_svm.md § 4.3 Client PaymentPayload Variants | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-cee6662254`* | scheme_batch_settlement_svm.md § 4.3 Client PaymentPayload Variants | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-e98b9b9bec`* | scheme_batch_settlement_svm.md § 4.3 Client PaymentPayload Variants | 2 | — | — | — | — | — | — | 2 | — | 1 · 1u | -| `X402-fa34804f1b`* | scheme_batch_settlement_svm.md § 4.3 Client PaymentPayload Variants | 5 | — | — | — | — | — | — | 5 | — | 1 · 1u · 3k | +| `X402-fa34804f1b`* | scheme_batch_settlement_svm.md § 4.3 Client PaymentPayload Variants | 5 | — | — | — | — | — | — | 5 | — | 4 · 1u | | `X402-5ebca343d1`* | scheme_batch_settlement_svm.md § 4.4 SettlementResponse (in PAYMENT-RESPONSE) | 1 | — | — | — | — | — | — | 1 | — | 0 · 1u | | `X402-c3d9b43d25`* | scheme_batch_settlement_svm.md § 4.5 Facilitator Interface | 2 | — | — | — | — | — | — | 2 | — | 1 · 1u | -| `X402-d29d49ebde`* | scheme_batch_settlement_svm.md § 4.5 Facilitator Interface | 5 | — | — | — | — | — | — | 5 | — | 1 · 1u · 3k | +| `X402-d29d49ebde`* | scheme_batch_settlement_svm.md § 4.5 Facilitator Interface | 5 | — | — | — | — | — | — | 5 | — | 4 · 1u | | `X402-171a57666e`* | scheme_batch_settlement_svm.md § 4.6 Corrective PaymentRequired | 7 | — | — | — | — | — | — | 7 | — | 0 · 7u | | `X402-638126c26b`* | scheme_batch_settlement_svm.md § 4.6 Corrective PaymentRequired | 12 | — | — | — | — | — | — | 12 | — | 0 · 12u | | `X402-84916fe051`* | scheme_batch_settlement_svm.md § 8. Security Properties | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-f882f2074a`* | scheme_batch_settlement_svm.md § 8. Security Properties | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-0ff4cabcb4`* | scheme_batch_settlement_svm.md § Canonical open | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | -| `X402-176a26e5b6`* | scheme_batch_settlement_svm.md § Canonical open | 2 | — | — | — | — | — | — | 2 | — | 0 · 2k | -| `X402-5276aee847`* | scheme_batch_settlement_svm.md § Canonical refund request_close | 3 | — | — | — | — | — | — | 3 | — | 0 · 3k | -| `X402-a6092f0a02`* | scheme_batch_settlement_svm.md § Canonical refund request_close | 4 | — | — | — | — | — | — | 4 | — | 0 · 4k | -| `X402-c88cc9c766`* | scheme_batch_settlement_svm.md § Canonical refund request_close | 2 | — | — | — | — | — | — | 2 | — | 0 · 2k | -| `X402-d450762477`* | scheme_batch_settlement_svm.md § Canonical refund request_close | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | +| `X402-176a26e5b6`* | scheme_batch_settlement_svm.md § Canonical open | 1 | — | — | — | — | — | — | 1 | — | 1 | +| `X402-5276aee847`* | scheme_batch_settlement_svm.md § Canonical refund request_close | 3 | — | — | — | — | — | — | 3 | — | 3 | +| `X402-a6092f0a02`* | scheme_batch_settlement_svm.md § Canonical refund request_close | 4 | — | — | — | — | — | — | 4 | — | 4 | +| `X402-c88cc9c766`* | scheme_batch_settlement_svm.md § Canonical refund request_close | 2 | — | — | — | — | — | — | 2 | — | 2 | +| `X402-d450762477`* | scheme_batch_settlement_svm.md § Canonical refund request_close | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-014270dc81`* | scheme_batch_settlement_svm.md § Canonical top_up | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | -| `X402-06bb8f3a9e`* | scheme_batch_settlement_svm.md § Canonical top_up | 3 | — | — | — | — | — | — | 3 | — | 1 · 1u · 1k | +| `X402-06bb8f3a9e`* | scheme_batch_settlement_svm.md § Canonical top_up | 4 | — | — | — | — | — | — | 4 | — | 3 · 1u | | `X402-4cedb5114b`* | scheme_batch_settlement_svm.md § Canonical top_up | 2 | — | — | — | — | — | — | 2 | — | 1 · 1k | -| `X402-9ca40ae469`* | scheme_batch_settlement_svm.md § Canonical top_up | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | -| `X402-be2f5b7ea4`* | scheme_batch_settlement_svm.md § Canonical top_up | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | +| `X402-9ca40ae469`* | scheme_batch_settlement_svm.md § Canonical top_up | 1 | — | — | — | — | — | — | 1 | — | 1 | +| `X402-be2f5b7ea4`* | scheme_batch_settlement_svm.md § Canonical top_up | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-04b1c68ba2`* | scheme_batch_settlement_svm.md § GET /supported | 2 | — | — | — | — | — | — | 2 | — | 1 · 1u | -| `X402-129e295f0c`* | scheme_batch_settlement_svm.md § Message and signer rules | 2 | — | — | — | — | — | — | 2 | — | 0 · 1u · 1k | +| `X402-8f57677e36`* | scheme_batch_settlement_svm.md § GET /supported | 1 | — | — | — | — | — | — | 1 | — | 0 · 1u | +| `X402-129e295f0c`* | scheme_batch_settlement_svm.md § Message and signer rules | 2 | — | — | — | — | — | — | 2 | — | 1 · 1u | | `X402-13c8fefbbf`* | scheme_batch_settlement_svm.md § Message and signer rules | 3 | — | — | — | — | — | — | 3 | — | 2 · 1k | -| `X402-55d34e173c`* | scheme_batch_settlement_svm.md § Message and signer rules | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | +| `X402-55d34e173c`* | scheme_batch_settlement_svm.md § Message and signer rules | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-6ac6583e77`* | scheme_batch_settlement_svm.md § Message and signer rules | 1 | — | — | — | — | — | — | 1 | — | 1 | -| `X402-f729304bf1`* | scheme_batch_settlement_svm.md § Message and signer rules | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | -| `X402-3679bfc55e`* | scheme_batch_settlement_svm.md § POST /settle | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | +| `X402-f729304bf1`* | scheme_batch_settlement_svm.md § Message and signer rules | 1 | — | — | — | — | — | — | 1 | — | 1 | +| `X402-3679bfc55e`* | scheme_batch_settlement_svm.md § POST /settle | 1 | — | — | — | — | — | — | 1 | — | 0 · 1u | | `X402-45c411d301`* | scheme_batch_settlement_svm.md § POST /settle | 1 | — | — | — | — | — | — | 1 | — | 1 | -| `X402-7f4ee54a73`* | scheme_batch_settlement_svm.md § POST /settle | 5 | — | — | — | — | — | — | 5 | — | 5 | -| `X402-a8645e7833`* | scheme_batch_settlement_svm.md § POST /settle | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | -| `X402-d167f9a958`* | scheme_batch_settlement_svm.md § POST /settle | 2 | — | — | — | — | — | — | 2 | — | 1 · 1k | -| `X402-dcd8fcf77b`* | scheme_batch_settlement_svm.md § POST /settle | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | +| `X402-76654742e7`* | scheme_batch_settlement_svm.md § POST /settle | 5 | — | — | — | — | — | — | 5 | — | 5 | +| `X402-a8645e7833`* | scheme_batch_settlement_svm.md § POST /settle | 1 | — | — | — | — | — | — | 1 | — | 1 | +| `X402-c2ca42b7a4`* | scheme_batch_settlement_svm.md § POST /settle | 3 | — | — | — | — | — | — | 3 | — | 3 | +| `X402-d167f9a958`* | scheme_batch_settlement_svm.md § POST /settle | 2 | — | — | — | — | — | — | 2 | — | 1 · 1u | +| `X402-dcd8fcf77b`* | scheme_batch_settlement_svm.md § POST /settle | 1 | — | — | — | — | — | — | 1 | — | 0 · 1u | | `X402-f5205e3932`* | scheme_batch_settlement_svm.md § POST /settle | 3 | — | — | — | — | — | — | 3 | — | 3 | | `X402-2ae0fdc5c6`* | scheme_batch_settlement_svm.md § POST /verify | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-3485cafa46`* | scheme_batch_settlement_svm.md § POST /verify | 8 | — | — | — | — | — | — | 8 | — | 8 | -| `X402-fbdea947ae`* | scheme_batch_settlement_svm.md § POST /verify | 3 | — | — | — | — | — | — | 3 | — | 0 · 3k | +| `X402-fbdea947ae`* | scheme_batch_settlement_svm.md § POST /verify | 3 | — | — | — | — | — | — | 3 | — | 2 · 1k | | `X402-4ea8d1b0d9`* | scheme_batch_settlement_svm.md § Phase 1 - Open or Top Up | 2 | — | — | — | — | — | — | 2 | — | 2 | -| `X402-d16b3abbab`* | scheme_batch_settlement_svm.md § Phase 1 - Open or Top Up | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | +| `X402-d16b3abbab`* | scheme_batch_settlement_svm.md § Phase 1 - Open or Top Up | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-f0d0755fc9`* | scheme_batch_settlement_svm.md § Phase 1 - Open or Top Up | 2 | — | — | — | — | — | — | 2 | — | 0 · 2k | | `X402-2073737c58`* | scheme_batch_settlement_svm.md § Phase 3 - Voucher Acceptance (before serving) | 2 | — | — | — | — | — | — | 2 | — | 1 · 1u | | `X402-46d0a12f84`* | scheme_batch_settlement_svm.md § Phase 3 - Voucher Acceptance (before serving) | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-5b328b9a73`* | scheme_batch_settlement_svm.md § Phase 3 - Voucher Acceptance (before serving) | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-91ecad3faa`* | scheme_batch_settlement_svm.md § Phase 3 - Voucher Acceptance (before serving) | 2 | — | — | — | — | — | — | 2 | — | 2 | -| `X402-a6efa8062a`* | scheme_batch_settlement_svm.md § Phase 3 - Voucher Acceptance (before serving) | 22 | — | — | — | — | — | — | 22 | — | 12 · 6u · 4k | -| `X402-15a1a9834e`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 3 | — | — | — | — | — | — | 3 | — | 0 · 3k | -| `X402-3ed2ac9962`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | -| `X402-536163eb05`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 2 | — | — | — | — | — | — | 2 | — | 0 · 2k | +| `X402-a6efa8062a`* | scheme_batch_settlement_svm.md § Phase 3 - Voucher Acceptance (before serving) | 22 | — | — | — | — | — | — | 22 | — | 13 · 9u | +| `X402-15a1a9834e`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 3 | — | — | — | — | — | — | 3 | — | 3 | +| `X402-3ed2ac9962`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 1 | — | — | — | — | — | — | 1 | — | 1 | +| `X402-536163eb05`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-897add7b39`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 1 | — | — | — | — | — | — | 1 | — | 1 | -| `X402-a93234f1d7`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 5 | — | — | — | — | — | — | 5 | — | 1 · 4k | -| `X402-ae18578132`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 2 | — | — | — | — | — | — | 2 | — | 1 · 1k | -| `X402-ebd20058fd`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 3 | — | — | — | — | — | — | 3 | — | 0 · 3k | +| `X402-a93234f1d7`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 5 | — | — | — | — | — | — | 5 | — | 5 | +| `X402-ae18578132`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 2 | — | — | — | — | — | — | 2 | — | 2 | +| `X402-ebd20058fd`* | scheme_batch_settlement_svm.md § Top-level instruction layout | 3 | — | — | — | — | — | — | 3 | — | 3 | | `X402-8fcdf05fbf`* | scheme_exact.md § Client-submitted (payment proof) | 2 | 2 | — | 2 | 2 | 2 | 2 | 2 | 0 · 2u | 2 | | `X402-f870a56d25`* | scheme_exact.md § Client-submitted (payment proof) | 19 | 19 | — | 9 · 10u | 9 · 10u | 19 | 9 · 10u | 19 | 10 · 9u | 12 · 7u | -| `X402-fc2225a882`* | scheme_exact.md § Critical Validation Requirements | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 0 · 1k | 0 · 1k | 1 | 0 · 1u | 0 · 1k | +| `X402-fc2225a882`* | scheme_exact.md § Critical Validation Requirements | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 1 | | `X402-f45fed3f51`* | scheme_exact.md § SVM | 3 | 3 | — | 2 · 1u | 2 · 1u | 3 | 2 · 1u | 3 | 1 · 2u | 3 | | `X402-2f0d5ef017`* | scheme_exact_svm.md § 1.4 Exactly One Matching Transfer (MUST) | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 1 | -| `X402-516a2d7b57`* | scheme_exact_svm.md § 1.4 Exactly One Matching Transfer (MUST) | 3 | 3 | — | 3 | 3 | 3 | 3 | 3 | 0 · 3u | 2 · 1k | +| `X402-516a2d7b57`* | scheme_exact_svm.md § 1.4 Exactly One Matching Transfer (MUST) | 3 | 3 | — | 3 | 3 | 3 | 3 | 3 | 0 · 3u | 3 | | `X402-bac6bc288a`* | scheme_exact_svm.md § 1.4 Exactly One Matching Transfer (MUST) | 3 | 3 | — | 3 | 3 | 3 | 3 | 3 | 0 · 3u | 3 | -| `X402-ee90546220`* | scheme_exact_svm.md § 1.4 Exactly One Matching Transfer (MUST) | 4 | 4 | — | 4 | 4 | 4 | 4 | 4 | 0 · 4u | 3 · 1k | +| `X402-ee90546220`* | scheme_exact_svm.md § 1.4 Exactly One Matching Transfer (MUST) | 4 | 4 | — | 4 | 4 | 4 | 4 | 4 | 0 · 4u | 4 | | `X402-93650bf2e3`* | scheme_exact_svm.md § 2.1 Minimal Safety Baseline (Normative MUSTs) | 3 | 3 | — | 2 · 1k | 2 · 1k | 2 · 1k | 3 | 3 | 0 · 3u | 3 | | `X402-0ad718daab`* | scheme_exact_svm.md § 2.1.1 Fee Payer Isolation (MUST) | 1 | 1 | — | 0 · 1k | 0 · 1k | 0 · 1k | 1 | 1 | 0 · 1u | 1 | | `X402-6708749c55`* | scheme_exact_svm.md § 2.1.1 Fee Payer Isolation (MUST) | 2 | 2 | — | 1 · 1k | 1 · 1k | 1 · 1k | 2 | 2 | 0 · 2u | 2 | @@ -639,9 +644,9 @@ come from the same extraction as `pkc req-lint`. | `X402-985ecc1ea3`* | scheme_exact_svm.md § 2.1.3 Fee Payer Fund Safety (MUST) | 1 | 1 | — | 0 · 1k | 0 · 1k | 0 · 1k | 1 | 1 | 0 · 1u | 1 | | `X402-27bff260c3`* | scheme_exact_svm.md § 2.1.4 Signer Set Integrity (MUST) | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 0 · 1k | 0 · 1k | 1 | 0 · 1u | 0 · 1k | | `X402-9b240d95a0`* | scheme_exact_svm.md § 2.1.4 Signer Set Integrity (MUST) | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 0 · 1k | 0 · 1k | 1 | 0 · 1u | 0 · 1k | +| `X402-05c2aacafc`* | scheme_exact_svm.md § 3.1 Path 1 — Static Layout Verification (standard wallets) | 4 | 4 | — | 4 | 4 | 4 | 4 | 4 | 0 · 4u | 4 | | `X402-6b3e9350c8`* | scheme_exact_svm.md § 3.1 Path 1 — Static Layout Verification (standard wallets) | 7 | 5 | — | 0 · 5u | 0 · 5u | 5 | 0 · 5u | 7 | 5 | 5 · 2u | | `X402-a1cf65b0f0`* | scheme_exact_svm.md § 3.1 Path 1 — Static Layout Verification (standard wallets) | 1 | 1 | — | 1 | 1 | 1 | 1 | 1 | 0 · 1u | 1 | -| `X402-a8bd75d71b`* | scheme_exact_svm.md § 3.1 Path 1 — Static Layout Verification (standard wallets) | 4 | 4 | — | 4 | 4 | 4 | 4 | 4 | 0 · 4u | 4 | | `X402-c9a227ad88`* | scheme_exact_svm.md § 3.1 Path 1 — Static Layout Verification (standard wallets) | 3 | 3 | — | 3 | 3 | 3 | 3 | 3 | 0 · 3u | 3 | | `X402-d844c67736`* | scheme_exact_svm.md § 3.4 Post-Settlement Verification (TOCTOU defense) | 2 | 2 | — | 2 | 2 | 2 | 2 | 2 | 0 · 2u | 2 | | `X402-d5f1ded529`* | scheme_exact_svm.md § PaymentRequirements for exact | 4 | 1 | — | 0 · 1u | 0 · 1u | 1 | 0 · 1u | 4 | 1 | 4 | @@ -660,8 +665,8 @@ come from the same extraction as `pkc req-lint`. | `X402-99f2a389e8`* | scheme_upto_svm.md § 4.2 UptoPayload (in PAYMENT-SIGNATURE.payload) | 3 | — | — | — | — | — | — | 3 | — | 3 | | `X402-cf373442ff`* | scheme_upto_svm.md § 4.2 UptoPayload (in PAYMENT-SIGNATURE.payload) | 3 | — | — | — | — | — | — | 3 | — | 3 | | `X402-d75fb10a6f`* | scheme_upto_svm.md § 4.2 UptoPayload (in PAYMENT-SIGNATURE.payload) | 17 | — | — | — | — | — | — | 17 | — | 16 · 1k | -| `X402-eace5aece9`* | scheme_upto_svm.md § 4.2 UptoPayload (in PAYMENT-SIGNATURE.payload) | 5 | — | — | — | — | — | — | 5 | — | 3 · 1u · 1k | -| `X402-3b5914a7c5`* | scheme_upto_svm.md § 8. Security Properties | 4 | — | — | — | — | — | — | 4 | — | 2 · 2k | +| `X402-eace5aece9`* | scheme_upto_svm.md § 4.2 UptoPayload (in PAYMENT-SIGNATURE.payload) | 4 | — | — | — | — | — | — | 4 | — | 3 · 1u | +| `X402-3b5914a7c5`* | scheme_upto_svm.md § 8. Security Properties | 4 | — | — | — | — | — | — | 4 | — | 4 | | `X402-076bb2bdc3`* | scheme_upto_svm.md § Canonical open instruction | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | | `X402-14b8b2b598`* | scheme_upto_svm.md § Canonical open instruction | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-4c364688fc`* | scheme_upto_svm.md § Canonical open instruction | 1 | — | — | — | — | — | — | 1 | — | 1 | @@ -671,48 +676,51 @@ come from the same extraction as `pkc req-lint`. | `X402-e829ad118e`* | scheme_upto_svm.md § Canonical open instruction | 15 | — | — | — | — | — | — | 15 | — | 15 | | `X402-52c9f1e405`* | scheme_upto_svm.md § Client-supplied openTransaction acceptance policy | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-005b043052`* | scheme_upto_svm.md § Message and signer rules | 4 | — | — | — | — | — | — | 4 | — | 4 | +| `X402-4de59a1f27`* | scheme_upto_svm.md § Message and signer rules | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-9af8f33cd6`* | scheme_upto_svm.md § Message and signer rules | 2 | — | — | — | — | — | — | 2 | — | 2 | -| `X402-9d68660de5`* | scheme_upto_svm.md § Message and signer rules | 2 | — | — | — | — | — | — | 2 | — | 1 · 1k | +| `X402-9d68660de5`* | scheme_upto_svm.md § Message and signer rules | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-bcbf7025e5`* | scheme_upto_svm.md § Message and signer rules | 2 | — | — | — | — | — | — | 2 | — | 2 | -| `X402-c1174b72d8`* | scheme_upto_svm.md § Message and signer rules | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-f747c74e76`* | scheme_upto_svm.md § Phase 2 - Authorization | 1 | — | — | — | — | — | — | 1 | — | 1 | | `X402-11bbb0287f`* | scheme_upto_svm.md § Top-level instruction layout | 1 | — | — | — | — | — | — | 1 | — | 1 | -| `X402-233dcf8a3e`* | scheme_upto_svm.md § Top-level instruction layout | 5 | — | — | — | — | — | — | 5 | — | 3 · 2k | +| `X402-233dcf8a3e`* | scheme_upto_svm.md § Top-level instruction layout | 5 | — | — | — | — | — | — | 5 | — | 5 | | `X402-443a167ea1`* | scheme_upto_svm.md § Top-level instruction layout | 4 | — | — | — | — | — | — | 4 | — | 4 | -| `X402-683361bbae`* | scheme_upto_svm.md § Top-level instruction layout | 3 | — | — | — | — | — | — | 3 | — | 2 · 1k | +| `X402-683361bbae`* | scheme_upto_svm.md § Top-level instruction layout | 3 | — | — | — | — | — | — | 3 | — | 3 | | `X402-7cd3ca69a6`* | scheme_upto_svm.md § Top-level instruction layout | 2 | — | — | — | — | — | — | 2 | — | 2 | | `X402-b2b604a864`* | scheme_upto_svm.md § Top-level instruction layout | 4 | — | — | — | — | — | — | 4 | — | 4 | -| `X402-b4167aad45`* | scheme_upto_svm.md § Top-level instruction layout | 6 | — | — | — | — | — | — | 6 | — | 3 · 3k | +| `X402-b4167aad45`* | scheme_upto_svm.md § Top-level instruction layout | 6 | — | — | — | — | — | — | 6 | — | 6 | | `X402-c8544c0fdd`* | scheme_upto_svm.md § Top-level instruction layout | 3 | — | — | — | — | — | — | 3 | — | 3 | -| `X402-ce3692afe0`* | scheme_upto_svm.md § Top-level instruction layout | 17 | — | — | — | — | — | — | 17 | — | 12 · 5k | +| `X402-ce3692afe0`* | scheme_upto_svm.md § Top-level instruction layout | 17 | — | — | — | — | — | — | 17 | — | 17 | | `X402-d0ce5e5325`* | scheme_upto_svm.md § Top-level instruction layout | 3 | — | — | — | — | — | — | 3 | — | 3 | | `X402-d46a6b2b3b`* | scheme_upto_svm.md § Top-level instruction layout | 2 | — | — | — | — | — | — | 2 | — | 2 | -| `X402TX-4750df8921`* | scheme_batch_settlement_svm.md § 4.3 Client PaymentPayload Variants | 1 | — | — | — | — | — | — | 1 | — | 0 · 1k | +| `X402TX-4750df8921`* | scheme_batch_settlement_svm.md § 4.3 Client PaymentPayload Variants | 1 | — | — | — | — | — | — | 1 | — | 0 · 1u | | `X402TX-f39a33ff74`* | scheme_batch_settlement_svm.md § Transaction versions | 4 | 0 · 2k | — | 0 · 2k | 0 · 2u | 0 · 2u | 0 · 2k | 4 | 0 · 2k | 2 · 2u | -| `X402TX-516a2d7b57`* | scheme_exact_svm.md § 1.4 Exactly One Matching Transfer (MUST) | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 0 · 1k | 0 · 1k | 1 | 0 · 1u | 0 · 1u | -| `X402TX-ee90546220`* | scheme_exact_svm.md § 1.4 Exactly One Matching Transfer (MUST) | 3 | 0 · 3k | — | 0 · 3k | 0 · 3k | 0 · 3k | 0 · 3k | 3 | 0 · 3u | 0 · 3u | -| `X402TX-24efe57db3`* | scheme_exact_svm.md § 1.5 Transaction Versions (MUST) | 4 | 1 · 3k | — | 1 · 3k | 1 · 3k | 1 · 3k | 1 · 3k | 4 | 0 · 4u | 0 · 2u · 2k | -| `X402TX-2909c4b4ec`* | scheme_exact_svm.md § 1.5 Transaction Versions (MUST) | 5 | 0 · 3k | — | 0 · 3u | 0 · 3u | 0 · 3k | 0 · 3u | 5 | 0 · 3k | 0 · 1u · 4k | -| `X402TX-61c735c7a9`* | scheme_exact_svm.md § 1.5 Transaction Versions (MUST) | 11 | 3 · 4k | — | 0 · 7u | 0 · 7u | 3 · 4k | 0 · 7u | 11 | 3 · 4k | 4 · 3u · 4k | -| `X402TX-644919eb3b`* | scheme_exact_svm.md § 1.5 Transaction Versions (MUST) | 10 | 3 | — | 3 | 3 | 1 · 2k | 0 · 3k | 10 | 0 · 3u | 0 · 3u · 7k | -| `X402TX-77742f428c`* | scheme_exact_svm.md § 1.5 Transaction Versions (MUST) | 2 | 0 · 1k | — | 0 · 1u | 0 · 1u | 0 · 1k | 0 · 1u | 2 | 0 · 1k | 1 · 1k | -| `X402TX-dc7b0f3305`* | scheme_exact_svm.md § 1.5 Transaction Versions (MUST) | 8 | 1 · 2k | — | 1 · 2k | 1 · 2k | 0 · 3k | 0 · 3k | 8 | 0 · 3u | 0 · 3u · 5k | -| `X402TX-9b240d95a0`* | scheme_exact_svm.md § 2.1.4 Signer Set Integrity (MUST) | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 1 | 0 · 1k | 1 | 0 · 1u | 0 · 1u | -| `X402TX-936b492daa`* | scheme_exact_svm.md § 2.2.1 Compute Budget Controls (SHOULD) | 3 | 1 | — | 1 | 1 | 1 | 0 · 1k | 3 | 0 · 1u | 0 · 1u · 2k | -| `X402TX-eb681e1701`* | scheme_exact_svm.md § 2.2.1 Compute Budget Controls (SHOULD) | 6 | 2 · 4k | — | 2 · 4k | 2 · 4k | 0 · 6k | 0 · 6k | 6 | 0 · 6u | 0 · 6u | -| `X402TX-2ad7a3f326`* | scheme_exact_svm.md § 3.1 Path 1 — Static Layout Verification (standard wallets) | 2 | 0 · 2k | — | 0 · 2k | 0 · 2k | 0 · 2k | 0 · 2k | 2 | 0 · 2u | 0 · 2u | -| `X402TX-d188782061`* | scheme_exact_svm.md § 3.1 Path 1 — Static Layout Verification (standard wallets) | 3 | 0 · 3k | — | 0 · 3k | 0 · 3k | 0 · 3k | 0 · 3k | 3 | 0 · 3u | 0 · 3u | -| `X402TX-bc031b7add`* | scheme_exact_svm.md § 3.2 Path 2 — Simulation-Based Smart Wallet Verification | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 0 · 1k | 0 · 1k | 1 | 0 · 1u | 0 · 1u | -| `X402TX-dd5384e0fe`* | scheme_exact_svm.md § 3.2 Path 2 — Simulation-Based Smart Wallet Verification | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 0 · 1k | 0 · 1k | 1 | 0 · 1u | 0 · 1u | -| `X402TX-f9c2b66234`* | scheme_exact_svm.md § 3.2 Path 2 — Simulation-Based Smart Wallet Verification | 2 | 0 · 2k | — | 0 · 2k | 0 · 2k | 0 · 2k | 0 · 2k | 2 | 0 · 2u | 0 · 2u | -| `X402TX-10b3fe2ef3`* | scheme_exact_svm.md § PaymentPayload payload Field | 5 | 2 · 3k | — | 1 · 2u · 2k | 1 · 2u · 2k | 2 · 3k | 1 · 2u · 2k | 5 | 1 · 3u · 1k | 1 · 2u · 2k | -| `X402TX-d444d01b9e`* | scheme_upto_svm.md § 4.2 UptoPayload (in PAYMENT-SIGNATURE.payload) | 3 | — | — | — | — | — | — | 3 | — | 0 · 3k | -| `X402TX-4de59a1f27`* | scheme_upto_svm.md § Message and signer rules | 6 | — | — | — | — | — | — | 6 | — | 1 · 5k | -| `X402TX-0f874a9c63`* | scheme_upto_svm.md § Top-level instruction layout | 14 | — | — | — | — | — | — | 14 | — | 0 · 14k | -| `X402TX-125d312b26`* | scheme_upto_svm.md § Top-level instruction layout | 2 | — | — | — | — | — | — | 2 | — | 0 · 2k | -| `X402TX-5267172b18`* | scheme_upto_svm.md § Transaction versions | 4 | — | — | — | — | — | — | 4 | — | 0 · 4k | - -
Unmapped normative sentences by spec file and section (1305) +| `X402TX-516a2d7b57`* | scheme_exact_svm.md § 1.4 Exactly One Matching Transfer (MUST) | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 0 · 1k | 0 · 1k | 1 | 0 · 1u | 1 | +| `X402TX-ee90546220`* | scheme_exact_svm.md § 1.4 Exactly One Matching Transfer (MUST) | 3 | 0 · 3k | — | 0 · 3k | 0 · 3k | 0 · 3k | 0 · 3k | 3 | 0 · 3u | 3 | +| `X402TX-24efe57db3`* | scheme_exact_svm.md § 1.5 Transaction Versions (MUST) | 4 | 1 · 3k | — | 1 · 3k | 1 · 3k | 1 · 3k | 1 · 3k | 4 | 0 · 4u | 2 · 2u | +| `X402TX-2909c4b4ec`* | scheme_exact_svm.md § 1.5 Transaction Versions (MUST) | 5 | 0 · 3k | — | 0 · 3u | 0 · 3u | 0 · 3k | 0 · 3u | 5 | 0 · 3k | 5 | +| `X402TX-4cd70365fd`* | scheme_exact_svm.md § 1.5 Transaction Versions (MUST) | 1 | 1 | — | 1 | 1 | 1 | 0 · 1k | 1 | 0 · 1u | 1 | +| `X402TX-61c735c7a9`* | scheme_exact_svm.md § 1.5 Transaction Versions (MUST) | 11 | 3 · 4k | — | 0 · 7u | 0 · 7u | 3 · 4k | 0 · 7u | 11 | 3 · 4k | 10 · 1u | +| `X402TX-74fb884aa9`* | scheme_exact_svm.md § 1.5 Transaction Versions (MUST) | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 0 · 1k | 0 · 1k | 1 | 0 · 1u | 1 | +| `X402TX-77742f428c`* | scheme_exact_svm.md § 1.5 Transaction Versions (MUST) | 2 | 0 · 1k | — | 0 · 1u | 0 · 1u | 0 · 1k | 0 · 1u | 2 | 0 · 1k | 2 | +| `X402TX-927d17b62e`* | scheme_exact_svm.md § 1.5 Transaction Versions (MUST) | 2 | 0 · 2k | — | 0 · 2u | 0 · 2u | 0 · 2k | 0 · 2u | 2 | 0 · 2k | 2 | +| `X402TX-dc7b0f3305`* | scheme_exact_svm.md § 1.5 Transaction Versions (MUST) | 8 | 1 · 2k | — | 1 · 2k | 1 · 2k | 0 · 3k | 0 · 3k | 8 | 0 · 3u | 8 | +| `X402TX-f9bcc1a14a`* | scheme_exact_svm.md § 1.5 Transaction Versions (MUST) | 11 | 3 · 1k | — | 3 · 1k | 3 · 1k | 1 · 3k | 0 · 4k | 11 | 0 · 4u | 11 | +| `X402TX-9b240d95a0`* | scheme_exact_svm.md § 2.1.4 Signer Set Integrity (MUST) | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 1 | 0 · 1k | 1 | 0 · 1u | 0 · 1k | +| `X402TX-915632f040`* | scheme_exact_svm.md § 2.2.1 Compute Budget Controls (SHOULD) | 3 | 1 | — | 1 | 1 | 1 | 0 · 1k | 3 | 0 · 1u | 3 | +| `X402TX-997feeb51d`* | scheme_exact_svm.md § 2.2.1 Compute Budget Controls (SHOULD) | 9 | 3 · 6k | — | 3 · 6k | 3 · 6k | 0 · 9k | 0 · 9k | 9 | 0 · 9u | 8 · 1k | +| `X402TX-4c2fd60e66`* | scheme_exact_svm.md § 3.1 Path 1 — Static Layout Verification (standard wallets) | 3 | 0 · 3k | — | 0 · 3k | 0 · 3k | 0 · 3k | 0 · 3k | 3 | 0 · 3u | 3 | +| `X402TX-655bb4a79a`* | scheme_exact_svm.md § 3.1 Path 1 — Static Layout Verification (standard wallets) | 2 | 0 · 2k | — | 0 · 2k | 0 · 2k | 0 · 2k | 0 · 2k | 2 | 0 · 2u | 2 | +| `X402TX-bc031b7add`* | scheme_exact_svm.md § 3.2 Path 2 — Simulation-Based Smart Wallet Verification | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 0 · 1k | 0 · 1k | 1 | 0 · 1u | 1 | +| `X402TX-dd5384e0fe`* | scheme_exact_svm.md § 3.2 Path 2 — Simulation-Based Smart Wallet Verification | 1 | 0 · 1k | — | 0 · 1k | 0 · 1k | 0 · 1k | 0 · 1k | 1 | 0 · 1u | 1 | +| `X402TX-f9c2b66234`* | scheme_exact_svm.md § 3.2 Path 2 — Simulation-Based Smart Wallet Verification | 2 | 0 · 2k | — | 0 · 2k | 0 · 2k | 0 · 2k | 0 · 2k | 2 | 0 · 2u | 2 | +| `X402TX-10b3fe2ef3`* | scheme_exact_svm.md § PaymentPayload payload Field | 5 | 2 · 3k | — | 1 · 2u · 2k | 1 · 2u · 2k | 2 · 3k | 1 · 2u · 2k | 5 | 1 · 3u · 1k | 4 · 1u | +| `X402TX-d444d01b9e`* | scheme_upto_svm.md § 4.2 UptoPayload (in PAYMENT-SIGNATURE.payload) | 3 | — | — | — | — | — | — | 3 | — | 3 | +| `X402TX-4de59a1f27`* | scheme_upto_svm.md § Message and signer rules | 6 | — | — | — | — | — | — | 6 | — | 4 · 2u | +| `X402TX-125d312b26`* | scheme_upto_svm.md § Top-level instruction layout | 2 | — | — | — | — | — | — | 2 | — | 2 | +| `X402TX-703c03cfb5`* | scheme_upto_svm.md § Top-level instruction layout | 14 | — | — | — | — | — | — | 14 | — | 14 | +| `X402TX-5267172b18`* | scheme_upto_svm.md § Transaction versions | 4 | — | — | — | — | — | — | 4 | — | 0 · 4u | + +
Unmapped normative sentences by spec file and section (1460) | Spec file | Section | Normative | Mapped | Unmapped | | --- | --- | ---: | ---: | ---: | @@ -854,22 +862,41 @@ come from the same extraction as `pkc req-lint`. | `draft-solana-session-00.md` | Channel Exhaustion | 1 | 0 | 1 | | `draft-solana-session-00.md` | Clock Skew | 1 | 0 | 1 | | `draft-solana-session-00.md` | Solana Verification Programs | 1 | 0 | 1 | -| `x402-specification-v2.md` | X402 Protocol Specification | 10 | 0 | 10 | +| `x402-specification-v2.md` | 5.1.1 JSON Payload | 1 | 0 | 1 | +| `x402-specification-v2.md` | 5.3.2 Field Descriptions | 1 | 0 | 1 | +| `x402-specification-v2.md` | 6.1 Asset Transfer Methods and Payment Flow Models | 5 | 0 | 5 | +| `x402-specification-v2.md` | 7.1 POST /verify | 1 | 0 | 1 | +| `x402-specification-v2.md` | 7.2 POST /settle | 1 | 0 | 1 | +| `x402-specification-v2.md` | 9. Error Handling | 2 | 0 | 2 | | `scheme_exact.md` | Asset Transfer Method Families | 1 | 0 | 1 | | `scheme_exact.md` | Facilitator-submitted | 5 | 0 | 5 | | `scheme_exact.md` | Client-submitted (payment proof) | 12 | 2 | 10 | -| `scheme_exact.md` | SVM | 3 | 1 | 2 | +| `scheme_exact.md` | SVM | 5 | 1 | 4 | +| `scheme_exact.md` | Multi-Payee Splits (Optional Extension) | 9 | 0 | 9 | | `scheme_exact_svm.md` | Exact Payment Scheme for Solana Virtual Machine (SVM) (exact) | 1 | 0 | 1 | -| `scheme_exact_svm.md` | PaymentRequirements for exact | 2 | 1 | 1 | +| `scheme_exact_svm.md` | PaymentRequirements for exact | 3 | 1 | 2 | +| `scheme_exact_svm.md` | PaymentPayload payload Field | 1 | 0 | 1 | | `scheme_exact_svm.md` | 1.1 Required Payment Outcome (MUST) | 2 | 0 | 2 | | `scheme_exact_svm.md` | 1.2 Payment Identification (MUST) | 1 | 0 | 1 | +| `scheme_exact_svm.md` | 1.4 Exactly One Matching Transfer (MUST) | 5 | 4 | 1 | +| `scheme_exact_svm.md` | 1.5 Transaction Versions (MUST) | 12 | 0 | 12 | +| `scheme_exact_svm.md` | 2.1.1 Fee Payer Isolation (MUST) | 4 | 3 | 1 | | `scheme_exact_svm.md` | 2.1.2 Address Lookup Table Visibility (MUST) | 3 | 0 | 3 | | `scheme_exact_svm.md` | 2.1.5 Exact Payment Verification (MUST) | 1 | 0 | 1 | +| `scheme_exact_svm.md` | 2.2.1 Compute Budget Controls (SHOULD) | 2 | 0 | 2 | | `scheme_exact_svm.md` | 2.3 Policy Flexibility (Explicit) | 1 | 0 | 1 | | `scheme_exact_svm.md` | 3. Reference Verification Implementation (Two-Path) | 1 | 0 | 1 | -| `scheme_exact_svm.md` | 3.2 Path 2 — Simulation-Based Smart Wallet Verification | 5 | 0 | 5 | +| `scheme_exact_svm.md` | 3.1 Path 1 — Static Layout Verification (standard wallets) | 7 | 4 | 3 | +| `scheme_exact_svm.md` | 3.2 Path 2 — Simulation-Based Smart Wallet Verification | 6 | 0 | 6 | | `scheme_exact_svm.md` | 3.3 Path Selection (Path 1 → Path 2) | 1 | 0 | 1 | -| `scheme_exact_svm.md` | 3.4 Post-Settlement Verification (TOCTOU defense) | 2 | 1 | 1 | +| `scheme_exact_svm.md` | 3.4 Post-Settlement Verification (TOCTOU defense) | 3 | 1 | 2 | +| `scheme_exact_svm.md` | 5.1 extra.splits Schema | 7 | 0 | 7 | +| `scheme_exact_svm.md` | 5.2 Amount Semantics (MUST) | 4 | 0 | 4 | +| `scheme_exact_svm.md` | 5.3 Payment Outcome with Splits (MUST) | 5 | 0 | 5 | +| `scheme_exact_svm.md` | 5.4 Recipient ATA Creation (MUST) | 7 | 0 | 7 | +| `scheme_exact_svm.md` | 5.5 Capability Advertisement and Sponsor Acceptance with Splits (MUST) | 5 | 0 | 5 | +| `scheme_exact_svm.md` | 5.6 Client-Side Verification (MUST) | 2 | 0 | 2 | +| `scheme_exact_svm.md` | 5.7 Static Layout with Splits (MUST) | 3 | 0 | 3 | | `scheme_upto.md` | Core Properties (MUST) | 1 | 0 | 1 | | `scheme_upto.md` | 1. Single-Use Authorization | 2 | 0 | 2 | | `scheme_upto.md` | 2. Time-Bound Authorization | 2 | 1 | 1 | @@ -879,17 +906,19 @@ come from the same extraction as `pkc req-lint`. | `scheme_upto_svm.md` | 1. Purpose | 1 | 0 | 1 | | `scheme_upto_svm.md` | 3. Payment-channel Method | 2 | 1 | 1 | | `scheme_upto_svm.md` | 4. Wire Format | 1 | 0 | 1 | -| `scheme_upto_svm.md` | 4.2 UptoPayload (in PAYMENT-SIGNATURE.payload) | 7 | 6 | 1 | +| `scheme_upto_svm.md` | 4.2 UptoPayload (in PAYMENT-SIGNATURE.payload) | 8 | 6 | 2 | | `scheme_upto_svm.md` | 4.3 SettlementResponse (in PAYMENT-RESPONSE) | 1 | 0 | 1 | | `scheme_upto_svm.md` | Phase 1 - Setup | 1 | 0 | 1 | | `scheme_upto_svm.md` | Phase 2 - Authorization | 3 | 1 | 2 | | `scheme_upto_svm.md` | Phase 3 - Deposit settle (before resource execution) | 1 | 0 | 1 | | `scheme_upto_svm.md` | Client-supplied openTransaction acceptance policy | 2 | 1 | 1 | +| `scheme_upto_svm.md` | Transaction versions | 12 | 0 | 12 | | `scheme_upto_svm.md` | Message and signer rules | 6 | 5 | 1 | -| `scheme_upto_svm.md` | Top-level instruction layout | 13 | 12 | 1 | +| `scheme_upto_svm.md` | Top-level instruction layout | 16 | 12 | 4 | | `scheme_upto_svm.md` | Canonical open instruction | 9 | 7 | 2 | | `scheme_upto_svm.md` | Server-initiated /settle request | 3 | 0 | 3 | | `scheme_upto_svm.md` | Facilitator settlement procedure | 6 | 0 | 6 | +| `scheme_upto_svm.md` | Facilitator-built transactions | 2 | 0 | 2 | | `scheme_upto_svm.md` | Duplicate Settlement Mitigation | 5 | 0 | 5 | | `scheme_upto_svm.md` | 6. Asynchronous Recovery and Channel Discovery | 1 | 0 | 1 | | `scheme_upto_svm.md` | 6.1 Discovery RPC | 4 | 0 | 4 | @@ -899,25 +928,27 @@ come from the same extraction as `pkc req-lint`. | `scheme_batch_settlement.md` | Commitment identifier | 1 | 0 | 1 | | `scheme_batch_settlement.md` | Network requirements | 1 | 0 | 1 | | `scheme_batch_settlement_svm.md` | 1. Purpose | 1 | 0 | 1 | +| `scheme_batch_settlement_svm.md` | 2. Mapping the Core Requirements to SVM | 1 | 0 | 1 | | `scheme_batch_settlement_svm.md` | 3. Payment-Channel Method | 22 | 4 | 18 | | `scheme_batch_settlement_svm.md` | 4. Wire Format | 1 | 0 | 1 | | `scheme_batch_settlement_svm.md` | 4.1 PaymentRequirements (in PAYMENT-REQUIRED.accepts[]) | 13 | 6 | 7 | | `scheme_batch_settlement_svm.md` | 4.2 Shared Wire Objects and Program Mapping | 22 | 10 | 12 | -| `scheme_batch_settlement_svm.md` | 4.3 Client PaymentPayload Variants | 10 | 6 | 4 | +| `scheme_batch_settlement_svm.md` | 4.3 Client PaymentPayload Variants | 12 | 6 | 6 | | `scheme_batch_settlement_svm.md` | 4.4 SettlementResponse (in PAYMENT-RESPONSE) | 2 | 1 | 1 | | `scheme_batch_settlement_svm.md` | POST /verify | 5 | 3 | 2 | -| `scheme_batch_settlement_svm.md` | POST /settle | 28 | 7 | 21 | -| `scheme_batch_settlement_svm.md` | GET /supported | 3 | 1 | 2 | +| `scheme_batch_settlement_svm.md` | POST /settle | 30 | 8 | 22 | +| `scheme_batch_settlement_svm.md` | GET /supported | 3 | 2 | 1 | | `scheme_batch_settlement_svm.md` | 4.6 Corrective PaymentRequired | 3 | 2 | 1 | | `scheme_batch_settlement_svm.md` | Phase 1 - Open or Top Up | 5 | 3 | 2 | +| `scheme_batch_settlement_svm.md` | Transaction versions | 12 | 0 | 12 | | `scheme_batch_settlement_svm.md` | Message and signer rules | 9 | 7 | 2 | -| `scheme_batch_settlement_svm.md` | Top-level instruction layout | 13 | 10 | 3 | +| `scheme_batch_settlement_svm.md` | Top-level instruction layout | 15 | 10 | 5 | | `scheme_batch_settlement_svm.md` | Canonical open | 3 | 2 | 1 | | `scheme_batch_settlement_svm.md` | Canonical top_up | 11 | 5 | 6 | | `scheme_batch_settlement_svm.md` | Canonical refund request_close | 8 | 4 | 4 | | `scheme_batch_settlement_svm.md` | Phase 2 - Steady-State Request | 3 | 0 | 3 | | `scheme_batch_settlement_svm.md` | Phase 3 - Voucher Acceptance (before serving) | 14 | 5 | 9 | -| `scheme_batch_settlement_svm.md` | Phase 4 - Batched Redemption (out of band) | 2 | 0 | 2 | +| `scheme_batch_settlement_svm.md` | Facilitator-built transactions and batching capacity | 6 | 0 | 6 | | `scheme_batch_settlement_svm.md` | Phase 5 - Duplicate and Concurrent Operation Handling | 6 | 0 | 6 | | `scheme_batch_settlement_svm.md` | 6. Asynchronous Recovery and Channel Discovery | 1 | 0 | 1 | | `scheme_batch_settlement_svm.md` | 6.1 getProgramAccounts Discovery | 5 | 0 | 5 | @@ -1042,23 +1073,30 @@ come from the same extraction as `pkc req-lint`. | `draft-solana-session-00.md` | Clock Skew | 1 | 0 | 1 | | `draft-solana-session-00.md` | Solana Verification Programs | 1 | 0 | 1 | | `scheme_exact_svm.md` | Exact Payment Scheme for Solana Virtual Machine (SVM) (exact) | 1 | 0 | 1 | -| `scheme_exact_svm.md` | PaymentRequirements for exact | 2 | 0 | 2 | +| `scheme_exact_svm.md` | PaymentRequirements for exact | 3 | 0 | 3 | | `scheme_exact_svm.md` | 1.1 Required Payment Outcome (MUST) | 2 | 0 | 2 | | `scheme_exact_svm.md` | 1.2 Payment Identification (MUST) | 1 | 0 | 1 | -| `scheme_exact_svm.md` | 1.4 Exactly One Matching Transfer (MUST) | 4 | 2 | 2 | -| `scheme_exact_svm.md` | 1.5 Transaction Versions (MUST) | 8 | 7 | 1 | +| `scheme_exact_svm.md` | 1.4 Exactly One Matching Transfer (MUST) | 5 | 2 | 3 | +| `scheme_exact_svm.md` | 1.5 Transaction Versions (MUST) | 12 | 10 | 2 | | `scheme_exact_svm.md` | 2.1 Minimal Safety Baseline (Normative MUSTs) | 1 | 0 | 1 | -| `scheme_exact_svm.md` | 2.1.1 Fee Payer Isolation (MUST) | 3 | 0 | 3 | +| `scheme_exact_svm.md` | 2.1.1 Fee Payer Isolation (MUST) | 4 | 0 | 4 | | `scheme_exact_svm.md` | 2.1.2 Address Lookup Table Visibility (MUST) | 3 | 0 | 3 | | `scheme_exact_svm.md` | 2.1.3 Fee Payer Fund Safety (MUST) | 1 | 0 | 1 | | `scheme_exact_svm.md` | 2.1.4 Signer Set Integrity (MUST) | 2 | 1 | 1 | | `scheme_exact_svm.md` | 2.1.5 Exact Payment Verification (MUST) | 1 | 0 | 1 | | `scheme_exact_svm.md` | 2.3 Policy Flexibility (Explicit) | 1 | 0 | 1 | | `scheme_exact_svm.md` | 3. Reference Verification Implementation (Two-Path) | 1 | 0 | 1 | -| `scheme_exact_svm.md` | 3.1 Path 1 — Static Layout Verification (standard wallets) | 6 | 2 | 4 | -| `scheme_exact_svm.md` | 3.2 Path 2 — Simulation-Based Smart Wallet Verification | 5 | 3 | 2 | +| `scheme_exact_svm.md` | 3.1 Path 1 — Static Layout Verification (standard wallets) | 7 | 2 | 5 | +| `scheme_exact_svm.md` | 3.2 Path 2 — Simulation-Based Smart Wallet Verification | 6 | 3 | 3 | | `scheme_exact_svm.md` | 3.3 Path Selection (Path 1 → Path 2) | 1 | 0 | 1 | -| `scheme_exact_svm.md` | 3.4 Post-Settlement Verification (TOCTOU defense) | 2 | 0 | 2 | +| `scheme_exact_svm.md` | 3.4 Post-Settlement Verification (TOCTOU defense) | 3 | 0 | 3 | +| `scheme_exact_svm.md` | 5.1 extra.splits Schema | 7 | 0 | 7 | +| `scheme_exact_svm.md` | 5.2 Amount Semantics (MUST) | 4 | 0 | 4 | +| `scheme_exact_svm.md` | 5.3 Payment Outcome with Splits (MUST) | 5 | 0 | 5 | +| `scheme_exact_svm.md` | 5.4 Recipient ATA Creation (MUST) | 7 | 0 | 7 | +| `scheme_exact_svm.md` | 5.5 Capability Advertisement and Sponsor Acceptance with Splits (MUST) | 5 | 0 | 5 | +| `scheme_exact_svm.md` | 5.6 Client-Side Verification (MUST) | 2 | 0 | 2 | +| `scheme_exact_svm.md` | 5.7 Static Layout with Splits (MUST) | 3 | 0 | 3 | | `scheme_upto_svm.md` | 1. Purpose | 1 | 0 | 1 | | `scheme_upto_svm.md` | 2. Mapping the five core requirements to SVM | 3 | 0 | 3 | | `scheme_upto_svm.md` | 3. Payment-channel Method | 2 | 0 | 2 | @@ -1070,7 +1108,7 @@ come from the same extraction as `pkc req-lint`. | `scheme_upto_svm.md` | Phase 2 - Authorization | 3 | 0 | 3 | | `scheme_upto_svm.md` | Phase 3 - Deposit settle (before resource execution) | 1 | 0 | 1 | | `scheme_upto_svm.md` | Client-supplied openTransaction acceptance policy | 2 | 0 | 2 | -| `scheme_upto_svm.md` | Transaction versions | 8 | 7 | 1 | +| `scheme_upto_svm.md` | Transaction versions | 12 | 9 | 3 | | `scheme_upto_svm.md` | Message and signer rules | 6 | 1 | 5 | | `scheme_upto_svm.md` | Top-level instruction layout | 16 | 3 | 13 | | `scheme_upto_svm.md` | Canonical open instruction | 9 | 0 | 9 | @@ -1093,11 +1131,11 @@ come from the same extraction as `pkc req-lint`. | `scheme_batch_settlement_svm.md` | 4.4 SettlementResponse (in PAYMENT-RESPONSE) | 2 | 0 | 2 | | `scheme_batch_settlement_svm.md` | 4.5 Facilitator Interface | 2 | 0 | 2 | | `scheme_batch_settlement_svm.md` | POST /verify | 5 | 0 | 5 | -| `scheme_batch_settlement_svm.md` | POST /settle | 28 | 0 | 28 | +| `scheme_batch_settlement_svm.md` | POST /settle | 30 | 0 | 30 | | `scheme_batch_settlement_svm.md` | GET /supported | 3 | 0 | 3 | | `scheme_batch_settlement_svm.md` | 4.6 Corrective PaymentRequired | 3 | 0 | 3 | | `scheme_batch_settlement_svm.md` | Phase 1 - Open or Top Up | 5 | 0 | 5 | -| `scheme_batch_settlement_svm.md` | Transaction versions | 8 | 7 | 1 | +| `scheme_batch_settlement_svm.md` | Transaction versions | 12 | 9 | 3 | | `scheme_batch_settlement_svm.md` | Message and signer rules | 9 | 1 | 8 | | `scheme_batch_settlement_svm.md` | Top-level instruction layout | 15 | 3 | 12 | | `scheme_batch_settlement_svm.md` | Canonical open | 3 | 0 | 3 | @@ -1105,7 +1143,7 @@ come from the same extraction as `pkc req-lint`. | `scheme_batch_settlement_svm.md` | Canonical refund request_close | 8 | 0 | 8 | | `scheme_batch_settlement_svm.md` | Phase 2 - Steady-State Request | 3 | 0 | 3 | | `scheme_batch_settlement_svm.md` | Phase 3 - Voucher Acceptance (before serving) | 14 | 0 | 14 | -| `scheme_batch_settlement_svm.md` | Facilitator-built transactions and batching capacity | 4 | 0 | 4 | +| `scheme_batch_settlement_svm.md` | Facilitator-built transactions and batching capacity | 6 | 0 | 6 | | `scheme_batch_settlement_svm.md` | Phase 5 - Duplicate and Concurrent Operation Handling | 6 | 0 | 6 | | `scheme_batch_settlement_svm.md` | 6. Asynchronous Recovery and Channel Discovery | 1 | 0 | 1 | | `scheme_batch_settlement_svm.md` | 6.1 getProgramAccounts Discovery | 5 | 0 | 5 | @@ -1130,9 +1168,10 @@ case is in no scheduled shard. | Intent | Claimed cases | Must pass | Known failing | | --- | ---: | ---: | ---: | -| charge | 159 | 136 | 23 | -| x402-exact | 75 | 58 | 17 | -| x402-upto | 12 | 8 | 4 | +| charge | 159 | 138 | 21 | +| x402-exact | 78 | 61 | 17 | +| x402-upto | 15 | 11 | 4 | +| x402-batch | 1 | 1 | 0 | **charge**: claimed cases per SDK as client (against the Rust server) and as server (against the Rust client); `k` known failing. @@ -1146,7 +1185,7 @@ case is in no scheduled shard. | ruby | | 13 | | rust | 17 | (control) | | swift | 15 · 3k | | -| typescript | 19 · 3k | 13 | +| typescript | 19 · 1k | 13 | **x402-exact**: claimed cases per SDK as client (against the Rust server) and as server (against the Rust client); `k` known failing. @@ -1158,9 +1197,9 @@ case is in no scheduled shard. | php | | 6 · 2k | | python | 5 · 1k | 6 · 2k | | ruby | | 12 · 4k | -| rust | 7 | (control) | +| rust | 8 | (control) | | swift | 5 · 1k | | -| typescript | 5 | 6 · 1k | +| typescript | 6 | 7 · 1k | **x402-upto**: claimed cases per SDK as client (against the Rust server) and as server (against the Rust client); `k` known failing. @@ -1169,8 +1208,15 @@ case is in no scheduled shard. | go | 2 · 2k | 1 · 1k | | kotlin | 2 | | | python | 2 | 1 · 1k | -| rust | 2 | (control) | +| rust | 3 | (control) | | swift | 2 | | +| typescript | | 2 | + +**x402-batch**: claimed cases per SDK as client (against the Rust server) and as server (against the Rust client); `k` known failing. + +| SDK | as client | as server | +| --- | :---: | :---: | +| rust | 1 | (control) | 9 SDK shards, each one `Conformance / ` job in `.github/workflows/conformance.yml` on every pull request. Source: `harness/expectations/.toml` and the scenario registry in `rust/crates/conformance/src/interop/scenarios.rs`. diff --git a/harness/expectations/FINDINGS.md b/harness/expectations/FINDINGS.md index 04ffd848b..ec2479b21 100644 --- a/harness/expectations/FINDINGS.md +++ b/harness/expectations/FINDINGS.md @@ -5,32 +5,6 @@ Open gaps referenced from `[[known_failing]]` entries by when it does, replace the tracking value with the issue URL and delete the section here. -Open findings from the phase-1 vectors (pinned spec text, RULINGS ids): - -## x402-overpayment-rejected - -**Case:** `vector/x402-exact-verify-overpayment-accept` -**SDKs:** typescript - -`@solana/pay-kit` verifies x402 exact payments with the vendored upstream -reference facilitator, `@x402/svm` 2.26.0. Its static-layout path (Path 1) -requires the transfer amount to equal the requirement -(`typescript/packages/pay-kit/node_modules/@x402/svm/dist/esm/exact/facilitator/index.mjs:765`, -`amount !== BigInt(requirements.amount)`), which is what the spec text for -that path describes: scheme_exact_svm.md §3.1, “Fee payer isolation, compute -budget validity (compute unit price ≤ 5 lamports/CU on this path), -destination ATA derivation, and exact amount match are enforced as before.” - -The normative outcome is looser: §1.4, “A matching transfer MAY exceed -`PaymentRequirements.amount` ... it MUST NOT be less.” §2.3 lets a sponsor be -stricter (“Sponsors MAY introduce stricter limits but MUST NOT relax the §2.1 -MUSTs.”), so RULINGS S5 reads the reference implementation's exact-amount -check as a stricter sponsor policy, which pay-kit inherits by default. -Default verifiers accept overpayment; pay-kit does not re-implement the -facilitator to get there. The fix belongs upstream, in the x402 fork -(`typescript/external/x402`): accept `amount >= requirements.amount` on the -static path and align the §3.1 wording with §1.4. - Open findings from the requirement-gap cases (`charge-*-policy.json`, `x402-*-policy.json`, added from the `pkc req-lint` gap list on 2026-10-20). Paths are file:line at the commit that recorded them. @@ -225,48 +199,6 @@ first and report `unknown_fourth_instruction` `python/src/solana_pay_kit/protocols/x402/exact/verify.py:154` before `:169`). The verdict is right; the reason hides the fund-safety violation, and a smart-wallet path that relaxes the layout would have to catch it again. -## x402-priority-fee-product-uncapped - -**Case:** `vector/x402-exact-verify-priority-fee-over-cap-reject` -**SDKs:** go, lua, php, python, ruby, typescript - -scheme_exact_svm.md §2.2.1: “Sponsors SHOULD bound their fee exposure by -enforcing maximum compute unit limits and maximum compute unit (priority fee) -price”. The vector pairs the static layout's 200,000 unit limit with a -5,000,000 micro-lamport unit price: each is within its own cap, and the -sponsor pays a 1,000,000 lamport priority fee. Rust bounds the product at -2,000 lamports (`core::tx::check_priority_fee`, SOLA1-340, RULINGS S6); every -other x402 verifier caps the unit price alone: - -- Go `go/protocols/x402/verify.go:21` -- Python `python/src/solana_pay_kit/protocols/x402/exact/verify.py:57` -- PHP `php/src/Protocols/X402/Exact/Verifier.php:184` -- Lua `lua/pay_kit/protocols/x402/exact/verify.lua:109` -- Ruby `ruby/lib/pay_kit/protocols/x402/protocol/schemes/exact/verify.rb:147` -- TypeScript: the vendored upstream `@x402/svm` static path - (`typescript/external/x402/typescript/packages/mechanisms/svm/src/exact/facilitator/scheme.ts:1246`). - SOLA1-340 bounded the product in the TypeScript MPP charge only. - -## x402-channel-priority-fee-product-uncapped - -**Case:** `vector/x402-upto-verify-priority-fee-over-cap-reject`, -`vector/x402-upto-verify-implicit-limit-priority-fee-over-cap-reject`, -`vector/batch-verify-top-up-priority-fee-over-cap-reject`, -`vector/batch-verify-top-up-implicit-limit-priority-fee-over-cap-reject` -**SDKs:** typescript - -The sponsor co-signs the payer-built channel `open`, `top_up` and refund -`request_close` as fee payer, so it pays whatever priority fee the payer -chose. scheme_upto_svm.md: "A sponsor MAY apply a stricter local policy for -compute-unit limit, compute-unit price, and required-signature count"; Rust -holds the fee itself (limit times price, the runtime default limit when none -is declared, or the version-1 header fee) to 2,000 lamports, the same cap -exact uses (`core::payment_channels::scan_channel_tx_layout`, RULINGS S6). -The vendored `@x402/svm` 2.26.0 `findCanonicalOpenInstruction` caps each -field alone, so a 400,000 unit limit at 5,000,000 micro-lamports (a -2,000,000 lamport fee) and a price-only prefix charged on the implicit limit -are both accepted. - ## upto-settlement-funds-recipient-ata **Case:** `interop/x402-upto-basic/rust/python` @@ -296,24 +228,10 @@ confirm the payer has sufficient tokens". The pay-kit gate broadcasts the deposit only after the handler runs, so Rust reads the payer's token account and the transaction's blockhash before it reserves the request (`X402BatchSettlement::check_deposit_can_land`). The vendored `@x402/svm` -2.26.0 verify reads no balance; its deposit settle simulates the +2.28.0 verify reads no balance; its deposit settle simulates the transaction, which the offline harness signer stubs, so the vector cannot observe it there. -## upto-client-blockhash-not-checked - -**Case:** `vector/x402-upto-build-foreign-blockhash-reject` -**SDKs:** typescript - -A signed Solana transaction is bound to a cluster only by its recent -blockhash. The upto client signs a channel `open` over the offer's -`extra.recentBlockhash`, so a hint taken from another cluster yields an open -that escrows `maxAmount` there instead of on the offer's `network`. Rust signs -the hint only once its own RPC reports it live (`isBlockhashValid`); the -vendored upstream `@x402/svm` upto client uses any well-formed hint as is -(`resolveBlockhash` in the svm mechanism's shared utils). Fix: check the hint -against the client's RPC, or fetch the client's own blockhash. - ## session-open-initial-voucher-accepted **Case:** `vector/session-wire-action-open-initial-voucher-reject` @@ -441,7 +359,7 @@ Open findings from the x402 `upto` (SVM) vectors (`x402-upto-*.json`, 2026-10-21). Rust is driven through `x402::server::upto::testkit::verify_open_pre_broadcast` (the pre-broadcast half of `X402Upto::verify_open_for_route`, co-signature included); -TypeScript through the vendored `@x402/svm` 2.26.0 upto facilitator's +TypeScript through the vendored `@x402/svm` 2.28.0 upto facilitator's read-only `verify` (pay-kit's `X402Upto.verifyOpen` calls `settle`, which broadcasts). @@ -506,29 +424,6 @@ with `getOpenInstructionDataDecoder().decode` (`typescript/external/x402/typescript/packages/mechanisms/svm/src/payment-channels/open.ts:969`), which ignores bytes past the arguments. The fix belongs in the x402 fork. -## ts-upto-open-size-unbounded - -**Case:** `vector/x402-upto-verify-v0-oversize-reject` -**SDKs:** typescript - -x402-txv1 scheme_upto_svm.md: “A legacy or version-0 transaction MUST NOT -exceed 1232 serialized bytes”. The vendored `verifyOpenTransaction` never -measures the transaction, so an oversize open is accepted and only fails at -broadcast. - -## ts-upto-no-transaction-versions - -**Cases:** every `x402-upto-txv1.json` vector that builds or verifies a version-1 open, plus `vector/x402-upto-build-no-common-version-reject` -**SDKs:** typescript - -The vendored `@x402/svm` 2.26.0 (`typescript/external/x402` at 03b3919b) -predates transaction-version negotiation, x402-foundation/x402 PR 3710 (branch -`feat/svm-transaction-versions-upto`), which implements the x402-txv1 draft -(PR 3473). Its client builds version 0 whatever `extra.transactionVersions` -advertises, and its facilitator cannot decode a version-1 message (it throws -reading the absent lookup-table list), so neither -`unsupported_transaction_version` nor the version-1 budget rules are reachable. -Resolved by bumping the vendored x402 packages once PR 3710 lands. ## txv1-ts-mpp-no-transaction-versions **Cases:** `vector/charge-wire-transaction-versions-*`, `vector/session-wire-transaction-versions-*` @@ -563,20 +458,18 @@ throws while decoding (`Cannot read properties of undefined (reading version-0 transaction is accepted for a challenge that advertises `[1]` only, legacy is accepted, and the version-0 size limit is not applied. -## txv1-ts-x402-pre-3474 +## txv1-ts-x402-v1-policy -**Cases:** `vector/x402-build-v1-advertised`, `vector/x402-build-duplicate-advertisement`, `vector/x402-build-empty-advertisement-reject`, `vector/x402-build-legacy-only-reject`, `vector/x402-verify-v1-not-accepted-reject`, `vector/x402-verify-v1-explicit-v0-sponsor-reject` +**Cases:** `vector/x402-verify-v1-compute-limit-over-cap-reject` **SDKs:** typescript -The vendored x402 (`typescript/external/x402` @03b3919b) predates -x402-foundation/x402 PR 3474 (feat/svm-transaction-versions-exact). The exact -client ignores `extra.transactionVersions` (always version 0, never -refuses), and the facilitator has no version gate: a version-1 transaction -fails as `invalid_exact_svm_payload_signature_invalid` instead of -`unsupported_transaction_version`. PR 3474 adds the gate and the client -intersection but advertises `[0]` only; version 1 itself is not implemented -upstream yet, so the version-1 accept and policy vectors stay -`[[unsupported]]` (no accepted-version set to configure) until it is. +The `@x402/svm` exact static path applies no compute unit cap unless +`maxComputeUnits` is configured, and neither the runner nor pay-kit +(`typescript/packages/pay-kit/src/config.ts`) sets it, so a version-1 +`computeUnitLimit` of 400,001 is sponsored. scheme_exact_svm.md §2.2.1 gives +400,000 as the reference default (“Max compute units | `400,000`”), which +the Rust kit now applies. Fix: default `maxComputeUnits` to 400,000 in +pay-kit or upstream. ## txv1-go @@ -667,6 +560,40 @@ regression tests, against [RULINGS.md](RULINGS.md): - `@solana/mpp` has no stateless subscription usability check and no subscriptions instruction encoder, so the `subscription-active-*` and `subscription-instruction-*` vectors are unsupported for TypeScript. +- The vendored `@x402/svm` exact, upto and batch facilitators accept a fixed + transaction-version set (legacy, 0 and 1) with no option to narrow it, so + the vectors that configure a sponsor with `[0]` + (`input.x402ServerTransactionVersions`, `batchServer.transactionVersions`) + are unsupported for TypeScript. The spec gives the sponsor's own set no + default (“The sponsor enforces its own accepted set”), so those vectors + state it. +- The TypeScript batch testee drives the stateless upstream facilitator, so + the vectors whose verdict rests on the resource server's store record alone + (`batchVerdictFromStore`, RULINGS B1: one-above, one-below, stale, + close-pending, refund at an older cumulative) are unsupported for it. + +## Reclassified on 2026-10-27 + +Findings that were the harness's, not the SDK's, and were closed by fixing +the vectors or adapters instead: + +| Finding | Resolution | +| --- | --- | +| `x402-overpayment-rejected` (TS) | §3.1 “exact amount match” and §2.3 sponsor policy make an exact-amount sponsor conformant: `x402-exact-verify-overpayment-accept` also allows `reject amount-mismatch` (`expect.alsoConformant`) | +| `x402-priority-fee-product-uncapped` (Go, Python, Ruby, PHP, Lua, TS), `x402-channel-priority-fee-product-uncapped` (TS) | the 2,000 lamport cap on limit times price is pay-kit's stricter sponsor policy (RULINGS S6); the cap vectors also allow `accept` | +| `txv1-ts-x402-v1-policy` decimals half, `batch-ts-receiver-authorizer-missing-code`, server-mode `channelConfig` in `ts-batch-client-terms`, top-up trailing byte in `ts-batch-setup-reason-code` | the spec does not fix that verdict or code; the vectors list the other conformant verdict | +| `upto-client-blockhash-not-checked` | `extra.recentBlockhash` is a hint the client MAY use (“Pre-fetched blockhash so the client can build `openTransaction` without an RPC round trip.”); the vector pinned Rust policy and was removed | +| `ts-upto-open-size-unbounded`, `ts-upto-no-transaction-versions`, `ts-batch-transaction-versions` (client), the network half of `ts-batch-accepted-not-checked` | the vendored 2.28.0 implements them; the testee mis-mapped the reasons or ignored `batchClient.maxTransactionVersion` | +| `ts-batch-open-binding-memo` (client) | the client opens with the binding memo; the build judge required the caller's `openSlot` where the spec lets the client fetch the cluster slot or use `extra.recentSlot` | +| `txv1-ts-x402-fixed-accepted-set`, `ts-batch-facilitator-stateless` | declared limitations above (`[[unsupported]]`) | + +## Fixed in the SDKs on 2026-10-27 + +| Finding | Fix | +| --- | --- | +| `ts-batch-setup-reason-code` (codes), `ts-batch-refund-cooperative` (sealed refund), `ts-batch-accepted-not-checked`, `batch-ts-receiver-authorizer-missing-code` | `@x402/svm` batch facilitator reports the spec 7 codes and compares `accepted` with the requirements (x402-foundation/x402 PR 3971, vendored at `d411aea1`) | +| `ts-charge-client-split-cap`, `charge-client-sol-token-program-ignored`, `charge-client-unknown-network`, `charge-client-amount-not-u64-validated`, `ts-charge-ata-empty-data-crash`, `session-open-initial-voucher-accepted`, the 1232-byte case of `txv1-ts-mpp-server-no-version-admission` | `@solana/mpp` charge client and server, session open schema | +| `subscription-ts-program-not-pinned`, `subscription-ts-currency-not-mint`, `subscription-ts-request-format`, `subscription-ts-plan-pullers-destinations`, `subscription-ts-recipient-ata`, `subscription-ts-push-mode`, `subscription-source-not-verified`, `subscription-ts-scope-accounts` | `@solana/mpp` subscription client and server | ## Subscription findings (`subscription-*.json`, 2026-10-21) @@ -937,89 +864,66 @@ steady-state voucher. discriminator is not `Channel` (1) with `channel_state`, so a refresh onto a `ClosedChannel` account refuses the voucher. -### TypeScript: vendored upstream `@x402/svm` 2.26.0 +### TypeScript: vendored upstream `@x402/svm` 2.28.0 pay-kit has no batch-settlement implementation of its own; the TypeScript testee drives the upstream mechanism pay-kit bundles -(`typescript/.x402-vendor/x402-svm-2.26.0.tgz`). That tarball was packed -before the pinned spec commit (it has no receiver-binding memo, no `seal`, -no transaction versions), so most of these are the tarball lagging the spec, -cross-checked against the same vectors as the Rust kit. - -## ts-batch-open-binding-memo - -**Cases:** `batch-build-deposit-open`, `batch-build-terms-payment-flow-authorization`, -`batch-verify-open-*` (typescript) - -Same rule as [batch-open-binding-memo](#batch-open-binding-memo): the client -opens without the binding memo and `verifyOpenTransaction` reports “expected -exactly one Memo instruction matching extra.memo, found 2” for the spec's open -(under the generic `transaction_failed` reason). - -## ts-batch-transaction-versions - -**Cases:** `batch-txv1-top-up-*`, `batch-build-version-intersection-empty-reject` (typescript) - -The tarball predates SVM transaction versions (x402-foundation/x402 PR 3473, -pinned as `external/x402-txv1`). A version-1 top-up crashes verification -(“Cannot read properties of undefined (reading 'length')”), a version-0 top-up -over 1232 serialized bytes is accepted, and the client builds version 0 for a -challenge that advertises only `[1]`. +(`typescript/.x402-vendor/x402-svm-2.28.0.tgz`, solana-foundation/x402 +`feat/svm-client-transaction-v1` at `f7043a1`). It implements the +receiver-binding memo and SVM transaction versions; what remains is mostly +reason codes (the generic `transaction_failed` where the scheme names a +specific code, being fixed in x402-foundation/x402 PR 3971) and a few +unchecked rules, cross-checked against the same vectors as the Rust kit. ## ts-batch-refund-cooperative -**Cases:** `batch-verify-refund-*`, `batch-txv1-refund-v1-not-advertised-reject`, -`batch-wire-payload-refund-*` (typescript) +**Cases:** `batch-verify-refund-sealed-channel-reject` (typescript) -The facilitator refuses a refund carrying the voucher with -`close_authorization` (“cooperative close requires a trusted server binding”) -instead of falling back to the `request_close` retry the pinned spec defines -for an unavailable binding, and accepts a client-mode refund without the -voucher. `isBatchPayload` applies the same superseded shape. +The refund retry (voucher plus `request_close`, RULINGS B2) now verifies. A +refund for a channel the server already sealed is refused as +`invalid_batch_settlement_svm_channel_state`; the vector expects +`invalid_batch_settlement_svm_close_state` (“the channel cannot be closed, or a +cooperative voucher does not equal server state or is behind the channel's +onchain `settled` value”). The payment is refused; only the reason differs. ## ts-batch-setup-reason-code -**Cases:** `batch-verify-top-up-*` (typescript) +**Cases:** `vector/batch-verify-top-up-frozen-payer-ata-reject` (typescript) -Every static policy violation of a top-up comes back as -`transaction_failed: verifyTopUpTransaction: …` / `verifyOpenTransaction: …` -instead of `invalid_batch_settlement_svm_setup_transaction` (spec §7: “setup -transaction fails the sponsor safety checks”). Two are not rejected at all: a -`top_up` with a trailing data byte (“The facilitator MUST fully decode the -instruction data, reject truncated data or trailing bytes”) and a top-up -whose payer return ATA is frozen (“it MUST reject before escrowing when a -settlement account is missing, frozen, has the wrong owner or mint”). A -voucher over the topped-up ceiling is `cumulative_amount_mismatch`, not -`cumulative_exceeds_deposit`. The accepting top-up and voucher cases, and the -onchain binding rejects of `batch-voucher-onchain-bindings`, pass. +The reason codes this section used to track (`transaction_failed` for every +setup-transaction violation, `cumulative_amount_mismatch` for an over-deposit +voucher, a foreign binding reported as missing) are fixed in +x402-foundation/x402 PR 3971 (`56ff3cd5`, `d411aea1`). One top-up is still not +rejected at `/verify`: a payer return ATA that is frozen (“it MUST reject +before escrowing when a settlement account is missing, frozen, has the wrong +owner or mint”). `assertSettlementAccounts` checks only that the account +exists and its owner; the top-up simulation at settle would fail it. -## ts-batch-facilitator-stateless +## ts-batch-open-slot-window -**Cases:** `batch-verify-voucher-{one-above,one-below,stale}-reject`, -`batch-verify-voucher-close-pending-in-store-reject` (typescript) +**Cases:** `batch-verify-open-stale-slot-reject`, `batch-verify-open-future-slot-reject` (typescript) -RULINGS.md B1: the vectors judge the resource server's Phase 3 rule against -its stored `chargedCumulativeAmount`; the upstream facilitator the testee -drives is stateless and applies only the onchain floor. Upstream's resource -server (`BatchSvmScheme` server hooks) holds that state, but has no -single-shot entry point the vector ABI can drive. +Phase 1: “The facilitator MUST reject an expired transaction blockhash and an +`openSlot` outside the program's accepted window.” The batch facilitator's +`verify` compares `channelConfig.openSlot` with the open instruction only; it +never reads the cluster slot, so an open 1,501 slots stale or one slot in the +future is accepted and fails only when it lands. ## ts-batch-accepted-not-checked -**Cases:** `batch-verify-accepted-{amount,pay-to,network}-mismatch-reject` (typescript) +**Cases:** `batch-verify-accepted-{amount,pay-to}-mismatch-reject` (typescript) “For every request, `paymentPayload.accepted` MUST equal -`paymentRequirements`.” The facilitator verifies against -`paymentRequirements` without comparing `accepted` (amount and payTo -mismatches are accepted) and reports a network mismatch as `network_mismatch`. +`paymentRequirements`.” The facilitator compares `accepted` with the +requirements on scheme and network only (a network mismatch is refused as +`network_mismatch`, which the harness reads as `accepted-mismatch`), so an +amount or payTo mismatch is verified against `paymentRequirements` and +accepted. ## ts-batch-client-terms -**Cases:** `batch-build-deposit-payer-is-fee-payer-reject`, -`batch-verify-voucher-server-mode-config-reject` (typescript) +**Cases:** `batch-build-deposit-payer-is-fee-payer-reject` (typescript) The client opens a channel whose payer is the challenge's own `feePayer` (“`channelConfig.payer` and `channelConfig.payerAuthorizer` MUST NOT equal -`extra.feePayer`.”). A `channelConfig.voucherSigner` that disagrees with the -route is reported as `payload_type`; the vectors use `channel_state`, the -code for a channel configuration that does not match the requirements. +`extra.feePayer`.”). diff --git a/harness/expectations/RULINGS.md b/harness/expectations/RULINGS.md index 3117410bc..430034a44 100644 --- a/harness/expectations/RULINGS.md +++ b/harness/expectations/RULINGS.md @@ -105,32 +105,42 @@ accepts a credential without decoding its transaction does not conform. 16–128 characters of `[A-Za-z0-9_-]`. A server that advertises the extension as required MUST reject a payload without a valid id. -**S5. Overpayment is tolerated by default.** scheme_exact_svm.md §1.4: “A -matching transfer MAY exceed PaymentRequirements.amount ... it MUST NOT be -less.” The generic scheme_exact.md SVM bullet (“Amount exactness: the -transferred amount MUST equal maxAmountRequired”) is listed under “Examples -include”, uses the v1 field name, and is superseded by the network binding's -normative §1 outcome definition. §2.3 lets a sponsor reject overpayment only -as an explicit stricter policy; default verifiers MUST accept it. - -**S6. A sponsor bounds the priority fee as limit times price.** +**S5. Overpayment is tolerated; an exact-amount sponsor is conformant too.** +scheme_exact_svm.md §1.4: “A matching transfer MAY exceed +PaymentRequirements.amount ... it MUST NOT be less.” The generic +scheme_exact.md SVM bullet once required the transferred amount to equal +maxAmountRequired; it now agrees with the network binding (“Amount: the +transfer to `payTo` MUST be at least `amount`”). But §3.1 still says “exact +amount match are enforced on both layouts”, and §2.3 lets a sponsor refuse a +scheme-valid transaction (“A transaction MAY be valid under the `exact` scheme +while being rejected by a sponsor's policy.”). The Rust sponsor accepts +overpayment; `x402-exact-verify-overpayment-accept` pins that and also +admits `reject amount-mismatch` (`expect.alsoConformant`). Upstream: align +the §3.1 wording with §1.4. + +**S6. A cap on limit times price is sponsor policy, not spec.** scheme_exact_svm.md §2.2.1: “Sponsors SHOULD bound their fee exposure by enforcing maximum compute unit limits and maximum compute unit (priority fee) -price”. Capping each field alone still lets the largest limit pair with the -largest price, so the fee the sponsor pays is bounded as their product. The -pay-kit sponsors cap it at 2,000 lamports; a 200,000 unit limit at 5,000,000 -micro-lamports per unit (each within its own cap, a 1,000,000 lamport fee) is -refused as `compute-price-over-cap`. Vector: -`x402-exact-verify-priority-fee-over-cap-reject`. A version-1 header -`priorityFee` is the same product, so the cap applies to it unchanged; the -txv1 per-unit cap (5 lamports per unit) still holds below it, and -`x402-verify-v1-priority-fee-{at,over}-cap-*` pin that boundary at a 300 unit -limit, where it binds before the total does. The same sponsor cap covers the -payment-channel transactions an x402 sponsor co-signs (upto `open`, batch -`open`, `top_up` and refund `request_close`), whose spec ceilings (400,000 -units, 5,000,000 micro-lamports) are absolute maxima a sponsor MAY tighten; -without a declared limit the price is charged on the runtime default of -200,000 units per non-ComputeBudget instruction. Vectors: +price”, with reference defaults of 400,000 units and 5,000,000 +micro-lamports per unit, each capped on its own. Capping each field alone +still lets the largest limit pair with the largest price, so the pay-kit +sponsors also bound the fee they pay as the product, at 2,000 lamports; a +200,000 unit limit at 5,000,000 micro-lamports per unit (each within its own +cap, a 1,000,000 lamport fee) is refused as `compute-price-over-cap`. The spec +fixes no such total, so it is a stricter local policy (“Sponsors MAY +introduce stricter limits but MUST NOT relax the §2.1 MUSTs.”): the vectors +pin pay-kit's reject and also admit `accept` (`expect.alsoConformant`). +Vector: `x402-exact-verify-priority-fee-over-cap-reject`. A version-1 header +`priorityFee` is the same product; the txv1 per-unit cap (5 lamports per +unit) is spec and holds below it, and `x402-verify-v1-priority-fee-{at,over}-cap-*` +pin that boundary at a 300 unit limit, where it binds before the total does. +The same policy covers the payment-channel transactions an x402 sponsor +co-signs (upto `open`, batch `open`, `top_up` and refund `request_close`), +whose spec ceilings (400,000 units, 5,000,000 micro-lamports) are absolute +maxima a sponsor MAY tighten (“A sponsor MAY apply a stricter local policy for +compute-unit limit, compute-unit price, and required-signature count”); +without a declared limit pay-kit charges the price on the runtime default of +200,000 units per non-ComputeBudget instruction. Vectors (reject, or accept): `x402-upto-verify-{priority-fee,implicit-limit-priority-fee,v1-priority-fee-over-sponsor}-*` and `batch-verify-top-up-{priority-fee,implicit-limit-priority-fee}-over-cap-reject`, `batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject`. @@ -286,9 +296,12 @@ Associated Token program. Both SDK clients prepend a `CreateIdempotent` of the subscriber's own ATA so a first-time wallet can activate; it moves no tokens. Until the draft lists it, vectors accept that one instruction and reject any other ATA creation (the recipient's, a third party's) as -`unexpected-instruction`: “MUST NOT reference writable accounts that could -redirect funds away from recipient.” Upstream: list the subscriber's -idempotent ATA creation explicitly. +`unexpected-instruction`, on the client list's closing MUST: the activation +must “contain no instructions other than those above plus optional +compute-budget and memo instructions.” Creating the recipient's ATA moves no +funds away from `recipient`, so the writable-account rule is not what refuses +it; it is an instruction the list does not name. Upstream: list the +subscriber's idempotent ATA creation explicitly. **SUB2. Activation is `type="transaction"` only.** “Solana subscription activation uses type="transaction".” and “Solana transactions containing @@ -306,6 +319,28 @@ cancellation (`delegation.expires_at_ts`) equal to `now` has taken effect: “a non-zero timestamp only blocks renewal once the current time is at or after that timestamp.” +**SUB4. The subscription authority is initialized before the activation, +not inside it (spec bug).** The client list says the activation must +“contain an `initialize_subscription_authority` instruction prepended only +when the `(subscriber, mint)` authority does not yet exist on-chain;”. But +`subscribe` commits the subscriber's signature to the authority's `init_id`, +which the program sets when `initialize_subscription_authority` lands (from +that slot), and every later access check must “require its current `init_id` +to equal the delegation header's `init_id`.” A client that signs one +transaction carrying both instructions cannot know the slot it lands in, so +it cannot sign the `init_id` `subscribe` needs: the prescribed shape cannot be +built. The Rust client sends `initialize_subscription_authority` first, in +its own subscriber-signed and subscriber-paid transaction, reads the +resulting `init_id`, then signs the activation; the Rust server refuses an +activation carrying the instruction (`invalid-payload`). The vectors do not +depend on it: every subscription fixture serves an existing authority, so no +conformant activation carries the instruction, and +`subscription-verify-unrelated-authority-init-reject` refuses one for another +mint (`unexpected-instruction`). Upstream: drop the prepended initialization from +the activation list and say the authority MUST exist before the client signs +the activation (or let `subscribe` take the `init_id` from the same +transaction). + ## x402 batch-settlement on SVM Pinned `scheme_batch_settlement_svm.md` (x402 @03b3919b); transaction-version @@ -320,9 +355,12 @@ the vector's `batchServerChannel`), so `charged + amount + 1` is rejected with `cumulative-amount-mismatch`. A stateless facilitator cannot apply this rule: it sees only onchain `settled`, and the txv1 draft gives it a floor instead (“the facilitator MUST require `maxClaimableAmount >= Channel.settled + -PaymentRequirements.amount`”). An SDK whose only verify entry point is a -facilitator therefore fails the above-amount vectors; that is a known -failure of the facilitator-only testee, not a reading of the server rule. +PaymentRequirements.amount`”). The vectors whose verdict rests on the store +record alone (above, below and at the charged watermark, a close-pending +mark, a refund at an older accepted cumulative) carry +`batchVerdictFromStore: true`; a testee whose only verify entry point is a +stateless facilitator reports them unsupported, since it cannot express the +resource server they judge. **B2. A client-mode refund carries the voucher.** “| `voucher` | `BatchVoucher` | REQUIRED in client mode.” The `request_close` transaction is the retry path @@ -341,19 +379,24 @@ requirement) is `invalid-challenge`; wire objects that do not parse are Pinned drafts: `external/mpp-specs-txv1` (solana-foundation/mpp-specs feat/solana-transaction-versions `77aa6a1`, charge and session) and -`external/x402-txv1` (x402-foundation/x402 PR 3473, solana-foundation/x402 -`3d723dd`, scheme_exact_svm.md §1.5). +`external/x402-txv1` (x402-foundation/x402 PR 3473, merged; solana-foundation/x402 +`f7043a1`, scheme_exact_svm.md §1.5). **T1. `transactionVersions` is an array of the integers 0 and 1, read as a set.** MPP: “Each entry is the integer `0` or `1`, the Wallet Standard `supportedTransactionVersions` vocabulary without `"legacy"`.” x402: “Entries -are the integers `0` and `1`”. Neither text allows a string entry, a bare +MUST be the JSON integers `0` and `1` only.” Neither text allows a string entry, a bare integer or another version, so an MPP charge or session request carrying one is malformed and the SDK's request type refuses it (`invalid-payload` in the wire vectors). A repeated entry names the same version: `[1, 1]` advertises -{1}, and a client builds version 1. x402 clients intersect the advertisement -with what they can build, so an unknown entry in an x402 offer is not by -itself a reason to refuse; the vectors pin no x402 verdict for one. +{1}, and a client builds version 1. x402 is explicit about the rest: “A +client or server MUST treat a field containing any non-integer entry (a +string, null, or "legacy") or any integer other than 0 or 1 as invalid and +fail closed with unsupported_transaction_version.” An x402 client therefore +refuses the whole offer (`unsupported-version`) rather than dropping the +entries it does not know and building from the rest +(`x402-build-unknown-entry-reject`, `x402-build-string-entry-reject`, +`x402-build-legacy-only-reject`). **T2. Present and empty is not absent.** Only an omitted field defaults: MPP “Defaults to `[0]` when omitted”, x402 “When the field is absent, the @@ -376,12 +419,19 @@ advertised version. A lookup table, a size over the version's limit, or a version-1 header without `computeUnitLimit` or `loadedAccountsDataSizeLimit` is `invalid-payload`. A ComputeBudget instruction in a version-1 message is `unexpected-instruction` for MPP charge (“Any unexpected instructions MUST -cause rejection.”) and `invalid-payload` for x402 (the static layout -mismatch). A charge or session server accepts exactly the versions its -challenge's `methodDetails.transactionVersions` lists; an x402 sponsor its -own configured set (`input.x402ServerTransactionVersions`), since “The -sponsor enforces its own accepted set; it does not read -`PaymentRequirements.extra.transactionVersions`.” +cause rejection.”), `invalid-payload` for x402 exact (the static layout +mismatch), `unexpected-instruction` for an upto open (an instruction outside +the open) and `setup-transaction` for a batch top-up. A version-1 header over +the compute caps is `compute-limit-over-cap` / `compute-price-over-cap` for +x402 exact and upto. A charge or session server accepts exactly the versions +its challenge's `methodDetails.transactionVersions` lists; an x402 sponsor +its own configured set (`input.x402ServerTransactionVersions`, +`batchServer.transactionVersions`), since “The sponsor enforces its own +accepted set; it does not read `PaymentRequirements.extra.transactionVersions`.” +That set has no default (“When the field is absent, the accepted set is +`[0]`” is about the advertised field), so every vector whose verdict depends +on it states it; an SDK whose sponsor cannot be narrowed reports those +unsupported. ## Signatures (both protocols) @@ -406,6 +456,12 @@ both specs' verification steps. ## Harness consequences +- Where the specs leave a verdict to the implementation (a sponsor's + stricter local policy, two checks in no prescribed order, a rule stated for + another instruction), a vector pins the Rust kit's verdict and lists the + other conformant ones in `expect.alsoConformant`, with the reason + (`alsoConformantReason`). The judge passes either; an accepted build is + still judged on its artifact. - Vectors encode these rulings. Runners pass chain state through the fixture RPC (`input.rpcUrl`) and MUST NOT inject defaults, resolve token programs or apply field precedence themselves. diff --git a/harness/expectations/go.toml b/harness/expectations/go.toml index 1af6b55a4..c37158c07 100644 --- a/harness/expectations/go.toml +++ b/harness/expectations/go.toml @@ -208,7 +208,11 @@ ids = [ "vector/x402-build-no-intersection-reject", "vector/x402-build-empty-advertisement-reject", "vector/x402-build-legacy-only-reject", + "vector/x402-build-unknown-entry-reject", + "vector/x402-build-string-entry-reject", "vector/x402-verify-v1-accept", + "vector/x402-verify-v1-loaded-data-limit-4mib-accept", + "vector/x402-verify-v1-loaded-data-limit-small-accept", "vector/x402-verify-v1-not-accepted-reject", "vector/x402-verify-v1-explicit-v0-sponsor-reject", "vector/x402-verify-v1-over-1232-accept", @@ -265,6 +269,8 @@ tracking = "FINDINGS.md#txv1-go" ids = [ "cross/x402-build-duplicate-advertisement/rust/go", "cross/x402-build-v1-advertised/rust/go", + "cross/x402-build-duplicate-advertisement/typescript/go", + "cross/x402-build-v1-advertised/typescript/go", ] reason = "refuses a valid version-1 x402 build: the verifier cannot decode or admit version 1" tracking = "FINDINGS.md#txv1-go" @@ -272,10 +278,6 @@ tracking = "FINDINGS.md#txv1-go" [[unsupported]] reason = "the runner's session verify path drives only the SDK's voucher verifier (input.sessionVoucherVerify); it has no path to the session server's open checks (input.sessionOpenVerify, input.sessionServerVerify)" pattern = "vector/session-open-*" -[[known_failing]] -id = "vector/x402-exact-verify-priority-fee-over-cap-reject" -reason = "the x402 exact verifier caps the unit price alone (go/protocols/x402/verify.go:21), so the 200,000 unit limit at 5,000,000 micro-lamports per unit (a 1,000,000 lamport priority fee) is sponsored (RULINGS S6)" -tracking = "FINDINGS.md#x402-priority-fee-product-uncapped" [[known_failing]] ids = [ diff --git a/harness/expectations/lua.toml b/harness/expectations/lua.toml index 6538456ae..9ae26a148 100644 --- a/harness/expectations/lua.toml +++ b/harness/expectations/lua.toml @@ -148,6 +148,8 @@ ids = [ "vector/x402-build-no-intersection-reject", "vector/x402-build-empty-advertisement-reject", "vector/x402-build-legacy-only-reject", + "vector/x402-build-unknown-entry-reject", + "vector/x402-build-string-entry-reject", ] [[known_failing]] @@ -197,6 +199,8 @@ tracking = "FINDINGS.md#txv1-lua" [[known_failing]] ids = [ "vector/x402-verify-v1-accept", + "vector/x402-verify-v1-loaded-data-limit-4mib-accept", + "vector/x402-verify-v1-loaded-data-limit-small-accept", "vector/x402-verify-v1-not-accepted-reject", "vector/x402-verify-v1-explicit-v0-sponsor-reject", "vector/x402-verify-v1-over-1232-accept", @@ -253,10 +257,8 @@ tracking = "FINDINGS.md#txv1-lua" ids = [ "cross/x402-build-duplicate-advertisement/rust/lua", "cross/x402-build-v1-advertised/rust/lua", + "cross/x402-build-duplicate-advertisement/typescript/lua", + "cross/x402-build-v1-advertised/typescript/lua", ] reason = "refuses a valid version-1 x402 build: the verifier cannot decode or admit version 1" tracking = "FINDINGS.md#txv1-lua" -[[known_failing]] -id = "vector/x402-exact-verify-priority-fee-over-cap-reject" -reason = "the x402 exact verifier caps the unit price alone (lua/pay_kit/protocols/x402/exact/verify.lua:109), so the 200,000 unit limit at 5,000,000 micro-lamports per unit (a 1,000,000 lamport priority fee) is sponsored (RULINGS S6)" -tracking = "FINDINGS.md#x402-priority-fee-product-uncapped" diff --git a/harness/expectations/php.toml b/harness/expectations/php.toml index f6004b1ca..cd416d279 100644 --- a/harness/expectations/php.toml +++ b/harness/expectations/php.toml @@ -38,7 +38,6 @@ ids = [ "vector/charge-build-zero-amount-reject", ] - [[unsupported]] reason = "php is server-only: x402 build-transaction is not supported (no client envelope builder)" ids = [ @@ -143,6 +142,8 @@ ids = [ "vector/x402-build-no-intersection-reject", "vector/x402-build-empty-advertisement-reject", "vector/x402-build-legacy-only-reject", + "vector/x402-build-unknown-entry-reject", + "vector/x402-build-string-entry-reject", ] [[known_failing]] @@ -189,6 +190,8 @@ tracking = "FINDINGS.md#txv1-php" [[known_failing]] ids = [ "vector/x402-verify-v1-accept", + "vector/x402-verify-v1-loaded-data-limit-4mib-accept", + "vector/x402-verify-v1-loaded-data-limit-small-accept", "vector/x402-verify-v1-not-accepted-reject", "vector/x402-verify-v1-explicit-v0-sponsor-reject", "vector/x402-verify-v1-over-1232-accept", @@ -245,10 +248,8 @@ tracking = "FINDINGS.md#txv1-php" ids = [ "cross/x402-build-duplicate-advertisement/rust/php", "cross/x402-build-v1-advertised/rust/php", + "cross/x402-build-duplicate-advertisement/typescript/php", + "cross/x402-build-v1-advertised/typescript/php", ] reason = "refuses a valid version-1 x402 build: the verifier cannot decode or admit version 1" tracking = "FINDINGS.md#txv1-php" -[[known_failing]] -id = "vector/x402-exact-verify-priority-fee-over-cap-reject" -reason = "the x402 exact verifier caps the unit price alone (php/src/Protocols/X402/Exact/Verifier.php:184), so the 200,000 unit limit at 5,000,000 micro-lamports per unit (a 1,000,000 lamport priority fee) is sponsored (RULINGS S6)" -tracking = "FINDINGS.md#x402-priority-fee-product-uncapped" diff --git a/harness/expectations/python.toml b/harness/expectations/python.toml index 5ff6a40cd..2f6e5ebea 100644 --- a/harness/expectations/python.toml +++ b/harness/expectations/python.toml @@ -155,7 +155,12 @@ ids = [ "vector/x402-build-no-intersection-reject", "vector/x402-build-empty-advertisement-reject", "vector/x402-build-legacy-only-reject", + "vector/x402-build-unknown-entry-reject", + "vector/x402-build-string-entry-reject", "vector/x402-verify-v1-accept", + "vector/x402-verify-v1-loaded-data-limit-4mib-accept", + "vector/x402-verify-v1-loaded-data-limit-small-accept", + "vector/x402-verify-v1-heap-size-reject", "vector/x402-verify-v1-not-accepted-reject", "vector/x402-verify-v1-explicit-v0-sponsor-reject", "vector/x402-verify-v1-over-1232-accept", @@ -202,6 +207,8 @@ tracking = "FINDINGS.md#txv1-python" ids = [ "cross/x402-build-duplicate-advertisement/rust/python", "cross/x402-build-v1-advertised/rust/python", + "cross/x402-build-duplicate-advertisement/typescript/python", + "cross/x402-build-v1-advertised/typescript/python", ] reason = "refuses a valid version-1 x402 build: the verifier cannot decode or admit version 1" tracking = "FINDINGS.md#txv1-python" @@ -209,10 +216,6 @@ tracking = "FINDINGS.md#txv1-python" [[unsupported]] reason = "the runner's session verify path drives only the SDK's voucher verifier (input.sessionVoucherVerify); it has no path to the session server's open checks (input.sessionOpenVerify, input.sessionServerVerify)" pattern = "vector/session-open-*" -[[known_failing]] -id = "vector/x402-exact-verify-priority-fee-over-cap-reject" -reason = "the x402 exact verifier caps the unit price alone (python/src/solana_pay_kit/protocols/x402/exact/verify.py:57), so the 200,000 unit limit at 5,000,000 micro-lamports per unit (a 1,000,000 lamport priority fee) is sponsored (RULINGS S6)" -tracking = "FINDINGS.md#x402-priority-fee-product-uncapped" # draft-solana-session-00 server, client build and strict wire vectors # (rust/crates/conformance/src/cases/session_server.rs). diff --git a/harness/expectations/ruby.toml b/harness/expectations/ruby.toml index 1ea14c4a5..0e5def8b7 100644 --- a/harness/expectations/ruby.toml +++ b/harness/expectations/ruby.toml @@ -38,7 +38,6 @@ ids = [ "vector/charge-build-zero-amount-reject", ] - [[unsupported]] reason = "ruby SDK is server-only: x402 build-transaction has no client builder" ids = [ @@ -105,6 +104,8 @@ ids = [ "vector/x402-build-no-intersection-reject", "vector/x402-build-empty-advertisement-reject", "vector/x402-build-legacy-only-reject", + "vector/x402-build-unknown-entry-reject", + "vector/x402-build-string-entry-reject", ] [[known_failing]] @@ -152,6 +153,9 @@ tracking = "FINDINGS.md#txv1-ruby" [[known_failing]] ids = [ "vector/x402-verify-v1-accept", + "vector/x402-verify-v1-loaded-data-limit-4mib-accept", + "vector/x402-verify-v1-loaded-data-limit-small-accept", + "vector/x402-verify-v1-heap-size-reject", "vector/x402-verify-v1-not-accepted-reject", "vector/x402-verify-v1-explicit-v0-sponsor-reject", "vector/x402-verify-v1-over-1232-accept", @@ -212,10 +216,8 @@ tracking = "FINDINGS.md#txv1-ruby" ids = [ "cross/x402-build-duplicate-advertisement/rust/ruby", "cross/x402-build-v1-advertised/rust/ruby", + "cross/x402-build-duplicate-advertisement/typescript/ruby", + "cross/x402-build-v1-advertised/typescript/ruby", ] reason = "refuses a valid version-1 x402 build: the verifier cannot decode or admit version 1" tracking = "FINDINGS.md#txv1-ruby" -[[known_failing]] -id = "vector/x402-exact-verify-priority-fee-over-cap-reject" -reason = "the x402 exact verifier caps the unit price alone (ruby/lib/pay_kit/protocols/x402/protocol/schemes/exact/verify.rb:147), so the 200,000 unit limit at 5,000,000 micro-lamports per unit (a 1,000,000 lamport priority fee) is sponsored (RULINGS S6)" -tracking = "FINDINGS.md#x402-priority-fee-product-uncapped" diff --git a/harness/expectations/rust.toml b/harness/expectations/rust.toml index a30f534c8..4ce26abe5 100644 --- a/harness/expectations/rust.toml +++ b/harness/expectations/rust.toml @@ -17,7 +17,7 @@ flow = false # (`pkc run --cross --require`); cells are cross///. cross = true # Interop roles (pkc run --tier interop), ::; cases are interop///. -interop = ["mpp:charge:client", "mpp:charge:server", "x402:exact:client", "x402:exact:server", "x402:upto:client", "x402:upto:server"] +interop = ["mpp:charge:client", "mpp:charge:server", "x402:exact:client", "x402:exact:server", "x402:upto:client", "x402:upto:server", "x402:batch-settlement:client", "x402:batch-settlement:server"] # Whether the testee drives the SDK at the clock a vector pins; the runner drives the session voucher verifier at sessionVoucherVerify.nowSeconds. # Cross-checked against the testee `capabilities` op. honours_clock = true diff --git a/harness/expectations/swift.toml b/harness/expectations/swift.toml index da497ddcd..c38860db4 100644 --- a/harness/expectations/swift.toml +++ b/harness/expectations/swift.toml @@ -203,6 +203,9 @@ ids = [ reason = "unsupported-mode: swift is a client-only SDK and does not implement x402 verify-transaction" ids = [ "vector/x402-verify-v1-accept", + "vector/x402-verify-v1-loaded-data-limit-4mib-accept", + "vector/x402-verify-v1-loaded-data-limit-small-accept", + "vector/x402-verify-v1-heap-size-reject", "vector/x402-verify-v1-not-accepted-reject", "vector/x402-verify-v1-explicit-v0-sponsor-reject", "vector/x402-verify-v0-with-v1-sponsor-accept", @@ -261,6 +264,8 @@ ids = [ "vector/x402-build-no-intersection-reject", "vector/x402-build-empty-advertisement-reject", "vector/x402-build-legacy-only-reject", + "vector/x402-build-unknown-entry-reject", + "vector/x402-build-string-entry-reject", ] reason = "the x402 exact client and sponsor have no transaction-version support (scheme_exact_svm.md §1.5, x402-foundation/x402 PR 3473/3474): the Swift SDK models legacy and version 0 only (swift/Sources/SolanaPayKit/PayCore/Transaction.swift TransactionVersion) and reads no transactionVersions" tracking = "FINDINGS.md#txv1-swift" diff --git a/harness/expectations/typescript.toml b/harness/expectations/typescript.toml index d5fc4e14c..2514df3e3 100644 --- a/harness/expectations/typescript.toml +++ b/harness/expectations/typescript.toml @@ -17,7 +17,7 @@ flow = true # (`pkc run --cross --require`); cells are cross///. cross = true # Interop roles (pkc run --tier interop), ::; cases are interop///. -interop = ["mpp:charge:client", "mpp:charge:server", "x402:exact:client", "x402:exact:server"] +interop = ["mpp:charge:client", "mpp:charge:server", "x402:exact:client", "x402:exact:server", "x402:upto:server"] # Whether the testee drives the SDK at the clock a vector pins; the runner drives the session voucher verifier at sessionVoucherVerify.nowSeconds. # Cross-checked against the testee `capabilities` op. honours_clock = true @@ -52,55 +52,11 @@ ids = [ "vector/x402-ext-preserve-unknown-verbatim", ] -[[known_failing]] -id = "vector/x402-exact-verify-overpayment-accept" -reason = "the vendored upstream @x402/svm 2.26.0 facilitator enforces an exact amount on its static path (scheme_exact_svm.md §3.1), a stricter sponsor policy pay-kit inherits by default (RULINGS S5); the fix belongs upstream in the x402 fork" -tracking = "FINDINGS.md#x402-overpayment-rejected" - [[known_failing]] id = "vector/x402-exact-verify-extra-required-signer-reject" reason = "the vendored upstream @x402/svm static path accepts a third required signer (scheme_exact_svm.md §2.1.4); maxRequiredSignatures is unset in pay-kit (typescript/packages/pay-kit/src/config.ts:48)" tracking = "FINDINGS.md#x402-extra-required-signer-accepted" -[[known_failing]] -id = "vector/charge-build-sol-token-program-reject" -reason = "the client builds a SOL charge whose challenge carries tokenProgram (typescript/packages/mpp/src/client/Charge.ts:331)" -tracking = "FINDINGS.md#charge-client-sol-token-program-ignored" - -[[known_failing]] -id = "vector/charge-build-unknown-network-reject" -reason = "the client builds for network \"testnet\" and falls back to the mainnet RPC (typescript/packages/mpp/src/client/Charge.ts:187)" -tracking = "FINDINGS.md#charge-client-unknown-network" - -[[known_failing]] -id = "vector/charge-build-too-many-splits-reject" -reason = "the client builds nine splits; no length check (typescript/packages/mpp/src/client/Charge.ts:204)" -tracking = "FINDINGS.md#ts-charge-client-split-cap" - -[[known_failing]] -id = "vector/charge-build-amount-overflow-reject" -reason = "amount 2^64 is refused only because the u64 codec throws; no u64 check at typescript/packages/mpp/src/client/Charge.ts:205" -tracking = "FINDINGS.md#charge-client-amount-not-u64-validated" - -[[known_failing]] -id = "vector/charge-verify-ata-not-idempotent-reject" -reason = "an ATA Create with empty data throws a TypeError (typescript/packages/mpp/src/server/Charge.ts:689) instead of the policy rejection" -tracking = "FINDINGS.md#ts-charge-ata-empty-data-crash" - -[[known_failing]] -ids = [ - "interop/charge-client-wrong-network/typescript/rust", -] -reason = "the client submits a credential for a challenge naming another cluster (draft-solana-charge-00: \"Clients MUST reject challenges whose network does not match their configured cluster\")" -tracking = "FINDINGS.md#charge-client-network-not-checked" - -[[known_failing]] -ids = [ - "interop/charge-client-over-asking-price/typescript/rust", -] -reason = "the client pays a challenge whose amount was multiplied by 10000 after the server bound it; nothing checks the amount against what it was asked to pay (core: \"Clients MUST verify before authorizing payment\")" -tracking = "FINDINGS.md#charge-client-request-not-verified" - [[known_failing]] ids = [ "interop/charge-client-mis-signed-challenge/typescript/rust", @@ -136,22 +92,12 @@ ids = [ reason = "isUptoSvmPayload requires openSlot to be a string; the pinned spec types it as a number" tracking = "FINDINGS.md#upto-slot-wire-type" -[[known_failing]] -ids = [ - "vector/x402-upto-verify-priority-fee-over-cap-reject", - "vector/x402-upto-verify-implicit-limit-priority-fee-over-cap-reject", - "vector/batch-verify-top-up-priority-fee-over-cap-reject", - "vector/batch-verify-top-up-implicit-limit-priority-fee-over-cap-reject", -] -reason = "the vendored @x402/svm 2.26.0 open and top_up verifiers cap the compute-unit limit and price separately (findCanonicalOpenInstruction), so the sponsor pays up to 400000 x 5000000 micro-lamports, and a price with no declared limit is never charged against the runtime default limit" -tracking = "FINDINGS.md#x402-channel-priority-fee-product-uncapped" - [[known_failing]] ids = [ "vector/batch-verify-open-unfunded-payer-reject", "vector/batch-verify-top-up-unfunded-payer-reject", ] -reason = "the vendored @x402/svm 2.26.0 verify reads no payer balance: an unfunded deposit is caught only by the simulation its deposit settle runs, which the offline signer stubs" +reason = "the vendored @x402/svm 2.28.0 batch verify reads no payer balance: an unfunded deposit is caught only by the simulation its deposit settle runs, which the offline signer stubs (\"It MUST confirm the payer has sufficient tokens.\")" tracking = "FINDINGS.md#batch-deposit-balance-unchecked" [[known_failing]] @@ -161,87 +107,14 @@ ids = [ reason = "verifyOpenTransaction decodes the open args with a decoder that ignores trailing bytes" tracking = "FINDINGS.md#ts-upto-open-trailing-bytes" -[[known_failing]] -ids = [ - "vector/x402-upto-verify-v0-oversize-reject", -] -reason = "verifyOpenTransaction never bounds the serialized size of the open transaction" -tracking = "FINDINGS.md#ts-upto-open-size-unbounded" - -[[known_failing]] +[[unsupported]] +reason = "the vendored @x402/svm upto facilitator's accepted transaction-version set is fixed (legacy, 0 and 1) with no option to narrow it, so a sponsor configured with [0] (input.x402ServerTransactionVersions) cannot be expressed (\"The facilitator enforces its own accepted set\")" ids = [ - "vector/x402-upto-build-v1-when-advertised", - "vector/x402-upto-build-no-common-version-reject", - "vector/x402-upto-verify-v1-accept", "vector/x402-upto-verify-v1-unadvertised-reject", "vector/x402-upto-verify-v1-unadvertised-before-layout-reject", - "vector/x402-upto-verify-v1-compute-budget-instruction-reject", - "vector/x402-upto-verify-v1-limit-over-cap-reject", - "vector/x402-upto-verify-v1-priority-fee-over-cap-reject", - "vector/x402-upto-verify-v1-priority-fee-at-cap-accept", - "vector/x402-upto-verify-v1-priority-fee-over-sponsor-cap-reject", - "vector/x402-upto-verify-v1-missing-limit-reject", - "vector/x402-upto-verify-v1-missing-loaded-limit-reject", - "vector/x402-upto-verify-v1-small-loaded-limit-accept", - "vector/x402-upto-verify-v1-large-accept", - "vector/x402-upto-verify-v1-oversize-reject", ] -reason = "the vendored @x402/svm 2.26.0 predates transaction-version negotiation (x402-foundation/x402 PR 3710): the client ignores extra.transactionVersions and the facilitator cannot decode a version-1 message" -tracking = "FINDINGS.md#ts-upto-no-transaction-versions" # subscription (draft-solana-subscription-00) vectors -[[known_failing]] -ids = [ - "vector/subscription-build-activation", - "vector/subscription-build-sponsored", - "vector/subscription-build-external-id-memo", - "vector/subscription-build-week-period", - "vector/subscription-build-token-2022", - "vector/subscription-build-plan-puller-listed", - "vector/subscription-build-spec-request", -] -reason = "the activation also creates the recipient's ATA (typescript/packages/mpp/src/client/Subscription.ts:353, :407), which the Rust server's activation scope check refuses (\"Only one idempotent subscriber ATA creation is allowed\") and the spec's instruction list does not allow" -tracking = "FINDINGS.md#subscription-ts-recipient-ata" - -[[known_failing]] -ids = [ - "vector/subscription-build-untrusted-program-reject", -] -reason = "buildSubscriptionActivationTransaction signs for whatever methodDetails.subscriptionProgram names; nothing pins the deployment (typescript/packages/mpp/src/client/Subscription.ts:297)" -tracking = "FINDINGS.md#subscription-ts-program-not-pinned" - -[[known_failing]] -ids = [ - "vector/subscription-build-currency-not-mint-reject", -] -reason = "the client builds from methodDetails.mint and never compares it with currency (typescript/packages/mpp/src/client/Subscription.ts:264)" -tracking = "FINDINGS.md#subscription-ts-currency-not-mint" - -[[known_failing]] -ids = [ - "vector/subscription-build-amount-leading-zero-reject", - "vector/subscription-build-zero-amount-reject", - "vector/subscription-build-period-count-leading-zero-reject", - "vector/subscription-build-token-program-not-spl-reject", - "vector/subscription-period-count-leading-zero-reject", - "vector/subscription-period-count-sign-reject", - "vector/subscription-period-count-decimal-point-reject", - "vector/subscription-period-count-exponent-reject", - "vector/subscription-period-count-whitespace-reject", -] -reason = "amount and periodCount are read with BigInt()/Number() (typescript/packages/mpp/src/client/Subscription.ts:273, :331), which accept leading zeros, a sign, a decimal point, an exponent and whitespace, and the client accepts any tokenProgram" -tracking = "FINDINGS.md#subscription-ts-request-format" - -[[known_failing]] -ids = [ - "vector/subscription-build-plan-puller-unauthorized-reject", - "vector/subscription-build-plan-no-destination-reject", - "vector/subscription-build-plan-two-destinations-reject", - "vector/subscription-build-plan-other-destination-reject", -] -reason = "the client checks the plan's mint, amount and period (typescript/packages/mpp/src/client/Subscription.ts:329) but not plan.owner / plan.pullers against the puller nor plan.destinations against the recipient" -tracking = "FINDINGS.md#subscription-ts-plan-pullers-destinations" - [[known_failing]] ids = [ "vector/subscription-verify-forged-challenge-id-reject", @@ -259,29 +132,6 @@ ids = [ reason = "subscription().verify trusts the echoed challenge (typescript/packages/mpp/src/server/Subscription.ts:230); the HMAC and route binding live in mppx's Mppx.create handler, which reports a generic error the testee cannot classify" tracking = "FINDINGS.md#subscription-ts-route-binding-in-mppx" -[[known_failing]] -ids = [ - "vector/subscription-verify-push-mode-reject", -] -reason = "the server accepts push-mode (type=\"signature\") activations and fetches the transaction (typescript/packages/mpp/src/server/Subscription.ts:485); the profile defines type=\"transaction\" only" -tracking = "FINDINGS.md#subscription-ts-push-mode" - -[[known_failing]] -ids = [ - "vector/subscription-verify-source-other-address-reject", - "vector/subscription-verify-source-other-method-reject", -] -reason = "verify never reads credential.source (typescript/packages/mpp/src/server/Subscription.ts:230)" -tracking = "FINDINGS.md#subscription-source-not-verified" - -[[known_failing]] -ids = [ - "vector/subscription-verify-subscribe-other-plan-reject", - "vector/subscription-verify-unrelated-authority-init-reject", -] -reason = "validateActivationInstructions checks transfer_subscription's receiver and data but not subscribe's accounts, and accepts any initialize_subscription_authority (typescript/packages/mpp/src/server/Subscription.ts:793-797)" -tracking = "FINDINGS.md#subscription-ts-scope-accounts" - [[unsupported]] ids = [ "vector/subscription-active-live", @@ -306,121 +156,45 @@ ids = [ "vector/subscription-instruction-transfer-data", ] reason = "@solana/mpp exposes no subscriptions instruction-data encoder (it builds instructions with @solana/subscriptions); the layouts are judged through the build vectors' instruction multiset" -# ── x402 batch-settlement (SVM): vendored @x402/svm 2.26.0 ── +# ── x402 batch-settlement (SVM): vendored @x402/svm 2.28.0 ── [[known_failing]] ids = [ - "vector/batch-build-deposit-open", - "vector/batch-build-terms-payment-flow-authorization", - "vector/batch-verify-open-accept", - "vector/batch-verify-open-channel-pda-mismatch-reject", - "vector/batch-verify-open-deposit-mismatch-reject", - "vector/batch-verify-open-diverting-distribution-reject", - "vector/batch-verify-open-foreign-binding-reject", "vector/batch-verify-open-future-slot-reject", - "vector/batch-verify-open-grace-period-mismatch-reject", - "vector/batch-verify-open-missing-binding-memo-reject", "vector/batch-verify-open-stale-slot-reject", ] -reason = "the vendored @x402/svm 2.26.0 predates the receiver-binding memo: its client opens with the seller memo only and its facilitator requires exactly one memo, so it accepts an unbound open and refuses the two-memo open (\"An open suffix also carries exactly one binding Memo from section 3.\")" -tracking = "FINDINGS.md#ts-batch-open-binding-memo" +reason = "the batch facilitator's verify never compares channelConfig.openSlot with the cluster slot, so an open outside the program's open-slot window is accepted (\"The facilitator MUST reject an expired transaction blockhash and an `openSlot` outside the program's accepted window.\")" +tracking = "FINDINGS.md#ts-batch-open-slot-window" -[[known_failing]] +[[unsupported]] +reason = "the upstream batch facilitator's accepted transaction-version set is fixed (legacy, 0 and 1) with no option to narrow it, so a facilitator configured with [0] (batchServer.transactionVersions) cannot be expressed (\"The facilitator enforces its own accepted set\")" ids = [ - "vector/batch-build-version-intersection-empty-reject", - "vector/batch-txv1-top-up-legacy-policed-as-v0-reject", - "vector/batch-txv1-top-up-v0-over-1232-bytes-reject", - "vector/batch-txv1-top-up-v1-advertised", - "vector/batch-txv1-top-up-v1-compute-budget-instruction-reject", - "vector/batch-txv1-top-up-v1-loaded-limit-below-max", - "vector/batch-txv1-top-up-v1-missing-loaded-limit-reject", - "vector/batch-txv1-top-up-v1-missing-unit-limit-reject", + "vector/batch-txv1-refund-v1-not-advertised-reject", "vector/batch-txv1-top-up-v1-not-advertised-reject", - "vector/batch-txv1-top-up-v1-over-1232-bytes", - "vector/batch-txv1-top-up-v1-priority-fee-at-cap", - "vector/batch-txv1-top-up-v1-priority-fee-over-cap-reject", - "vector/batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject", - "vector/batch-txv1-top-up-v1-unit-limit-over-cap-reject", ] -reason = "the vendored @x402/svm 2.26.0 predates SVM transaction versions (x402-foundation/x402 PR 3473): its verifier fails on a version-1 message and does not enforce the 1232-byte version-0 limit, and its client ignores extra.transactionVersions" -tracking = "FINDINGS.md#ts-batch-transaction-versions" -[[known_failing]] +[[unsupported]] +reason = "the testee drives the stateless upstream facilitator, which never sees the resource server's store record (chargedCumulativeAmount, the accepted cumulative, a close-pending mark) these verdicts rest on (batchVerdictFromStore, RULINGS B1); upstream keeps that state in its resource server, which has no single-shot entry point" ids = [ - "vector/batch-txv1-refund-v1-not-advertised-reject", - "vector/batch-verify-refund-compute-price-over-cap-reject", - "vector/batch-verify-refund-disallowed-suffix-reject", - "vector/batch-verify-refund-extra-account-reject", - "vector/batch-verify-refund-extra-instruction-reject", - "vector/batch-verify-refund-fee-payer-not-sponsor-reject", - "vector/batch-verify-refund-invalid-payer-signature-reject", - "vector/batch-verify-refund-memo-mismatch-reject", - "vector/batch-verify-refund-prefix-only-reject", - "vector/batch-verify-refund-request-close", - "vector/batch-verify-refund-sealed-channel-reject", "vector/batch-verify-refund-voucher-not-accepted-cumulative-reject", - "vector/batch-verify-refund-without-voucher-reject", - "vector/batch-verify-refund-wrong-channel-reject", - "vector/batch-wire-payload-refund-cooperative", - "vector/batch-wire-payload-refund-transaction-without-voucher-reject", -] -reason = "the vendored facilitator refuses a client-mode refund carrying the voucher (\"cooperative close requires a trusted server binding\") instead of validating the request_close retry, and accepts a refund without the voucher; its wire guard applies the same shape (\"| voucher | BatchVoucher | REQUIRED in client mode.\")" -tracking = "FINDINGS.md#ts-batch-refund-cooperative" - -[[known_failing]] -ids = [ - "vector/batch-verify-top-up-amount-mismatch-reject", - "vector/batch-verify-top-up-ata-instruction-reject", - "vector/batch-verify-top-up-compute-limit-over-cap-reject", - "vector/batch-verify-top-up-compute-price-over-cap-reject", - "vector/batch-verify-top-up-duplicate-limit-reject", - "vector/batch-verify-top-up-exceeds-deposit-reject", - "vector/batch-verify-top-up-extra-signer-reject", - "vector/batch-verify-top-up-fee-payer-as-account-reject", - "vector/batch-verify-top-up-fee-payer-in-memo-reject", - "vector/batch-verify-top-up-fee-payer-not-sponsor-reject", - "vector/batch-verify-top-up-four-lighthouse-reject", - "vector/batch-verify-top-up-frozen-payer-ata-reject", - "vector/batch-verify-top-up-memo-mismatch-reject", - "vector/batch-verify-top-up-missing-memo-reject", - "vector/batch-verify-top-up-missing-payer-signature-reject", - "vector/batch-verify-top-up-oversized-memo-reject", - "vector/batch-verify-top-up-price-before-limit-reject", - "vector/batch-verify-top-up-second-setup-instruction-reject", - "vector/batch-verify-top-up-smuggled-transfer-reject", - "vector/batch-verify-top-up-trailing-bytes-reject", - "vector/batch-verify-top-up-two-memos-reject", - "vector/batch-verify-top-up-unsupported-compute-budget-reject", - "vector/batch-verify-top-up-wrong-channel-reject", -] -reason = "the vendored facilitator rejects every setup-transaction policy violation with the generic transaction_failed reason (and an over-deposit top-up voucher as cumulative_amount_mismatch) rather than invalid_batch_settlement_svm_setup_transaction / cumulative_exceeds_deposit; it accepts a top_up with trailing data bytes and does not check the payer return ATA on a top-up" -tracking = "FINDINGS.md#ts-batch-setup-reason-code" - -[[known_failing]] -ids = [ "vector/batch-verify-voucher-close-pending-in-store-reject", "vector/batch-verify-voucher-one-above-reject", "vector/batch-verify-voucher-one-below-reject", "vector/batch-verify-voucher-stale-reject", ] -reason = "the testee drives the stateless upstream facilitator, which never sees the resource server's chargedCumulativeAmount or close-pending mark: it accepts any voucher above the onchain settled floor (RULINGS.md B1)" -tracking = "FINDINGS.md#ts-batch-facilitator-stateless" [[known_failing]] ids = [ - "vector/batch-verify-accepted-amount-mismatch-reject", - "vector/batch-verify-accepted-network-mismatch-reject", - "vector/batch-verify-accepted-pay-to-mismatch-reject", + "vector/batch-verify-top-up-frozen-payer-ata-reject", ] -reason = "the vendored facilitator does not compare paymentPayload.accepted with paymentRequirements (amount, payTo) and reports a network mismatch as network_mismatch (\"For every request, paymentPayload.accepted MUST equal paymentRequirements.\")" -tracking = "FINDINGS.md#ts-batch-accepted-not-checked" +reason = "the batch facilitator's verify checks only that the payer return ATA exists and its owner, not its token state, so a top-up whose payer return ATA is frozen is accepted (\"Before co-signing ... MUST reject ... frozen\"); the top-up simulation at settle would fail it" +tracking = "FINDINGS.md#ts-batch-setup-reason-code" [[known_failing]] ids = [ "vector/batch-build-deposit-payer-is-fee-payer-reject", - "vector/batch-verify-voucher-server-mode-config-reject", ] -reason = "the vendored client builds an open whose payer is the challenge's own feePayer, and refuses a mismatched channelConfig.voucherSigner as payload_type rather than channel_state" +reason = "the upstream batch client builds an open whose payer is the challenge's own extra.feePayer (\"`channelConfig.payer` and `channelConfig.payerAuthorizer` MUST NOT equal `extra.feePayer`.\")" tracking = "FINDINGS.md#ts-batch-client-terms" [[unsupported]] @@ -444,6 +218,7 @@ ids = [ "vector/batch-wire-payment-payload-frozen", "vector/batch-wire-requirements-frozen", "vector/batch-wire-requirements-transaction-versions", + "vector/batch-wire-requirements-redemption-capacity", "vector/batch-wire-requirements-unknown-transaction-version-reject", "vector/batch-wire-settlement-response-voucher-acceptance", ] @@ -472,39 +247,29 @@ ids = [ # Transaction versions (SIMD-0385; mpp-specs-txv1, x402-txv1). [[unsupported]] -reason = "neither @solana/mpp buildChargeTransaction nor the @solana/pay-kit x402 client takes a highest signable transaction version (input.signerMaxTransactionVersion)" +reason = "@solana/mpp buildChargeTransaction takes no highest signable transaction version (input.signerMaxTransactionVersion); the @solana/pay-kit x402 client does (maxTransactionVersion)" ids = [ "vector/charge-build-signer-v0-picks-v0", "vector/charge-build-no-buildable-version-reject", - "vector/x402-build-signer-v0-picks-v0", - "vector/x402-build-no-intersection-reject", ] [[unsupported]] -reason = "the vendored @x402/svm exact facilitator (x402 @03b3919b, before x402-foundation/x402 PR 3474) has no accepted transaction-version set to configure (input.x402ServerTransactionVersions other than [0])" +reason = "the @x402/svm exact facilitator's accepted transaction-version set is fixed at [0, 1] (legacy tolerated) with no option to narrow it, so a sponsor configured with [0] (input.x402ServerTransactionVersions) cannot be expressed (scheme_exact_svm.md §1.5: \"The sponsor enforces its own accepted set\")" ids = [ - "vector/x402-verify-v1-accept", - "vector/x402-verify-v0-with-v1-sponsor-accept", - "vector/x402-verify-v1-over-1232-accept", - "vector/x402-verify-v0-over-1232-reject", - "vector/x402-verify-v1-over-4096-reject", - "vector/x402-verify-v1-compute-budget-instruction-reject", - "vector/x402-verify-v1-missing-compute-unit-limit-reject", - "vector/x402-verify-v1-missing-loaded-data-limit-reject", - "vector/x402-verify-v1-compute-limit-at-cap-accept", - "vector/x402-verify-v1-compute-limit-over-cap-reject", - "vector/x402-verify-v1-priority-fee-at-cap-accept", - "vector/x402-verify-v1-priority-fee-over-cap-reject", - "vector/x402-verify-v1-too-many-instructions-reject", - "vector/x402-verify-v1-underpay-reject", - "vector/x402-verify-v1-wrong-recipient-reject", - "vector/x402-verify-v1-wrong-mint-reject", - "vector/x402-verify-v1-decimals-reject", - "vector/x402-verify-v1-fee-payer-authority-reject", - "vector/x402-verify-v1-fee-payer-in-accounts-reject", - "vector/x402-verify-v1-extra-signer-reject", + "vector/x402-verify-v1-explicit-v0-sponsor-reject", + "vector/x402-verify-v1-not-accepted-reject", ] +[[known_failing]] +id = "vector/x402-verify-v1-compute-limit-over-cap-reject" +reason = "the @x402/svm exact facilitator has no default compute unit cap (maxComputeUnits is unset in the runner and in pay-kit), so a version-1 computeUnitLimit of 400001, over the 400,000 reference default, is sponsored (scheme_exact_svm.md §2.2.1 \"MUST NOT exceed the configured maximum\")" +tracking = "FINDINGS.md#txv1-ts-x402-v1-policy" + +[[known_failing]] +id = "vector/x402-verify-v1-extra-signer-reject" +reason = "as for version 0: the @x402/svm static path accepts a third required signer (scheme_exact_svm.md §2.1.4); maxRequiredSignatures is unset in pay-kit (typescript/packages/pay-kit/src/config.ts)" +tracking = "FINDINGS.md#x402-extra-required-signer-accepted" + [[known_failing]] ids = [ "vector/charge-wire-transaction-versions-both-golden", @@ -545,11 +310,8 @@ ids = [ "vector/charge-verify-v0-to-v1-only-reject", "vector/charge-verify-legacy-reject", "vector/charge-verify-legacy-default-reject", - "vector/charge-verify-v0-oversize-reject", "vector/charge-verify-v1-large-memos-accept", "vector/charge-verify-v1-compute-budget-instruction-reject", - "vector/charge-verify-v1-missing-compute-unit-limit-reject", - "vector/charge-verify-v1-missing-loaded-data-limit-reject", "vector/charge-verify-v1-priority-fee-at-cap-accept", "vector/charge-verify-v1-priority-fee-over-cap-reject", "vector/charge-verify-v1-sponsored-priority-fee-at-cap-accept", @@ -565,18 +327,6 @@ ids = [ reason = "verifyChargeTransaction does not admit by advertised version: it throws on a version-1 message (decoded instructions undefined), accepts version 0 for a version-1-only challenge, accepts legacy, and applies no per-version size limit (mpp-specs-txv1 Transaction Versions)" tracking = "FINDINGS.md#txv1-ts-mpp-server-no-version-admission" -[[known_failing]] -ids = [ - "vector/x402-build-v1-advertised", - "vector/x402-build-duplicate-advertisement", - "vector/x402-build-empty-advertisement-reject", - "vector/x402-build-legacy-only-reject", - "vector/x402-verify-v1-not-accepted-reject", - "vector/x402-verify-v1-explicit-v0-sponsor-reject", -] -reason = "the vendored x402 @03b3919b predates x402-foundation/x402 PR 3474: the exact client ignores extra.transactionVersions (always builds version 0, never refuses), and the facilitator has no version gate, so a version-1 transaction fails as signature_invalid instead of unsupported_transaction_version (scheme_exact_svm.md §1.5)" -tracking = "FINDINGS.md#txv1-ts-x402-pre-3474" - # Cross-verification of the transaction-version builds. [[known_failing]] @@ -585,10 +335,6 @@ ids = [ "cross/charge-build-duplicate-advertisement/python/typescript", "cross/charge-build-duplicate-advertisement/swift/typescript", "cross/charge-build-duplicate-advertisement/typescript/typescript", - "cross/charge-build-v1-large-memos/go/typescript", - "cross/charge-build-v1-large-memos/python/typescript", - "cross/charge-build-v1-large-memos/swift/typescript", - "cross/charge-build-v1-large-memos/typescript/typescript", "cross/charge-build-v1-only-advertised/go/typescript", "cross/charge-build-v1-only-advertised/python/typescript", "cross/charge-build-v1-only-advertised/swift/typescript", @@ -610,31 +356,12 @@ reason = "refuses a valid version-1 charge build (the Rust kit's, or another SDK tracking = "FINDINGS.md#txv1-ts-mpp-server-no-version-admission" [[unsupported]] -reason = "the vendored @x402/svm exact facilitator (x402 @03b3919b, before x402-foundation/x402 PR 3474) has no accepted transaction-version set to configure (input.x402ServerTransactionVersions other than [0])" -ids = [ - "cross/x402-build-duplicate-advertisement/go/typescript", - "cross/x402-build-duplicate-advertisement/python/typescript", - "cross/x402-build-duplicate-advertisement/rust/typescript", - "cross/x402-build-duplicate-advertisement/swift/typescript", - "cross/x402-build-duplicate-advertisement/typescript/typescript", - "cross/x402-build-signer-v0-picks-v0/go/typescript", - "cross/x402-build-signer-v0-picks-v0/python/typescript", - "cross/x402-build-signer-v0-picks-v0/rust/typescript", - "cross/x402-build-signer-v0-picks-v0/swift/typescript", - "cross/x402-build-v1-advertised/go/typescript", - "cross/x402-build-v1-advertised/python/typescript", - "cross/x402-build-v1-advertised/rust/typescript", - "cross/x402-build-v1-advertised/swift/typescript", - "cross/x402-build-v1-advertised/typescript/typescript", -] +reason = "the @x402/svm exact facilitator's accepted transaction-version set is fixed at [0, 1] (legacy tolerated) with no option to narrow it, so a sponsor configured with [0] explicitly (input.x402ServerTransactionVersions) cannot be expressed" +pattern = "cross/x402-build-v0-advertised/*/typescript" [[unsupported]] reason = "the runner's session verify path drives only the SDK's voucher verifier (input.sessionVoucherVerify); it has no path to the session server's open checks (input.sessionOpenVerify, input.sessionServerVerify)" pattern = "vector/session-open-*" -[[known_failing]] -id = "vector/x402-exact-verify-priority-fee-over-cap-reject" -reason = "the x402 exact verifier caps the unit price alone (typescript/external/x402/typescript/packages/mechanisms/svm/src/exact/facilitator/scheme.ts:1246), so the 200,000 unit limit at 5,000,000 micro-lamports per unit (a 1,000,000 lamport priority fee) is sponsored (RULINGS S6)" -tracking = "FINDINGS.md#x402-priority-fee-product-uncapped" # draft-solana-session-00 server, client build and strict wire vectors # (rust/crates/conformance/src/cases/session_server.rs). @@ -659,12 +386,3 @@ pattern = "vector/session-use-*" reason = "the runner has no path to the SDK's session client open builder (input.sessionOpenBuild)" pattern = "vector/session-build-*" -[[known_failing]] -id = "vector/session-wire-action-open-initial-voucher-reject" -reason = "the session open schema accepts an open payload carrying a signed voucher (typescript/packages/mpp/src/Methods.ts: the open object schema forbids `bump` but zod strips any other unknown key); draft-solana-session-00 Action open: \"MUST NOT carry an initial voucher\"" -tracking = "FINDINGS.md#session-open-initial-voucher-accepted" - -[[known_failing]] -id = "vector/x402-upto-build-foreign-blockhash-reject" -reason = "the vendored upstream @x402/svm upto client signs extra.recentBlockhash without asking its RPC whether the blockhash is live on the client's cluster (resolveBlockhash in the svm mechanism's shared utils)" -tracking = "FINDINGS.md#upto-client-blockhash-not-checked" diff --git a/harness/interop-plan.json b/harness/interop-plan.json index ed5d143c7..3ce8d7aad 100644 --- a/harness/interop-plan.json +++ b/harness/interop-plan.json @@ -37,6 +37,8 @@ "rust": [ "mpp:charge:client", "mpp:charge:server", + "x402:batch-settlement:client", + "x402:batch-settlement:server", "x402:exact:client", "x402:exact:server", "x402:upto:client", @@ -51,7 +53,8 @@ "mpp:charge:client", "mpp:charge:server", "x402:exact:client", - "x402:exact:server" + "x402:exact:server", + "x402:upto:server" ] }, "cases": [ @@ -214,6 +217,7 @@ "interop/charge-token2022-split-ata/rust/typescript", "interop/charge-token2022-split-ata/swift/rust", "interop/charge-token2022-split-ata/typescript/rust", + "interop/x402-batch-v1-redeem/rust/rust", "interop/x402-exact-basic/go/rust", "interop/x402-exact-basic/kotlin/rust", "interop/x402-exact-basic/python/rust", @@ -289,13 +293,19 @@ "interop/x402-exact-idempotent-resubmit/swift/rust", "interop/x402-exact-idempotent-resubmit/typescript/rust", "interop/x402-exact-network-mismatch/rust/lua", + "interop/x402-exact-v1/rust/rust", + "interop/x402-exact-v1/rust/typescript", + "interop/x402-exact-v1/typescript/rust", "interop/x402-upto-basic/go/rust", "interop/x402-upto-basic/kotlin/rust", "interop/x402-upto-basic/python/rust", "interop/x402-upto-basic/rust/go", "interop/x402-upto-basic/rust/python", "interop/x402-upto-basic/rust/rust", + "interop/x402-upto-basic/rust/typescript", "interop/x402-upto-basic/swift/rust", + "interop/x402-upto-v1/rust/rust", + "interop/x402-upto-v1/rust/typescript", "interop/x402-upto-zero-actual/go/rust", "interop/x402-upto-zero-actual/kotlin/rust", "interop/x402-upto-zero-actual/python/rust", @@ -578,7 +588,7 @@ "protocol": true, "flow": false }, - "caseCount": 26, + "caseCount": 29, "cases": [ "interop/charge-basic/rust/rust", "interop/charge-client-expired-challenge/rust/rust", @@ -597,6 +607,7 @@ "interop/charge-split-ata/rust/rust", "interop/charge-symbol-usdc-localnet/rust/rust", "interop/charge-token2022-split-ata/rust/rust", + "interop/x402-batch-v1-redeem/rust/rust", "interop/x402-exact-basic/rust/rust", "interop/x402-exact-client-wrong-network/rust/rust", "interop/x402-exact-cross-route-replay/rust/rust", @@ -604,7 +615,9 @@ "interop/x402-exact-fault-wrong-amount/rust/rust", "interop/x402-exact-fault-wrong-recipient/rust/rust", "interop/x402-exact-idempotent-resubmit/rust/rust", + "interop/x402-exact-v1/rust/rust", "interop/x402-upto-basic/rust/rust", + "interop/x402-upto-v1/rust/rust", "interop/x402-upto-zero-actual/rust/rust" ] }, @@ -654,13 +667,13 @@ "typescript", "rust" ], - "needsProgram": false, + "needsProgram": true, "offline": { "vector": true, "protocol": true, "flow": true }, - "caseCount": 43, + "caseCount": 47, "cases": [ "interop/charge-basic/rust/typescript", "interop/charge-basic/typescript/rust", @@ -704,7 +717,11 @@ "interop/x402-exact-fault-wrong-amount/rust/typescript", "interop/x402-exact-fault-wrong-recipient/rust/typescript", "interop/x402-exact-idempotent-resubmit/rust/typescript", - "interop/x402-exact-idempotent-resubmit/typescript/rust" + "interop/x402-exact-idempotent-resubmit/typescript/rust", + "interop/x402-exact-v1/rust/typescript", + "interop/x402-exact-v1/typescript/rust", + "interop/x402-upto-basic/rust/typescript", + "interop/x402-upto-v1/rust/typescript" ] } ] diff --git a/harness/package.json b/harness/package.json index f0b7e172d..fce50c3aa 100644 --- a/harness/package.json +++ b/harness/package.json @@ -13,10 +13,10 @@ "coverage:check": "tsx coverage-table.ts --check" }, "dependencies": { - "@solana/kit": "^6.5.0", + "@solana/kit": "^8.5.0", "@solana/mpp": "file:../typescript/packages/mpp", "@solana/pay-kit": "file:../typescript/packages/pay-kit", - "@solana/surfpool": "1.4.0", + "@solana/surfpool": "1.5.0", "mppx": "^0.8.2" }, "devDependencies": { diff --git a/harness/pnpm-lock.yaml b/harness/pnpm-lock.yaml index 360b2df62..dde1c4190 100644 --- a/harness/pnpm-lock.yaml +++ b/harness/pnpm-lock.yaml @@ -25,24 +25,24 @@ importers: .: dependencies: '@solana/kit': - specifier: ^6.5.0 - version: 6.8.0(typescript@5.9.3) + specifier: ^8.5.0 + version: 8.5.0(typescript@5.9.3) '@solana/mpp': specifier: file:../typescript/packages/mpp - version: file:../typescript/packages/mpp(@solana/kit@6.8.0(typescript@5.9.3))(mppx@0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)))(typescript@5.9.3) + version: file:../typescript/packages/mpp(@solana/kit@8.5.0(typescript@5.9.3))(mppx@0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)))(typescript@5.9.3) '@solana/pay-kit': specifier: file:../typescript/packages/pay-kit - version: file:../typescript/packages/pay-kit(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3))(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)) + version: file:../typescript/packages/pay-kit(@solana/addresses@8.5.0(typescript@5.9.3))(@solana/codecs-core@8.5.0(typescript@5.9.3))(@solana/codecs-strings@8.5.0(typescript@5.9.3))(@solana/keys@8.5.0(typescript@5.9.3))(@solana/signers@8.5.0(typescript@5.9.3))(@solana/transactions@8.5.0(typescript@5.9.3))(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)) '@solana/surfpool': - specifier: 1.4.0 - version: 1.4.0 + specifier: 1.5.0 + version: 1.5.0(@solana/kit-plugin-rpc@0.15.0(@solana/kit@8.5.0(typescript@5.9.3)))(@solana/kit-plugin-signer@0.13.0(@solana/kit@8.5.0(typescript@5.9.3)))(@solana/kit@8.5.0(typescript@5.9.3)) mppx: specifier: ^0.8.2 version: 0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)) devDependencies: '@solana-program/token': specifier: ^0.11.0 - version: 0.11.0(@solana/kit@6.8.0(typescript@5.9.3)) + version: 0.11.0(@solana/kit@8.5.0(typescript@5.9.3)) '@types/express': specifier: ^5.0.0 version: 5.0.6 @@ -367,12 +367,22 @@ packages: peerDependencies: '@solana/kit': ^6.3.0 + '@solana-program/compute-budget@0.20.0': + resolution: {integrity: sha512-7SrwpFVNX6R5sjmPnqHUohCwZ3167TsWtE1Htg5wVrnsSoKfS8o1JxH033S/mYE56jGLwusYgNAwJn+Md1JmTQ==} + peerDependencies: + '@solana/kit': ^8.5.0 + '@solana-program/record@0.3.0': resolution: {integrity: sha512-q8z86INfXRQ5357qgVBrw05vC+u3xg8Vb4E1gEwnYUvAkL3cbJSjWVfTlGRiGWYmPNq/FYIWbsFrhsxXyhaJ+w==} engines: {node: '>=24.0.0'} peerDependencies: '@solana/kit': ^7.0.0 + '@solana-program/record@0.6.0': + resolution: {integrity: sha512-8NeDjYA8OVWiL7sZqURsYFPXoT/i1c2A1Wt4k5MOMEItehX8fUOj7uCspU85lC+so+tsEmJ09qO0t8vN8kk/ZQ==} + peerDependencies: + '@solana/kit': ^8.5.0 + '@solana-program/system@0.12.0': resolution: {integrity: sha512-ZnAAWeGVMWNtJhw3GdifI2HnhZ0A0H0qs8tBkcFvxp/8wIavvO+GOM4Jd0N22u2+Lni2zcwvcrxrsxj6Mjphng==} peerDependencies: @@ -383,15 +393,10 @@ packages: peerDependencies: '@solana/kit': ^7.0.0 - '@solana-program/token-2022@0.11.0': - resolution: {integrity: sha512-4yhSajmlZdMl98vJvt63kW6L0ERtV7UFcfZGJFyUVfTMxTrgghp8BNyhh5S1Ho3p4yHqfgL4N9VgVQ9GCnqqbg==} + '@solana-program/system@0.16.0': + resolution: {integrity: sha512-/RG6q2E2vG/XpdOt8Jj/kbQktPlL5JyJuNGAeN9wDcxKDKQtrGTJpDrJgQUxiEy23fsPNXQbLN8XeCtYoMof3Q==} peerDependencies: - '@solana/kit': ^6.0.0 - '@solana/sysvars': ^5.0 - '@solana/zk-sdk': ^0.4.2 - peerDependenciesMeta: - '@solana/zk-sdk': - optional: true + '@solana/kit': ^8.5.0 '@solana-program/token-2022@0.14.1': resolution: {integrity: sha512-8yDF8xgEYU3HyfT4o7nLKHKMWQr3r2+1zBFojWYMkRyVh6YjuPO6Sxzf+p9trvL9Ddwp0d8SvqmMdYeErBZROA==} @@ -404,32 +409,42 @@ packages: '@solana/zk-sdk': optional: true + '@solana-program/token-2022@0.20.0': + resolution: {integrity: sha512-MMi+1szfgSHUdtk1drBbQsMVdTOOdGjzgH9i3IN42EZC07x5ZrXcgraZanrFSoS+DnSlTF+vFVOvmFE38rQBXA==} + peerDependencies: + '@solana/kit': ^8.5.0 + '@solana/sysvars': ^8.0.0 + '@solana/zk-sdk': ^0.5.4 + peerDependenciesMeta: + '@solana/zk-sdk': + optional: true + '@solana-program/token@0.11.0': resolution: {integrity: sha512-/lB72Pcmkn5kjUfP1Vd8F86HBlhN9RN4hJYgUG5csc23w9LCdYom2CiRdGsK25KkR9UFf6ndCCAMh83hMo+ftw==} peerDependencies: '@solana/kit': ^6.1.0 - '@solana-program/token@0.13.0': - resolution: {integrity: sha512-/Apjrd5lwOJGrPB0J5Rv7EBeclvyEBQPAGA85Scm7wBH+GpkbdLDM9uK3TNg8jjFKyWQYai/JtPHbrx7VgFLSg==} - peerDependencies: - '@solana/kit': ^6.5.0 - '@solana-program/token@0.15.0': resolution: {integrity: sha512-SeLm08EYIfT453I6lo7wTGgfMbz1s7bJ1jSHFHBFebSJHD3xF46zRgMxq3YKRlr/RM8jN0cG8SjZVu+IDvMxEA==} engines: {node: '>=24.0.0'} peerDependencies: '@solana/kit': ^7.0.0 - '@solana-program/zk-elgamal-proof@0.1.0': - resolution: {integrity: sha512-MKyeapz8P7SqkkC7h53ARFLoanb59ylVzokSMyINDH7hxY3JyiZs92/VfPa/qedhLAEHLd8jcc8sQ3pr3GyXtw==} + '@solana-program/token@0.18.0': + resolution: {integrity: sha512-YNN13I4BxBnGPGk0NzP/LLQMCmJVdunbtgqjl7/Gfp1fDXQrKXh9df8xu+2ayNdvjGJYC4c9D5vZpVetHdyJaQ==} peerDependencies: - '@solana/kit': ^5.0 + '@solana/kit': ^8.5.0 '@solana-program/zk-elgamal-proof@0.3.2': resolution: {integrity: sha512-bCiRVKtqYZpajgC2RVypZL4A0xHjQYVEsVSNMTtPJ1jjE5KOUvsXhnngGMYShK6BHv+fQP4F8QKvEVW/HOSFAg==} peerDependencies: '@solana/kit': ^7.0.0 + '@solana-program/zk-elgamal-proof@0.5.0': + resolution: {integrity: sha512-2shlu/0a/WFjERyFyhZevXG7WXRUz0kmy5DPEse3TOjH0s4fTU+Uk9kE5ijPhF85Fh662m4xT1ZZm+KBGq5y1g==} + peerDependencies: + '@solana/kit': ^8.5.0 + '@solana/accounts@6.10.0': resolution: {integrity: sha512-+FxfDOrnifoPlBkF+fr8eeQdgM6xtIgAg9xKMu3WnIz60oZd4Xnry6+ff6t+ePPoZZp397FSg9ZJet68VCWm5Q==} engines: {node: '>=20.18.0'} @@ -439,17 +454,17 @@ packages: typescript: optional: true - '@solana/accounts@6.8.0': - resolution: {integrity: sha512-rXjFYVopaEw1H2PTBQbRjKr+0i4EFuBEhRT5E0dI4cMaabSb4KKypC2gaf47+6cjU3hMlM1AcsyIs72/MqAVBw==} + '@solana/accounts@7.1.1': + resolution: {integrity: sha512-7sy9VIFMdmu/7+2kVBRMU6mEvYx/DDjfam8DsBXbh+JszaTNZH3V8FutQYHRxrca3jxiumVfsy5USwKfVg8ElQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/accounts@7.1.1': - resolution: {integrity: sha512-7sy9VIFMdmu/7+2kVBRMU6mEvYx/DDjfam8DsBXbh+JszaTNZH3V8FutQYHRxrca3jxiumVfsy5USwKfVg8ElQ==} + '@solana/accounts@8.5.0': + resolution: {integrity: sha512-vwwXYCobg1oG4kFeUEsGiNORjPujI2ff3yKLp6lCa7QBIlKaD7kZ2QRI3PZFYcNrMJ6HYNwNeZXR7ixg02pWdA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -466,17 +481,17 @@ packages: typescript: optional: true - '@solana/addresses@6.8.0': - resolution: {integrity: sha512-xVlA0DNX1LVfTueVsbhxDDoqr1VxeXvgJEh2GcIN/vcJPhY3GE3AYtjTbJJmTDgPrzOccI0t6ElVb1gelJH/PQ==} + '@solana/addresses@7.1.1': + resolution: {integrity: sha512-/Tk2aTOT7UEcaJrdEcB3+SK09v5cZ/92NWqHBzEobxusTPNoeOFxa3MwV74Q1MgPecWdLz7TPreEhAKpcvV/vw==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/addresses@7.1.1': - resolution: {integrity: sha512-/Tk2aTOT7UEcaJrdEcB3+SK09v5cZ/92NWqHBzEobxusTPNoeOFxa3MwV74Q1MgPecWdLz7TPreEhAKpcvV/vw==} + '@solana/addresses@8.5.0': + resolution: {integrity: sha512-LwTrDbDSJBng9y0vwiKqb/kSS9daspTGrSYoZPafeMWpAlpmutdD1KXPDHVTa4Xz00hcAfOJXYxRXX5VAoiOag==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -493,17 +508,17 @@ packages: typescript: optional: true - '@solana/assertions@6.8.0': - resolution: {integrity: sha512-OU6prCq39fSvGL8xY1C/9vhghasvAkMiRlituzJxzJpZRfpVRrwhzLd6P5NPAPoQ28qKcenA50kFdw9+ZyneJQ==} + '@solana/assertions@7.1.1': + resolution: {integrity: sha512-tD07UKuw5i9Tw5xloVH+TUMrLzbHKixaB4DlGXumMEQU+JbYRPtFNqtMlrpVLuVM45nkbPfFp2Da0sXNRIqFHA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/assertions@7.1.1': - resolution: {integrity: sha512-tD07UKuw5i9Tw5xloVH+TUMrLzbHKixaB4DlGXumMEQU+JbYRPtFNqtMlrpVLuVM45nkbPfFp2Da0sXNRIqFHA==} + '@solana/assertions@8.5.0': + resolution: {integrity: sha512-EZDY5rJIV8Mv9xYJ7P+jvE5pihG7pmKZ6pTqbunba/4uZSQN4Klw0FX54LDDklfDvhzmAdXN0nYAnjovTGAPEg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -520,17 +535,17 @@ packages: typescript: optional: true - '@solana/codecs-core@6.8.0': - resolution: {integrity: sha512-udFO8TrvzgROonwX3rY3E2SG675RehILNb4ZYcKlf1mL7vkDJ9bEJnBxi87AEwl8RWZFTl+MhT0MmrJnbpvdug==} + '@solana/codecs-core@7.1.1': + resolution: {integrity: sha512-C1UOAQ7LH8RuCTfaij6hthTZeBlpp8GuD2g9Nag/xgiNKJGvAfVrcorb+kO/sufdYI8Lu+BiVvPeKOjQDQiKqg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/codecs-core@7.1.1': - resolution: {integrity: sha512-C1UOAQ7LH8RuCTfaij6hthTZeBlpp8GuD2g9Nag/xgiNKJGvAfVrcorb+kO/sufdYI8Lu+BiVvPeKOjQDQiKqg==} + '@solana/codecs-core@8.5.0': + resolution: {integrity: sha512-ou38qNrf9XOzCWsu/I4sTzRmnrKqhblwMVvpXwXPKAAUZwkSAKQXonwgZFY68I5HK6nkfq1NLWfZFmTEIZYLiw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -547,17 +562,17 @@ packages: typescript: optional: true - '@solana/codecs-data-structures@6.8.0': - resolution: {integrity: sha512-lHr0F+nNwgm9c+tWQX398yzYh1qDi7QSCJpY9MQ2azW4FfY2IyPSo7bqzTaWNnJh9pmJx3ZI6jHfXBnLD5k/SQ==} + '@solana/codecs-data-structures@7.1.1': + resolution: {integrity: sha512-MO+wMAuaatAQ96N3HhTsd7Uno+79rJw88P+OiU2n+pHK/rZuyu1yB2j12veqK4jUNWPR0aOyCuZ4rB2idrDjpg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/codecs-data-structures@7.1.1': - resolution: {integrity: sha512-MO+wMAuaatAQ96N3HhTsd7Uno+79rJw88P+OiU2n+pHK/rZuyu1yB2j12veqK4jUNWPR0aOyCuZ4rB2idrDjpg==} + '@solana/codecs-data-structures@8.5.0': + resolution: {integrity: sha512-CnnNriyltkgxZAKgAJoVRsRnrtdW4KCX37BUoIsquCM+AgSvhSbxaZNz0iaHjGOX7o1Z4s6+j7nAUgad0N/w5A==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -574,17 +589,17 @@ packages: typescript: optional: true - '@solana/codecs-numbers@6.8.0': - resolution: {integrity: sha512-ebf4f1D19EAe0uhdUYOCEYnn5+EellsBxbJ42tM2yYEoIBVz5FoBBC0gSsq+UTNbQHFa7XagyBT3LewxXttiTQ==} + '@solana/codecs-numbers@7.1.1': + resolution: {integrity: sha512-TWWrQq6Wp5Yf5bSc6RbxDDYCRUBBmRtRgjvUMHGp0P9K+4uFwxllRjSZFzBPHgXj3UTeZmFJdcoD271QhAgibg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/codecs-numbers@7.1.1': - resolution: {integrity: sha512-TWWrQq6Wp5Yf5bSc6RbxDDYCRUBBmRtRgjvUMHGp0P9K+4uFwxllRjSZFzBPHgXj3UTeZmFJdcoD271QhAgibg==} + '@solana/codecs-numbers@8.5.0': + resolution: {integrity: sha512-6Vtf52rHzjf98ykejn9bNGMaQ2k1f4UMIa+BGMbBy4mIRQ5ggdI5oCAb3sZPfJcel2JQHwDlsLHCYdpqC+n6Mg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -604,20 +619,20 @@ packages: typescript: optional: true - '@solana/codecs-strings@6.8.0': - resolution: {integrity: sha512-Rpk5NVhbKYcPnE7wz3IpTp0GVNVs0IYKdmyzByiimgPTiII8eb8ay4wQiYHGHrpYh62hD14Qy3GiGDFgipRKqA==} + '@solana/codecs-strings@7.1.1': + resolution: {integrity: sha512-6qWl+atG60D2LmP47GyGapQFhVsG1sVhVrEaM3lV09vwrGOMeOZARZ4ObaQ5m6uQmM04G+f8dY9d17nCMbGHGg==} engines: {node: '>=20.18.0'} peerDependencies: fastestsmallesttextencoderdecoder: ^1.0.22 - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: fastestsmallesttextencoderdecoder: optional: true typescript: optional: true - '@solana/codecs-strings@7.1.1': - resolution: {integrity: sha512-6qWl+atG60D2LmP47GyGapQFhVsG1sVhVrEaM3lV09vwrGOMeOZARZ4ObaQ5m6uQmM04G+f8dY9d17nCMbGHGg==} + '@solana/codecs-strings@8.5.0': + resolution: {integrity: sha512-9lCSCUVkbPLb1o9PLDsaOatdVgrUqqWMrAqJvZPyyuvrC5++wPuKRIGq+5iU3lICY+AwWxrzVyiwdu4xaZVCiw==} engines: {node: '>=20.18.0'} peerDependencies: fastestsmallesttextencoderdecoder: ^1.0.22 @@ -628,11 +643,11 @@ packages: typescript: optional: true - '@solana/codecs@6.8.0': - resolution: {integrity: sha512-qCSAaw1qszeQflavkIM7c21qJ3BHReP/qgDelZbhsEXpZc852CCZM00FOIWuxePr6X+JjSNqJquxwdDSoZe7Bw==} + '@solana/codecs@8.5.0': + resolution: {integrity: sha512-wALOoEuL7HAaahZnrhxCwYz10p23hku/LPNfXjlvwgjVYJL08PH3uyWDFO8e9zhcNLOaR13IREE9z8zPUhJjDQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -647,18 +662,18 @@ packages: typescript: optional: true - '@solana/errors@6.8.0': - resolution: {integrity: sha512-HRTrLgTn0c99GKz4v4IKgz2+6soaRY1mh2tLW4sk1Fe4Zzv85Q6ZLK1mXrVGL73z1apyHDrr9/Sd/9ZhUsUvpA==} + '@solana/errors@7.1.1': + resolution: {integrity: sha512-q35qck8rBnNvJlPU00mnHEQm7gWvghzYz8khqVoLhjgodTzGp46VqnIOyI1LXOAF6XDal58bMNDO980MQgq8yw==} engines: {node: '>=20.18.0'} hasBin: true peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/errors@7.1.1': - resolution: {integrity: sha512-q35qck8rBnNvJlPU00mnHEQm7gWvghzYz8khqVoLhjgodTzGp46VqnIOyI1LXOAF6XDal58bMNDO980MQgq8yw==} + '@solana/errors@8.5.0': + resolution: {integrity: sha512-y/XTiwAZsm2kHoEDJ3ac3NUq/0E4uCbOnBe2m5mmBXF3TGmF562tDKgN5pQ+thiRABvi7b2LqwTBCg4kAdtgRg==} engines: {node: '>=20.18.0'} hasBin: true peerDependencies: @@ -667,11 +682,11 @@ packages: typescript: optional: true - '@solana/fast-stable-stringify@6.8.0': - resolution: {integrity: sha512-lZa3Qnsn+9ew6rHTXkPc+uqSa3i+AWqSBhV6oYxxBc+smvuxovItU4TPIs30cTfA7lAP+j+oYAQtUDu2dLy0hA==} + '@solana/fast-stable-stringify@8.5.0': + resolution: {integrity: sha512-CTIoOwJ0NScrB8KTzr/V4PJrNHrBAz1zvamM0opgDPQZGzLrBhca1e4eQcGmF6o7Dv3Ve0HdvDJx0B2uG6YxVA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -694,8 +709,8 @@ packages: typescript: optional: true - '@solana/functional@6.10.0': - resolution: {integrity: sha512-P8cevu4mAqHTXC37h1TVoOh8zhWB2tlOI/R9vWjYPpcLwcyWf8p2qq4LEGHl5kY+1C+4PNX39HsmCocXOPCDkQ==} + '@solana/fixed-points@8.5.0': + resolution: {integrity: sha512-hkB7dUAD/oxXeNOvdMXVqfKZAvOJ1o50gBwzh8yLP1ihdSxVgssb36Vg7806C5HzmIxmTKZclJJokG0cRUXVSw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -703,11 +718,11 @@ packages: typescript: optional: true - '@solana/functional@6.8.0': - resolution: {integrity: sha512-oMSAD/8w9ujx7OplvwRWwHHFnaaxi/Xrji1XH3xAB+gzxupUpBbOmgxQ+e84x+9VN8QWk5aU3L7gmCqdTAR6OA==} + '@solana/functional@6.10.0': + resolution: {integrity: sha512-P8cevu4mAqHTXC37h1TVoOh8zhWB2tlOI/R9vWjYPpcLwcyWf8p2qq4LEGHl5kY+1C+4PNX39HsmCocXOPCDkQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -721,8 +736,8 @@ packages: typescript: optional: true - '@solana/instruction-plans@6.10.0': - resolution: {integrity: sha512-YG7mo4zykzdc6ZTV0BuN6pveK9qeBySzlYYerq578A4eQu3xcypMAYRGAvhMZtWTanjjmD6CKtM0M7kVp0TNxg==} + '@solana/functional@8.5.0': + resolution: {integrity: sha512-+8pgF1rVW78FfT0d+ceADFLKpSh/8/o9Ldx5tEkI6paiv0QeClL1rlU5nFs5tjoFkf+92x8PpiLEEGkm0CifOQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -730,11 +745,11 @@ packages: typescript: optional: true - '@solana/instruction-plans@6.8.0': - resolution: {integrity: sha512-osAsY8ozqohrcTcHlG1EmO3i9flc0eESMIy9akTHyVvqk915gZgkaTmt4IjcYSwBGt7i+Rh8TmLj27RrTpCKvg==} + '@solana/instruction-plans@6.10.0': + resolution: {integrity: sha512-YG7mo4zykzdc6ZTV0BuN6pveK9qeBySzlYYerq578A4eQu3xcypMAYRGAvhMZtWTanjjmD6CKtM0M7kVp0TNxg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -748,8 +763,8 @@ packages: typescript: optional: true - '@solana/instructions@6.10.0': - resolution: {integrity: sha512-0TToYF+8LXQ3ofPMx+yF6yaM9l4YJvcAPMy0qV5JsrBUFlWXBSANRuudKBQLHMvb+a3OiUTq5X7omuorKMBB3A==} + '@solana/instruction-plans@8.5.0': + resolution: {integrity: sha512-cES8TzRGuJ5cdVn3hr6GskwwG68rLd8R0FqmzB9NeU/nzPnW/50nRrg36DYX1Nh+OwuU/ehg6zkNNu1Vo72lKQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -757,11 +772,11 @@ packages: typescript: optional: true - '@solana/instructions@6.8.0': - resolution: {integrity: sha512-dTtykhS9IeN3npCfnd7wSS6KmKAh54+g90JRtLYy5/31L2Zvunf3AJz2QUk58vgsAGZ5fuoiMyhCxRJm4rHUBQ==} + '@solana/instructions@6.10.0': + resolution: {integrity: sha512-0TToYF+8LXQ3ofPMx+yF6yaM9l4YJvcAPMy0qV5JsrBUFlWXBSANRuudKBQLHMvb+a3OiUTq5X7omuorKMBB3A==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -775,6 +790,15 @@ packages: typescript: optional: true + '@solana/instructions@8.5.0': + resolution: {integrity: sha512-LSMOQRicz8OalMM2DT60PtAaPjvkHPhIvmPEI8KpyWOuNRwABJBRAfn5ypcdSa69VVj4IdOY10tDWZzjN4dviA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + '@solana/keychain-core@1.4.0': resolution: {integrity: sha512-WhNYopIPdHAEwJ3RDQ7VtUbKrOa2sEV9Z/Q9RxQNlfVDykzC7j/hQrlMcl5Uc3HTTA1J1/3Hg3wbnZPshSy6xg==} peerDependencies: @@ -803,17 +827,17 @@ packages: typescript: optional: true - '@solana/keys@6.8.0': - resolution: {integrity: sha512-Wo8CnbrVfCP1Jbsb3ElMej/3dmMrl4ArPhI1mDcqIIz/O4j4HmxZYbn2BCWtnV9V/LPM638EMO2r1x6GzDNrPA==} + '@solana/keys@7.1.1': + resolution: {integrity: sha512-Rx+vzWAXUa/Ko7W6wG1HOG9B3nQFZ5dALz113WoAmBZf7iQvaLG7U4ECDM/ydR+Nbdy6wYww7zQKRIye+1d+Nw==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/keys@7.1.1': - resolution: {integrity: sha512-Rx+vzWAXUa/Ko7W6wG1HOG9B3nQFZ5dALz113WoAmBZf7iQvaLG7U4ECDM/ydR+Nbdy6wYww7zQKRIye+1d+Nw==} + '@solana/keys@8.5.0': + resolution: {integrity: sha512-mq6amguPYLklpAOC9A+boXQhpcHGjcn4QN40J0l1TvUkfWyFJ4HBbNb35fyWldqqDUV5ujOpaPZmmVvWJBK2Kw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -836,11 +860,11 @@ packages: peerDependencies: '@solana/kit': ^7.0.0 - '@solana/kit@6.8.0': - resolution: {integrity: sha512-+McC1aCgcUBdM7Cd7U6k2ZHJ9OKCy5mzpb0XWrhkrgsFxT0QoRr0AcWJc85o6tIDfG6Jz7vVhbS3l8ugYz2Vzw==} + '@solana/kit@8.5.0': + resolution: {integrity: sha512-bMnXXADeyZFe3XyqzPhlQAIsmPYRiojaRO4JQxwGOmMwiQ5f13ZQodmsOqnt8W/n40P7r/+/pDqWuqG0TUv+yA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -860,17 +884,17 @@ packages: typescript: optional: true - '@solana/nominal-types@6.8.0': - resolution: {integrity: sha512-mLmHr92pM4mEfe49GUmZ5Ry0RMqtMuFQqZYnxQqhDKMcl+Wtt820ezxYgwPhqcMxRzfqaQSO3ZxpSB0RlLBa/Q==} + '@solana/nominal-types@7.1.1': + resolution: {integrity: sha512-do4rmmOlSplVYN92zV6nROJxkiRn0c7juoH1lka2Pmq+cAC3QhQXKYAwWffTFYDJJDO9qCOh00uv2hhSZi6RDw==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/nominal-types@7.1.1': - resolution: {integrity: sha512-do4rmmOlSplVYN92zV6nROJxkiRn0c7juoH1lka2Pmq+cAC3QhQXKYAwWffTFYDJJDO9qCOh00uv2hhSZi6RDw==} + '@solana/nominal-types@8.5.0': + resolution: {integrity: sha512-OfTZ+w/C59Zkp51RJ3dzn2GXUojf9p/PMmSrOpxrj+hci3bdh4e6XDGY+mvP8HGPH+m0nfKWTBCygEslfoX6bg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -887,17 +911,17 @@ packages: typescript: optional: true - '@solana/offchain-messages@6.8.0': - resolution: {integrity: sha512-HoniTs2uoCHGicD0dTTJ3YBhLZC9URxdXXUf0CHalLFwAidF9iNuB8dsuKk16Euu68L4/ERKKGfyC0QobBvahw==} + '@solana/offchain-messages@7.1.1': + resolution: {integrity: sha512-Py0/8HaIF0y+KSXHAWdQYDdZlGNoaqOZonTFuGKyDsrkgvod3wRc0cpZ5I/D/Rei4tVpvjNUfCXLpyoiJAZ7kg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/offchain-messages@7.1.1': - resolution: {integrity: sha512-Py0/8HaIF0y+KSXHAWdQYDdZlGNoaqOZonTFuGKyDsrkgvod3wRc0cpZ5I/D/Rei4tVpvjNUfCXLpyoiJAZ7kg==} + '@solana/offchain-messages@8.5.0': + resolution: {integrity: sha512-C7qBBD1Gfbdv99uoQnuc8XZYwttTQJOYEG2v6z7q3mAL03PN7zdItAlBa+M2tpeRKjTJObRYnUUJDfiIyyGD/Q==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -905,11 +929,11 @@ packages: typescript: optional: true - '@solana/options@6.8.0': - resolution: {integrity: sha512-T5441HHeucFaLtaMAJQJl79T7mX007oAFPunpPebBphRvCXGv+qQwQvqa4HkYct6Jf2O0aKLBL9GSe/kfdCk9A==} + '@solana/options@8.5.0': + resolution: {integrity: sha512-Ron9FrWDkwxlmuI6D+NmrZZRngC1MUncglgyN77ThAoxDE1gGMOB88mQvEILeeqONeTA1rDg1uBvbewQcILp+w==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -917,11 +941,11 @@ packages: '@solana/pay-kit@file:../typescript/packages/pay-kit': resolution: {directory: ../typescript/packages/pay-kit, type: directory} - '@solana/plugin-core@6.8.0': - resolution: {integrity: sha512-kdqFIhQvJP2BDUsMOIbor35esj8u78SO33Xv0Wmo+uTRg6yKONKVK53ghw235pWrinOT4f0VnVe6MN6ciYiQVA==} + '@solana/plugin-core@8.5.0': + resolution: {integrity: sha512-1zmh+UC47yxsZHleDpH4AEVkm9yXIATkWm8v33DJuXaqX3TQXMXuxP39cXAyObIQEpCG8DK8lyAeFTUrIFcDmA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -935,17 +959,17 @@ packages: typescript: optional: true - '@solana/plugin-interfaces@6.8.0': - resolution: {integrity: sha512-4olaMKGUVA7wG6BBWM5A31bQsUWBlfcL1pjhq6ZTqVEJ7vshHXGwHVlWYXYyYn9ixozGDpGSl553yaRY9jQwWw==} + '@solana/plugin-interfaces@7.1.1': + resolution: {integrity: sha512-2SHkGiftGmxg5xA5esxbwiY5wf+BOUsJG5rxD64/SHadUMaN3L0SDUSJfAXETJq5dCmVWxWGGPf2yVox4RIfdA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/plugin-interfaces@7.1.1': - resolution: {integrity: sha512-2SHkGiftGmxg5xA5esxbwiY5wf+BOUsJG5rxD64/SHadUMaN3L0SDUSJfAXETJq5dCmVWxWGGPf2yVox4RIfdA==} + '@solana/plugin-interfaces@8.5.0': + resolution: {integrity: sha512-+s/+cCuzk23/a1ViTIugvXFYHN0txxmvqfuL4qx81NlmGawqEYws6xD+L02wNzJ5rbJeAaBhw2pUFStMfG4vYg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -962,17 +986,17 @@ packages: typescript: optional: true - '@solana/program-client-core@6.8.0': - resolution: {integrity: sha512-eOZtEnwl+vdiy9x/rFF89NDtnvt+Q3H04A/0u4GoHnt+fFkQG3JS+ChWG9c77izmpmRuz5C1GptOPDGNDnIUgQ==} + '@solana/program-client-core@7.1.1': + resolution: {integrity: sha512-zoMq8Qg6psj6tFYpA35xKhSrF/LpdiVflV6nKohxZg3ocwtRqRhQfbY8/mjCA9EfH8vqvsn5il5CnxALRqmJJA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/program-client-core@7.1.1': - resolution: {integrity: sha512-zoMq8Qg6psj6tFYpA35xKhSrF/LpdiVflV6nKohxZg3ocwtRqRhQfbY8/mjCA9EfH8vqvsn5il5CnxALRqmJJA==} + '@solana/program-client-core@8.5.0': + resolution: {integrity: sha512-HJcnbuvQRcWOV3nTUjzgmQRIs0Of1973UU8uOvSEEW7rxycQwNxJ7fVgxQ5sYOCbT+7rlqqTkDeczvB7I4OwoA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -980,11 +1004,11 @@ packages: typescript: optional: true - '@solana/programs@6.8.0': - resolution: {integrity: sha512-8hSKGfPTLX9Sm7KGV/UtiGCeSzptT/9vcjbodE+ZGHKFefo5vES4UAW+qD01LjL7IumGtMJvnfhCWt81qT/jbQ==} + '@solana/programs@8.5.0': + resolution: {integrity: sha512-8PC2E/d5rwCRw1tFwQlpG65YDN56bYmPiBl99QqCP2RzhNdFJ/52xgFumL2G0uLfD3xsuFaWuOIGNxkyfXYm/Q==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -998,17 +1022,17 @@ packages: typescript: optional: true - '@solana/promises@6.8.0': - resolution: {integrity: sha512-kIypZG83ZbADbrAq9/LS7LuWlVxlgJSzIpic75+9IuAfC3k5/KSus8LrvggBkCzfAyIslrUh70iz4JcnzUZrOw==} + '@solana/promises@7.1.1': + resolution: {integrity: sha512-d3lhCfiFwiVyTRR6zhy1lcjDIh+l0a5gp1WPe64Vfa2gP0myC8P5C1Tknfjrp4d97DF3uBPqKAb5vV8hahNcNA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/promises@7.1.1': - resolution: {integrity: sha512-d3lhCfiFwiVyTRR6zhy1lcjDIh+l0a5gp1WPe64Vfa2gP0myC8P5C1Tknfjrp4d97DF3uBPqKAb5vV8hahNcNA==} + '@solana/promises@8.5.0': + resolution: {integrity: sha512-qWJbU6RGuZVrtvsGZ+2F46jccaIZDX4czYRRhS3m38cCdE+wKMbqGvWND50xP7D9egOxYKHMqJAJbLQH4gspvQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1025,17 +1049,17 @@ packages: typescript: optional: true - '@solana/rpc-api@6.8.0': - resolution: {integrity: sha512-v8ZKWgPtKbF6HeJcfC4ciwI8mwDCizBtRLYYjjHOu+9S9IJYyefQzsQxL5P8OjJPpI4gFauT6gsjQLo76BoojA==} + '@solana/rpc-api@7.1.1': + resolution: {integrity: sha512-ELGIqNbz8apeAxCLdD1PEPAnu6KtgHmWvUbH4VqqNg2jgWquyUOfTI5rblvdflx2Hcb7GK05w8/iiUaknOQKnw==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/rpc-api@7.1.1': - resolution: {integrity: sha512-ELGIqNbz8apeAxCLdD1PEPAnu6KtgHmWvUbH4VqqNg2jgWquyUOfTI5rblvdflx2Hcb7GK05w8/iiUaknOQKnw==} + '@solana/rpc-api@8.5.0': + resolution: {integrity: sha512-qlRZ2yC8WEWNg3VX8UEqlZOitKZaeE6KWbn3A/ybtJAYz+mvr3RMDhnQ89RDqIuxPuAFZNV21BRJv3yB9xR44Q==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1052,17 +1076,17 @@ packages: typescript: optional: true - '@solana/rpc-parsed-types@6.8.0': - resolution: {integrity: sha512-jYddZviBSUYbuUKqvNthet7KbJVI7me6xfRH2znv1SjIpmvhSPJcGN5QrlHVOasHdzEWSpvZa5VYDfnqH3aYvA==} + '@solana/rpc-parsed-types@7.1.1': + resolution: {integrity: sha512-DiQSj2rNnhOKOTs6YDjQ2y4KuOkv8lh6moLFiQnY0+TvanJrGrQjxLSrHdCUQxymQcUxzrraZL9k6vxNzId4gw==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/rpc-parsed-types@7.1.1': - resolution: {integrity: sha512-DiQSj2rNnhOKOTs6YDjQ2y4KuOkv8lh6moLFiQnY0+TvanJrGrQjxLSrHdCUQxymQcUxzrraZL9k6vxNzId4gw==} + '@solana/rpc-parsed-types@8.5.0': + resolution: {integrity: sha512-ktygZ019trgAyjr8y1GN1x4x6wJYw2Ola6UogAfJT5LoNs6kV3k84yCNAlGv34xRPqCVxlWo4nsIWJf8yWQQ2w==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1079,17 +1103,17 @@ packages: typescript: optional: true - '@solana/rpc-spec-types@6.8.0': - resolution: {integrity: sha512-ebCWgiQbIgFOehU7PdRFmYCzda3Azc/qa2Y3P8gexSHSsDAO27VwS4E05XSY+a7cIL5MYmvUa1vpDynl1Rkakw==} + '@solana/rpc-spec-types@7.1.1': + resolution: {integrity: sha512-FDDgXfAPfq28sQNnGhZr/+2kp5QTTcNZ5m/Q9y9Jrlux6brdPsbf9Sh1Q/lgz7i76arzNW/rzRY125RzqGWANg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/rpc-spec-types@7.1.1': - resolution: {integrity: sha512-FDDgXfAPfq28sQNnGhZr/+2kp5QTTcNZ5m/Q9y9Jrlux6brdPsbf9Sh1Q/lgz7i76arzNW/rzRY125RzqGWANg==} + '@solana/rpc-spec-types@8.5.0': + resolution: {integrity: sha512-YUTMKWWlHCGBmA1wxhIilbxJlad5vEsvc8dDO9VWr7GVkQUlipEU79iGaKk4xQ6Oo1mZWxpGz5mAJUqGraTK4A==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1106,17 +1130,17 @@ packages: typescript: optional: true - '@solana/rpc-spec@6.8.0': - resolution: {integrity: sha512-kE5uOspxCVFJKNUu73hlebGiAFosjfYXbbTXAbGKfksPzy84u1oJFC2IVIobLRnqUCw1x7oJcvfnX00Zs0Itpg==} + '@solana/rpc-spec@7.1.1': + resolution: {integrity: sha512-1FwhgL18qasRYlWffdBNIUoxQyGLzdh3YMQW3y33M61vk/q1ldEGJRypV9B/SrXmxwqDiUbQ+m+zgainCTp1ZA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/rpc-spec@7.1.1': - resolution: {integrity: sha512-1FwhgL18qasRYlWffdBNIUoxQyGLzdh3YMQW3y33M61vk/q1ldEGJRypV9B/SrXmxwqDiUbQ+m+zgainCTp1ZA==} + '@solana/rpc-spec@8.5.0': + resolution: {integrity: sha512-0oET5yc880zFGqBMJE2UB7sxW8sIs4hmsP4bmkR2y4ipm1aScC5U+Rd8GaIrupBOVOFj+RXIorC7kQycN/9nhw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1124,20 +1148,20 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions-api@6.8.0': - resolution: {integrity: sha512-cPJOsydyoqkztW3msEH09wPDYqxJcMvO6DBlvrboq6wGu1UjeP66w2eApzQ8POoQHxhyw+CfEXl1Gbu6kKwuMQ==} + '@solana/rpc-subscriptions-api@8.5.0': + resolution: {integrity: sha512-PJaAyqZkpG8vuzdxmdWMwp1JS5pyZ6PuL8OMhx6nCt3phkseqIs1NmAf8pQc/RZjIV3hJMMVCwSDG1DE8DY64w==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/rpc-subscriptions-channel-websocket@6.8.0': - resolution: {integrity: sha512-c3PpkorYwhAz1iuUfM5sLpZQi8xtZFGbaPbaPRELVeDjFSRzoa12KFnuQs4i9fbVbLy5Cnt1t23tf0bL2snZCQ==} + '@solana/rpc-subscriptions-channel-websocket@8.5.0': + resolution: {integrity: sha512-sRYYwBFg31z77zfKpJBcAO9MaUWa+bO1PlBcDiToa4luXGuR3dC8TSpi1Yip4T4NCONNzK3yhyeI6sHhGHc8Qw==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -1151,17 +1175,17 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions-spec@6.8.0': - resolution: {integrity: sha512-+t4L5q9qE6IVfunW3n1amA/3EswJr64pVqRF7234vCUuVUz4PgYfbqtEBV3KkA1o0NwEHHM3pXuofT63nBb8Bg==} + '@solana/rpc-subscriptions-spec@7.1.1': + resolution: {integrity: sha512-yrqd+fV2Ae4hkzXX42aKRmTrz3FwvzKqO4h0ahs88dzSvXpy8l6Svu1k+uRgMlZ64g2P83jfQW+3Pj5fBoxmdw==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/rpc-subscriptions-spec@7.1.1': - resolution: {integrity: sha512-yrqd+fV2Ae4hkzXX42aKRmTrz3FwvzKqO4h0ahs88dzSvXpy8l6Svu1k+uRgMlZ64g2P83jfQW+3Pj5fBoxmdw==} + '@solana/rpc-subscriptions-spec@8.5.0': + resolution: {integrity: sha512-YdCPLHOcQWz8JhMaT/E+YC56nFDJ6D+XOTr6qRWHGe/1PIYGQDVvaFzI7+tF0b6tuv49GoMbpGdkiTX2v6KeUw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1169,11 +1193,11 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions@6.8.0': - resolution: {integrity: sha512-9CotreNZmKAP2z07FY1I7TPPvylKLFF5p4mujB5ZFMHQPp5JVQFVCmMIhSj5voZHAeYx7jdwJ2Kf0RDeClqJzA==} + '@solana/rpc-subscriptions@8.5.0': + resolution: {integrity: sha512-8hdWSDKKtMK3kRrR8TExwFo/bWHxVTu4zJ/JkePTQgNtm95kX25/hy+9JHKRtSsNUfXXYM60sQVE18cGgMU7dA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -1187,17 +1211,17 @@ packages: typescript: optional: true - '@solana/rpc-transformers@6.8.0': - resolution: {integrity: sha512-GzcFkllym7eXbw7grdE41MCb15CjkibrXtr7EFsf4d6LD9DRvzFj2ZRYywS2FB2ibVP0LUXXGk3vmtkZJjfajA==} + '@solana/rpc-transformers@7.1.1': + resolution: {integrity: sha512-k8a/JZFso/nvPBgurOGJ/ZC6sXCtYE3lCvTj95i29pl45C4SgjdetJrAH/pWEEhQXcxaJs7OLBGmCh2enazlJw==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/rpc-transformers@7.1.1': - resolution: {integrity: sha512-k8a/JZFso/nvPBgurOGJ/ZC6sXCtYE3lCvTj95i29pl45C4SgjdetJrAH/pWEEhQXcxaJs7OLBGmCh2enazlJw==} + '@solana/rpc-transformers@8.5.0': + resolution: {integrity: sha512-JYq+EyfzJ1ksZubU9VHynQY1Z3k1tosdxG6KE4Cua/rFuXPosSn7o5h9FLLbSB5cTVcnj0lGNrBaVYW4AVK4iA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1205,11 +1229,11 @@ packages: typescript: optional: true - '@solana/rpc-transport-http@6.8.0': - resolution: {integrity: sha512-jw/L0q2motGcx7yo6KvkKJd2HGVg9gvViXatFloLl1XmHbkwE7+97YYmG17WRuM5xauzI/UGYOXNW7cEB+Uaxw==} + '@solana/rpc-transport-http@8.5.0': + resolution: {integrity: sha512-xfIFZa+oxXLgA6BXaE2bXjiy2yZM1qO1URzzF0lmTekJM/okS8EZAQwEicWpYkvfdHJZ2x/oagD3AOSBBCWrsw==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -1223,17 +1247,17 @@ packages: typescript: optional: true - '@solana/rpc-types@6.8.0': - resolution: {integrity: sha512-vACMV9VR2JsZGDcgaMOFN/dwLK57CsE+erassxxtF12sSPXJooz+Vu1vyY2Yp2EkCc7mDf7BNkTKvSXajbt+Qw==} + '@solana/rpc-types@7.1.1': + resolution: {integrity: sha512-yHlSUWgynaaqevuqipGhhcZnmFVNs+F6KIlbUZ0kQY6NMVtaSzx5AQrtQjbtAQzNRsRTDYkKuQg8nOruiDoseQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/rpc-types@7.1.1': - resolution: {integrity: sha512-yHlSUWgynaaqevuqipGhhcZnmFVNs+F6KIlbUZ0kQY6NMVtaSzx5AQrtQjbtAQzNRsRTDYkKuQg8nOruiDoseQ==} + '@solana/rpc-types@8.5.0': + resolution: {integrity: sha512-L050pZqQ8gaFABF26NAYoatyZZeJo52AKvQQ3i58LRtUc6wcrpCF+4x4U/EDER2YVAc6Qx1xWvGnAomGhI6vzw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1241,11 +1265,11 @@ packages: typescript: optional: true - '@solana/rpc@6.8.0': - resolution: {integrity: sha512-+jW4n9TDmBttY3bO3PdUo54GAnwFrd7UJsyfXoMgl/lWGQq5uddYDgnzQLtHOBP5zKslkR8h0RKkic0GZhMZrQ==} + '@solana/rpc@8.5.0': + resolution: {integrity: sha512-7CQFNOMhXrY/LT0qdsi3h0chy4A/Ao93pyBLqFQqxzlub0st8dC5wl+MDXhkxaBos/DZOu1V4EleWv6qbLMlow==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -1259,17 +1283,17 @@ packages: typescript: optional: true - '@solana/signers@6.8.0': - resolution: {integrity: sha512-7E1cAXBLOcz9kmHhzWdu5m3UJlJzxfwOl8irOMLJI6NnKB2EmU0B0h4I+Mlfs9w8Bfj0WQpUei21ammbNBq39g==} + '@solana/signers@7.1.1': + resolution: {integrity: sha512-UfWYnAglm21q5hS3Op1bU5mYiWfx0VesovZcIur0uYPc3EJlfBVikl8pf745x+bB77xG6lIzNbb+99t48SQbkg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/signers@7.1.1': - resolution: {integrity: sha512-UfWYnAglm21q5hS3Op1bU5mYiWfx0VesovZcIur0uYPc3EJlfBVikl8pf745x+bB77xG6lIzNbb+99t48SQbkg==} + '@solana/signers@8.5.0': + resolution: {integrity: sha512-F9VvFsG9Av+Sbs4mQpuVlszb6msujxnqKQqa4TsRT24GOqKOFr4Xvs7HqgVJV/BPIDnz7u0omUhUILesHJDfkQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1286,17 +1310,17 @@ packages: typescript: optional: true - '@solana/subscribable@6.8.0': - resolution: {integrity: sha512-yj41Q97MiWrOmLj1iRFobvTdtU6H5wz5BlH5FHJg9lyapy1YQyaYF37MZx4LiUj4Ww0V3ReluIZTWWDBOJ53Jg==} + '@solana/subscribable@7.1.1': + resolution: {integrity: sha512-l4Wzc2L+7WQPeC/kaCiia1aaUY/SJJdrNHnLibKchS2pb7YbF7J2OygsweHXliWCVpG0jZwcvIVpusgygbZQLw==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/subscribable@7.1.1': - resolution: {integrity: sha512-l4Wzc2L+7WQPeC/kaCiia1aaUY/SJJdrNHnLibKchS2pb7YbF7J2OygsweHXliWCVpG0jZwcvIVpusgygbZQLw==} + '@solana/subscribable@8.5.0': + resolution: {integrity: sha512-v1/hL/l4kubwYVuaMNmtQcmTgDuKG6e9Hjv9fCxkYCdDIUERgmm9DX/So1386+6rkQBVRC7wTSH86Jq+RIqNGQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1309,49 +1333,60 @@ packages: peerDependencies: '@solana/kit': ^7.0.0 - '@solana/surfpool-darwin-arm64@1.4.0': - resolution: {integrity: sha512-/sh7zJEzulPtBbB7ykUmhhrox+X1BJ1ff/OH81C7X/W0usXZtIRuonSKA2KgWHFFUVFHYRemMv6GmkmbbPlTjQ==} + '@solana/surfpool-darwin-arm64@1.5.0': + resolution: {integrity: sha512-RdjEN7WDAr1Vrp1CD+NAS3pwT//TJclX9zyxjhAMpmBofwDzlCO8/yqv2CbD77UOuB/y3UWz3MvEEHxZfetKsw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@solana/surfpool-darwin-x64@1.4.0': - resolution: {integrity: sha512-AZXo4a/MlmUAsfmbL7MQBf1aHOerR3K0Xj1Cjq64N7D5pXU9dJ4MbtU+xI+V+X6QFSN1WWdr9fIies6BwXl3qg==} + '@solana/surfpool-darwin-x64@1.5.0': + resolution: {integrity: sha512-8ScgLVX32JX7HH0XkijZxlpsNAALuzaJQDUTjJ1aPazKzunliek27TP9ZkVzzBHypyiY59wpwNue9PUGnGKdIw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@solana/surfpool-linux-x64-gnu@1.4.0': - resolution: {integrity: sha512-hOZ+Yq52asaYyM2/mmd9iqir+1FM9aWSKGM7YHgAREy4pGdMvtcgMSAo36n/zCcWfb83Byey8SQUXRvO3CqDag==} + '@solana/surfpool-linux-x64-gnu@1.5.0': + resolution: {integrity: sha512-d+wUCBdzw7U4inKoe+Lj7XlH8Nmd6A00IZOsG3R61NQbqhRVp7zFpVCCzV00RvgAOsSedkI87I6B4ehAuyGPAg==} engines: {node: '>=18'} cpu: [x64] os: [linux] libc: [glibc] - '@solana/surfpool@1.4.0': - resolution: {integrity: sha512-YAHZz4Gkq4JKg82pVt4yENs+zxvcUliyS1Nz5JVBYiww3LZp9SG0Fsf/vHakQdgyuEaBwPuLVhS/PritsEhUbA==} + '@solana/surfpool@1.5.0': + resolution: {integrity: sha512-smTwmZpron2Zf/EcxwcjlJ5cva+nnf4GWpHf7RJj8nEzA4XcHlCDFkO+Dwoe5mapHKelePqFeWpId7Q/7zxEOg==} engines: {node: '>=18'} + peerDependencies: + '@solana/kit': ^7.0.0 + '@solana/kit-plugin-rpc': ^0.15.0 + '@solana/kit-plugin-signer': ^0.13.0 + peerDependenciesMeta: + '@solana/kit': + optional: true + '@solana/kit-plugin-rpc': + optional: true + '@solana/kit-plugin-signer': + optional: true - '@solana/sysvars@6.8.0': - resolution: {integrity: sha512-pwfMpMNL6MSmm07eHQYdTdRdzmPOd+EuVCCaNLSYdWGpYcocVJiaLiNWRV3cXA5wPj/ZFkoUGtc1bo0v7H50lw==} + '@solana/sysvars@8.5.0': + resolution: {integrity: sha512-vidKFEOAujEVizDUHFCmmIpHsS3Zu/fXJKcDUtbUn+bwD9Z1fRiper8rZW3Qdtgu1GmrH3O8MoyL2Nrp7k6QNw==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/transaction-confirmation@6.8.0': - resolution: {integrity: sha512-R6rj8y/+kZqYJr8FR/fWxgi3Pw3eCiacUyjCPTVtdVe6i+hIiBApTGLzXrSRJmAMdpZrjYBZU1cG8C6oAb+B2A==} + '@solana/transaction-confirmation@8.5.0': + resolution: {integrity: sha512-dUVHhyaJ9tt535ZJfgPAdKo6zycCAn1mqKKP/FYvCz/4FiAKnyvqj8rxd66yvvuJVhkpjbcPDDagm/P8JEYUug==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - '@solana/transaction-messages@6.10.0': - resolution: {integrity: sha512-s7v8G3BTxGlKYIj3eWCG0g1296v+1LBt16mVnlRH5FuyaJ5AdhlhtRho5HUDpdwE8EXun+y1c48V6uhcZ8wdbQ==} + '@solana/transaction-introspection@8.5.0': + resolution: {integrity: sha512-VPYVLcpieu5YwwC1wmh3zZ/KHWmqJWPS7iMPVpf90L79/1Dvkg+YYQHnVeN4VQdb7VFnfpTqUnSQpfERDk0Sag==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1359,11 +1394,11 @@ packages: typescript: optional: true - '@solana/transaction-messages@6.8.0': - resolution: {integrity: sha512-jsJu9mAcN1x7onKOeC4WEvYP04UVcnkOYu/9bMe+S9jqjL+3DMy9kFZpV5FBl+TPuTNJrtOqc6Gc28hUWyyp1A==} + '@solana/transaction-messages@6.10.0': + resolution: {integrity: sha512-s7v8G3BTxGlKYIj3eWCG0g1296v+1LBt16mVnlRH5FuyaJ5AdhlhtRho5HUDpdwE8EXun+y1c48V6uhcZ8wdbQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -1377,8 +1412,8 @@ packages: typescript: optional: true - '@solana/transactions@6.10.0': - resolution: {integrity: sha512-VADSqP9OTYmhrox4pcgDd4+RjVmednXSE0+8Y7SPK4PN1pK5Az2RJ0nSsy0xcTnaOr8mF/crwFktqPrRQwSbQA==} + '@solana/transaction-messages@8.5.0': + resolution: {integrity: sha512-8SHxirU5K0kFmOwwD6XTGI5LWP/bLvLBDbemT4xDOaL+6xkLzlTMtzlgKb/Td5UtqyYOoew0FBVLJzJx/QApOw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1386,11 +1421,11 @@ packages: typescript: optional: true - '@solana/transactions@6.8.0': - resolution: {integrity: sha512-Q46m+o3C1yL2EIZBAP5B8ou2VZwHN9wTi+muIS6/giCKO3jwUtnTEbWcZEDMj2vxUb7P2WfwTluZb/VAWxlx7Q==} + '@solana/transactions@6.10.0': + resolution: {integrity: sha512-VADSqP9OTYmhrox4pcgDd4+RjVmednXSE0+8Y7SPK4PN1pK5Az2RJ0nSsy0xcTnaOr8mF/crwFktqPrRQwSbQA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -1404,6 +1439,15 @@ packages: typescript: optional: true + '@solana/transactions@8.5.0': + resolution: {integrity: sha512-IGRWI38rq5b94gy93wn/gVSQBuwNPSUv3GnWkd6R6Tc7jLbfRlYbYHJNHH5o28Fmlr+nlEn4bgu3BiqMWxuLmg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -1539,10 +1583,6 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - commander@15.0.0: resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} engines: {node: '>=22.12.0'} @@ -2029,8 +2069,8 @@ packages: undici-types@7.19.2: resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} - undici-types@8.1.0: - resolution: {integrity: sha512-JlLXdMmH4kxyn2JPtGK/cajzKY7F15OKYG8sO5HfkIC1AC09sLUeptGFKjnMWnprDQ2EwzYDO3kgzkK3aaoHCA==} + undici-types@8.12.3: + resolution: {integrity: sha512-EXE4ydL3S76dFb27UFjNVZHTyv/TLdATj/KUe29ptdcg6qXL48J2tZ3126E5kICj5jn781OR+XlVH1N6Mz8jbA==} unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} @@ -2319,59 +2359,73 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 - '@solana-program/compute-budget@0.15.0(@solana/kit@6.8.0(typescript@5.9.3))': + '@solana-program/compute-budget@0.15.0(@solana/kit@8.5.0(typescript@5.9.3))': dependencies: - '@solana/kit': 6.8.0(typescript@5.9.3) + '@solana/kit': 8.5.0(typescript@5.9.3) - '@solana-program/record@0.3.0(@solana/kit@6.8.0(typescript@5.9.3))': + '@solana-program/compute-budget@0.20.0(@solana/kit@8.5.0(typescript@5.9.3))': dependencies: - '@solana/kit': 6.8.0(typescript@5.9.3) + '@solana/kit': 8.5.0(typescript@5.9.3) - '@solana-program/system@0.12.0(@solana/kit@6.8.0(typescript@5.9.3))': + '@solana-program/record@0.3.0(@solana/kit@8.5.0(typescript@5.9.3))': dependencies: - '@solana/kit': 6.8.0(typescript@5.9.3) + '@solana/kit': 8.5.0(typescript@5.9.3) - '@solana-program/system@0.13.0(@solana/kit@6.8.0(typescript@5.9.3))': + '@solana-program/record@0.6.0(@solana/kit@8.5.0(typescript@5.9.3))': dependencies: - '@solana/kit': 6.8.0(typescript@5.9.3) + '@solana-program/system': 0.16.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana/kit': 8.5.0(typescript@5.9.3) - '@solana-program/token-2022@0.11.0(@solana/kit@6.8.0(typescript@5.9.3))': + '@solana-program/system@0.12.0(@solana/kit@8.5.0(typescript@5.9.3))': dependencies: - '@noble/curves': 1.9.7 - '@solana-program/zk-elgamal-proof': 0.1.0(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana/kit': 6.8.0(typescript@5.9.3) + '@solana/kit': 8.5.0(typescript@5.9.3) + + '@solana-program/system@0.13.0(@solana/kit@8.5.0(typescript@5.9.3))': + dependencies: + '@solana/kit': 8.5.0(typescript@5.9.3) - '@solana-program/token-2022@0.14.1(@solana/kit@6.8.0(typescript@5.9.3))': + '@solana-program/system@0.16.0(@solana/kit@8.5.0(typescript@5.9.3))': + dependencies: + '@solana/kit': 8.5.0(typescript@5.9.3) + + '@solana-program/token-2022@0.14.1(@solana/kit@8.5.0(typescript@5.9.3))': dependencies: '@noble/curves': 1.9.7 - '@solana-program/record': 0.3.0(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana-program/zk-elgamal-proof': 0.3.2(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana/kit': 6.8.0(typescript@5.9.3) + '@solana-program/record': 0.3.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana-program/zk-elgamal-proof': 0.3.2(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana/kit': 8.5.0(typescript@5.9.3) + + '@solana-program/token-2022@0.20.0(@solana/kit@8.5.0(typescript@5.9.3))': + dependencies: + '@solana-program/record': 0.6.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana-program/system': 0.16.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana-program/zk-elgamal-proof': 0.5.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana/kit': 8.5.0(typescript@5.9.3) - '@solana-program/token@0.11.0(@solana/kit@6.8.0(typescript@5.9.3))': + '@solana-program/token@0.11.0(@solana/kit@8.5.0(typescript@5.9.3))': dependencies: - '@solana-program/system': 0.12.0(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana/kit': 6.8.0(typescript@5.9.3) + '@solana-program/system': 0.12.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana/kit': 8.5.0(typescript@5.9.3) - '@solana-program/token@0.13.0(@solana/kit@6.8.0(typescript@5.9.3))': + '@solana-program/token@0.15.0(@solana/kit@8.5.0(typescript@5.9.3))': dependencies: - '@solana-program/system': 0.12.0(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana/kit': 6.8.0(typescript@5.9.3) + '@solana-program/system': 0.13.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana/kit': 8.5.0(typescript@5.9.3) - '@solana-program/token@0.15.0(@solana/kit@6.8.0(typescript@5.9.3))': + '@solana-program/token@0.18.0(@solana/kit@8.5.0(typescript@5.9.3))': dependencies: - '@solana-program/system': 0.13.0(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana/kit': 6.8.0(typescript@5.9.3) + '@solana-program/system': 0.16.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana/kit': 8.5.0(typescript@5.9.3) - '@solana-program/zk-elgamal-proof@0.1.0(@solana/kit@6.8.0(typescript@5.9.3))': + '@solana-program/zk-elgamal-proof@0.3.2(@solana/kit@8.5.0(typescript@5.9.3))': dependencies: - '@solana-program/system': 0.12.0(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana/kit': 6.8.0(typescript@5.9.3) + '@solana-program/system': 0.13.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana/kit': 8.5.0(typescript@5.9.3) - '@solana-program/zk-elgamal-proof@0.3.2(@solana/kit@6.8.0(typescript@5.9.3))': + '@solana-program/zk-elgamal-proof@0.5.0(@solana/kit@8.5.0(typescript@5.9.3))': dependencies: - '@solana-program/system': 0.13.0(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana/kit': 6.8.0(typescript@5.9.3) + '@solana-program/system': 0.16.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana/kit': 8.5.0(typescript@5.9.3) '@solana/accounts@6.10.0(typescript@5.9.3)': dependencies: @@ -2386,19 +2440,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/accounts@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.8.0(typescript@5.9.3) - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/codecs-strings': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/rpc-spec': 6.8.0(typescript@5.9.3) - '@solana/rpc-types': 6.8.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/accounts@7.1.1(typescript@5.9.3)': dependencies: '@solana/addresses': 7.1.1(typescript@5.9.3) @@ -2412,25 +2453,26 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/addresses@6.10.0(typescript@5.9.3)': + '@solana/accounts@8.5.0(typescript@5.9.3)': dependencies: - '@solana/assertions': 6.10.0(typescript@5.9.3) - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-strings': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/nominal-types': 6.10.0(typescript@5.9.3) + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/addresses@6.8.0(typescript@5.9.3)': + '@solana/addresses@6.10.0(typescript@5.9.3)': dependencies: - '@solana/assertions': 6.8.0(typescript@5.9.3) - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/codecs-strings': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/nominal-types': 6.8.0(typescript@5.9.3) + '@solana/assertions': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -2448,15 +2490,21 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/assertions@6.10.0(typescript@5.9.3)': + '@solana/addresses@8.5.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/assertions': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@solana/assertions@6.8.0(typescript@5.9.3)': + '@solana/assertions@6.10.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.8.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -2466,15 +2514,15 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/codecs-core@6.10.0(typescript@5.9.3)': + '@solana/assertions@8.5.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/codecs-core@6.8.0(typescript@5.9.3)': + '@solana/codecs-core@6.10.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.8.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -2484,19 +2532,17 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/codecs-data-structures@6.10.0(typescript@5.9.3)': + '@solana/codecs-core@8.5.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/codecs-data-structures@6.8.0(typescript@5.9.3)': + '@solana/codecs-data-structures@6.10.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -2508,17 +2554,18 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/codecs-numbers@6.10.0(typescript@5.9.3)': + '@solana/codecs-data-structures@8.5.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/codecs-numbers@6.8.0(typescript@5.9.3)': + '@solana/codecs-numbers@6.10.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -2529,19 +2576,18 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/codecs-strings@6.10.0(typescript@5.9.3)': + '@solana/codecs-numbers@8.5.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/codecs-strings@6.8.0(typescript@5.9.3)': + '@solana/codecs-strings@6.10.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -2553,13 +2599,22 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/codecs@6.8.0(typescript@5.9.3)': + '@solana/codecs-strings@8.5.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.8.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.8.0(typescript@5.9.3) - '@solana/codecs-strings': 6.8.0(typescript@5.9.3) - '@solana/options': 6.8.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-data-structures': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/fixed-points': 8.5.0(typescript@5.9.3) + '@solana/options': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -2572,21 +2627,21 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/errors@6.8.0(typescript@5.9.3)': + '@solana/errors@7.1.1(typescript@5.9.3)': dependencies: chalk: 5.6.2 - commander: 14.0.3 + commander: 15.0.0 optionalDependencies: typescript: 5.9.3 - '@solana/errors@7.1.1(typescript@5.9.3)': + '@solana/errors@8.5.0(typescript@5.9.3)': dependencies: chalk: 5.6.2 commander: 15.0.0 optionalDependencies: typescript: 5.9.3 - '@solana/fast-stable-stringify@6.8.0(typescript@5.9.3)': + '@solana/fast-stable-stringify@8.5.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 @@ -2604,11 +2659,14 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/functional@6.10.0(typescript@5.9.3)': + '@solana/fixed-points@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/functional@6.8.0(typescript@5.9.3)': + '@solana/functional@6.10.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 @@ -2616,6 +2674,10 @@ snapshots: optionalDependencies: typescript: 5.9.3 + '@solana/functional@8.5.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + '@solana/instruction-plans@6.10.0(typescript@5.9.3)': dependencies: '@solana/errors': 6.10.0(typescript@5.9.3) @@ -2629,19 +2691,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/instruction-plans@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/instructions': 6.8.0(typescript@5.9.3) - '@solana/keys': 6.8.0(typescript@5.9.3) - '@solana/promises': 6.8.0(typescript@5.9.3) - '@solana/transaction-messages': 6.8.0(typescript@5.9.3) - '@solana/transactions': 6.8.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/instruction-plans@7.1.1(typescript@5.9.3)': dependencies: '@solana/errors': 7.1.1(typescript@5.9.3) @@ -2655,17 +2704,23 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/instructions@6.10.0(typescript@5.9.3)': + '@solana/instruction-plans@8.5.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/instructions': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/promises': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@solana/instructions@6.8.0(typescript@5.9.3)': + '@solana/instructions@6.10.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -2676,23 +2731,30 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/keychain-core@1.4.0(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3))': + '@solana/instructions@8.5.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 7.1.1(typescript@5.9.3) - '@solana/codecs-core': 7.1.1(typescript@5.9.3) - '@solana/codecs-strings': 7.1.1(typescript@5.9.3) - '@solana/keys': 7.1.1(typescript@5.9.3) - '@solana/signers': 7.1.1(typescript@5.9.3) - '@solana/transactions': 7.1.1(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 - '@solana/keychain-memory@1.4.0(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3))': + '@solana/keychain-core@1.4.0(@solana/addresses@8.5.0(typescript@5.9.3))(@solana/codecs-core@8.5.0(typescript@5.9.3))(@solana/codecs-strings@8.5.0(typescript@5.9.3))(@solana/keys@8.5.0(typescript@5.9.3))(@solana/signers@8.5.0(typescript@5.9.3))(@solana/transactions@8.5.0(typescript@5.9.3))': dependencies: - '@solana/addresses': 7.1.1(typescript@5.9.3) - '@solana/codecs-strings': 7.1.1(typescript@5.9.3) - '@solana/keychain-core': 1.4.0(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3)) - '@solana/keys': 7.1.1(typescript@5.9.3) - '@solana/signers': 7.1.1(typescript@5.9.3) - '@solana/transactions': 7.1.1(typescript@5.9.3) + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/signers': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) + + '@solana/keychain-memory@1.4.0(@solana/addresses@8.5.0(typescript@5.9.3))(@solana/codecs-core@8.5.0(typescript@5.9.3))(@solana/codecs-strings@8.5.0(typescript@5.9.3))(@solana/keys@8.5.0(typescript@5.9.3))(@solana/signers@8.5.0(typescript@5.9.3))(@solana/transactions@8.5.0(typescript@5.9.3))': + dependencies: + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/keychain-core': 1.4.0(@solana/addresses@8.5.0(typescript@5.9.3))(@solana/codecs-core@8.5.0(typescript@5.9.3))(@solana/codecs-strings@8.5.0(typescript@5.9.3))(@solana/keys@8.5.0(typescript@5.9.3))(@solana/signers@8.5.0(typescript@5.9.3))(@solana/transactions@8.5.0(typescript@5.9.3)) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/signers': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) transitivePeerDependencies: - '@solana/codecs-core' @@ -2709,19 +2771,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/keys@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/assertions': 6.8.0(typescript@5.9.3) - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/codecs-strings': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/nominal-types': 6.8.0(typescript@5.9.3) - '@solana/promises': 6.8.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/keys@7.1.1(typescript@5.9.3)': dependencies: '@solana/assertions': 7.1.1(typescript@5.9.3) @@ -2735,46 +2784,61 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/kit-plugin-instruction-plan@0.13.0(@solana/kit@6.8.0(typescript@5.9.3))': - dependencies: - '@solana/kit': 6.8.0(typescript@5.9.3) - - '@solana/kit-plugin-rpc@0.15.0(@solana/kit@6.8.0(typescript@5.9.3))': - dependencies: - '@solana/kit': 6.8.0(typescript@5.9.3) - '@solana/kit-plugin-instruction-plan': 0.13.0(@solana/kit@6.8.0(typescript@5.9.3)) - - '@solana/kit-plugin-signer@0.13.0(@solana/kit@6.8.0(typescript@5.9.3))': - dependencies: - '@solana/kit': 6.8.0(typescript@5.9.3) - - '@solana/kit@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/accounts': 6.8.0(typescript@5.9.3) - '@solana/addresses': 6.8.0(typescript@5.9.3) - '@solana/codecs': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/functional': 6.8.0(typescript@5.9.3) - '@solana/instruction-plans': 6.8.0(typescript@5.9.3) - '@solana/instructions': 6.8.0(typescript@5.9.3) - '@solana/keys': 6.8.0(typescript@5.9.3) - '@solana/offchain-messages': 6.8.0(typescript@5.9.3) - '@solana/plugin-core': 6.8.0(typescript@5.9.3) - '@solana/plugin-interfaces': 6.8.0(typescript@5.9.3) - '@solana/program-client-core': 6.8.0(typescript@5.9.3) - '@solana/programs': 6.8.0(typescript@5.9.3) - '@solana/rpc': 6.8.0(typescript@5.9.3) - '@solana/rpc-api': 6.8.0(typescript@5.9.3) - '@solana/rpc-parsed-types': 6.8.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.8.0(typescript@5.9.3) - '@solana/rpc-subscriptions': 6.8.0(typescript@5.9.3) - '@solana/rpc-types': 6.8.0(typescript@5.9.3) - '@solana/signers': 6.8.0(typescript@5.9.3) - '@solana/subscribable': 6.8.0(typescript@5.9.3) - '@solana/sysvars': 6.8.0(typescript@5.9.3) - '@solana/transaction-confirmation': 6.8.0(typescript@5.9.3) - '@solana/transaction-messages': 6.8.0(typescript@5.9.3) - '@solana/transactions': 6.8.0(typescript@5.9.3) + '@solana/keys@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/assertions': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) + '@solana/promises': 8.5.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/kit-plugin-instruction-plan@0.13.0(@solana/kit@8.5.0(typescript@5.9.3))': + dependencies: + '@solana/kit': 8.5.0(typescript@5.9.3) + + '@solana/kit-plugin-rpc@0.15.0(@solana/kit@8.5.0(typescript@5.9.3))': + dependencies: + '@solana/kit': 8.5.0(typescript@5.9.3) + '@solana/kit-plugin-instruction-plan': 0.13.0(@solana/kit@8.5.0(typescript@5.9.3)) + + '@solana/kit-plugin-signer@0.13.0(@solana/kit@8.5.0(typescript@5.9.3))': + dependencies: + '@solana/kit': 8.5.0(typescript@5.9.3) + + '@solana/kit@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 8.5.0(typescript@5.9.3) + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/functional': 8.5.0(typescript@5.9.3) + '@solana/instruction-plans': 8.5.0(typescript@5.9.3) + '@solana/instructions': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/offchain-messages': 8.5.0(typescript@5.9.3) + '@solana/plugin-core': 8.5.0(typescript@5.9.3) + '@solana/plugin-interfaces': 8.5.0(typescript@5.9.3) + '@solana/program-client-core': 8.5.0(typescript@5.9.3) + '@solana/programs': 8.5.0(typescript@5.9.3) + '@solana/promises': 8.5.0(typescript@5.9.3) + '@solana/rpc': 8.5.0(typescript@5.9.3) + '@solana/rpc-api': 8.5.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/signers': 8.5.0(typescript@5.9.3) + '@solana/subscribable': 8.5.0(typescript@5.9.3) + '@solana/sysvars': 8.5.0(typescript@5.9.3) + '@solana/transaction-confirmation': 8.5.0(typescript@5.9.3) + '@solana/transaction-introspection': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -2782,15 +2846,15 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate - '@solana/mpp@file:../typescript/packages/mpp(@solana/kit@6.8.0(typescript@5.9.3))(mppx@0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)))(typescript@5.9.3)': + '@solana/mpp@file:../typescript/packages/mpp(@solana/kit@8.5.0(typescript@5.9.3))(mppx@0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)))(typescript@5.9.3)': dependencies: - '@solana-program/compute-budget': 0.15.0(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana-program/system': 0.12.0(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana-program/token': 0.11.0(@solana/kit@6.8.0(typescript@5.9.3)) + '@solana-program/compute-budget': 0.15.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana-program/system': 0.12.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana-program/token': 0.11.0(@solana/kit@8.5.0(typescript@5.9.3)) '@solana/addresses': 6.10.0(typescript@5.9.3) - '@solana/kit': 6.8.0(typescript@5.9.3) + '@solana/kit': 8.5.0(typescript@5.9.3) '@solana/program-client-core': 6.10.0(typescript@5.9.3) - '@solana/subscriptions': 0.5.0(@solana/kit@6.8.0(typescript@5.9.3))(typescript@5.9.3) + '@solana/subscriptions': 0.5.0(@solana/kit@8.5.0(typescript@5.9.3))(typescript@5.9.3) mppx: 0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)) zod: 4.6.7 transitivePeerDependencies: @@ -2803,11 +2867,11 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/nominal-types@6.8.0(typescript@5.9.3)': + '@solana/nominal-types@7.1.1(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 - '@solana/nominal-types@7.1.1(typescript@5.9.3)': + '@solana/nominal-types@8.5.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 @@ -2826,21 +2890,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/offchain-messages@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.8.0(typescript@5.9.3) - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.8.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.8.0(typescript@5.9.3) - '@solana/codecs-strings': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/keys': 6.8.0(typescript@5.9.3) - '@solana/nominal-types': 6.8.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/offchain-messages@7.1.1(typescript@5.9.3)': dependencies: '@solana/addresses': 7.1.1(typescript@5.9.3) @@ -2856,25 +2905,40 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/options@6.8.0(typescript@5.9.3)': + '@solana/offchain-messages@8.5.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.8.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.8.0(typescript@5.9.3) - '@solana/codecs-strings': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-data-structures': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/pay-kit@file:../typescript/packages/pay-kit(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3))(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7))': + '@solana/options@8.5.0(typescript@5.9.3)': dependencies: - '@solana-program/compute-budget': 0.15.0(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana-program/token': 0.13.0(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana-program/token-2022': 0.11.0(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana/keychain-memory': 1.4.0(@solana/addresses@7.1.1(typescript@5.9.3))(@solana/codecs-core@7.1.1(typescript@5.9.3))(@solana/codecs-strings@7.1.1(typescript@5.9.3))(@solana/keys@7.1.1(typescript@5.9.3))(@solana/signers@7.1.1(typescript@5.9.3))(@solana/transactions@7.1.1(typescript@5.9.3)) - '@solana/kit': 6.8.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-data-structures': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/pay-kit@file:../typescript/packages/pay-kit(@solana/addresses@8.5.0(typescript@5.9.3))(@solana/codecs-core@8.5.0(typescript@5.9.3))(@solana/codecs-strings@8.5.0(typescript@5.9.3))(@solana/keys@8.5.0(typescript@5.9.3))(@solana/signers@8.5.0(typescript@5.9.3))(@solana/transactions@8.5.0(typescript@5.9.3))(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7))': + dependencies: + '@solana-program/compute-budget': 0.20.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana-program/token': 0.18.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana-program/token-2022': 0.20.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana/keychain-memory': 1.4.0(@solana/addresses@8.5.0(typescript@5.9.3))(@solana/codecs-core@8.5.0(typescript@5.9.3))(@solana/codecs-strings@8.5.0(typescript@5.9.3))(@solana/keys@8.5.0(typescript@5.9.3))(@solana/signers@8.5.0(typescript@5.9.3))(@solana/transactions@8.5.0(typescript@5.9.3)) + '@solana/kit': 8.5.0(typescript@5.9.3) mppx: 0.8.19(express@4.22.2)(typescript@5.9.3)(viem@2.57.2(typescript@5.9.3)(zod@4.6.7)) transitivePeerDependencies: - '@modelcontextprotocol/sdk' @@ -2895,7 +2959,7 @@ snapshots: - utf-8-validate - viem - '@solana/plugin-core@6.8.0(typescript@5.9.3)': + '@solana/plugin-core@8.5.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 @@ -2913,20 +2977,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/plugin-interfaces@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.8.0(typescript@5.9.3) - '@solana/instruction-plans': 6.8.0(typescript@5.9.3) - '@solana/keys': 6.8.0(typescript@5.9.3) - '@solana/rpc-spec': 6.8.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.8.0(typescript@5.9.3) - '@solana/rpc-types': 6.8.0(typescript@5.9.3) - '@solana/signers': 6.8.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/plugin-interfaces@7.1.1(typescript@5.9.3)': dependencies: '@solana/accounts': 7.1.1(typescript@5.9.3) @@ -2942,6 +2992,22 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/plugin-interfaces@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 8.5.0(typescript@5.9.3) + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/instruction-plans': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/signers': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/program-client-core@6.10.0(typescript@5.9.3)': dependencies: '@solana/accounts': 6.10.0(typescript@5.9.3) @@ -2958,22 +3024,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/program-client-core@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/accounts': 6.8.0(typescript@5.9.3) - '@solana/addresses': 6.8.0(typescript@5.9.3) - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/instruction-plans': 6.8.0(typescript@5.9.3) - '@solana/instructions': 6.8.0(typescript@5.9.3) - '@solana/plugin-interfaces': 6.8.0(typescript@5.9.3) - '@solana/rpc-api': 6.8.0(typescript@5.9.3) - '@solana/signers': 6.8.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/program-client-core@7.1.1(typescript@5.9.3)': dependencies: '@solana/accounts': 7.1.1(typescript@5.9.3) @@ -2990,10 +3040,26 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/programs@6.8.0(typescript@5.9.3)': + '@solana/program-client-core@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 8.5.0(typescript@5.9.3) + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/instruction-plans': 8.5.0(typescript@5.9.3) + '@solana/instructions': 8.5.0(typescript@5.9.3) + '@solana/plugin-interfaces': 8.5.0(typescript@5.9.3) + '@solana/rpc-api': 8.5.0(typescript@5.9.3) + '@solana/signers': 8.5.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/programs@8.5.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -3003,11 +3069,11 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/promises@6.8.0(typescript@5.9.3)': + '@solana/promises@7.1.1(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 - '@solana/promises@7.1.1(typescript@5.9.3)': + '@solana/promises@8.5.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 @@ -3029,24 +3095,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-api@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.8.0(typescript@5.9.3) - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/codecs-strings': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/keys': 6.8.0(typescript@5.9.3) - '@solana/rpc-parsed-types': 6.8.0(typescript@5.9.3) - '@solana/rpc-spec': 6.8.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.8.0(typescript@5.9.3) - '@solana/rpc-types': 6.8.0(typescript@5.9.3) - '@solana/transaction-messages': 6.8.0(typescript@5.9.3) - '@solana/transactions': 6.8.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/rpc-api@7.1.1(typescript@5.9.3)': dependencies: '@solana/addresses': 7.1.1(typescript@5.9.3) @@ -3065,11 +3113,25 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-parsed-types@6.10.0(typescript@5.9.3)': + '@solana/rpc-api@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-transformers': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@solana/rpc-parsed-types@6.8.0(typescript@5.9.3)': + '@solana/rpc-parsed-types@6.10.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 @@ -3077,11 +3139,11 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/rpc-spec-types@6.10.0(typescript@5.9.3)': + '@solana/rpc-parsed-types@8.5.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 - '@solana/rpc-spec-types@6.8.0(typescript@5.9.3)': + '@solana/rpc-spec-types@6.10.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 @@ -3091,18 +3153,17 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/rpc-spec@6.10.0(typescript@5.9.3)': + '@solana/rpc-spec-types@8.5.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) - '@solana/subscribable': 6.10.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/rpc-spec@6.8.0(typescript@5.9.3)': + '@solana/rpc-spec@6.10.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.8.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) + '@solana/subscribable': 6.10.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -3114,26 +3175,34 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/rpc-subscriptions-api@6.8.0(typescript@5.9.3)': + '@solana/rpc-spec@8.5.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.8.0(typescript@5.9.3) - '@solana/keys': 6.8.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.8.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.8.0(typescript@5.9.3) - '@solana/rpc-types': 6.8.0(typescript@5.9.3) - '@solana/transaction-messages': 6.8.0(typescript@5.9.3) - '@solana/transactions': 6.8.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec-types': 8.5.0(typescript@5.9.3) + '@solana/subscribable': 8.5.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-subscriptions-api@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-transformers': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-subscriptions-channel-websocket@6.8.0(typescript@5.9.3)': + '@solana/rpc-subscriptions-channel-websocket@8.5.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/functional': 6.8.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.8.0(typescript@5.9.3) - '@solana/subscribable': 6.8.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/functional': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 8.5.0(typescript@5.9.3) + '@solana/subscribable': 8.5.0(typescript@5.9.3) ws: 8.21.0 optionalDependencies: typescript: 5.9.3 @@ -3150,15 +3219,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/rpc-subscriptions-spec@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/promises': 6.8.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.8.0(typescript@5.9.3) - '@solana/subscribable': 6.8.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - '@solana/rpc-subscriptions-spec@7.1.1(typescript@5.9.3)': dependencies: '@solana/errors': 7.1.1(typescript@5.9.3) @@ -3168,19 +3228,28 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/rpc-subscriptions@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/fast-stable-stringify': 6.8.0(typescript@5.9.3) - '@solana/functional': 6.8.0(typescript@5.9.3) - '@solana/promises': 6.8.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.8.0(typescript@5.9.3) - '@solana/rpc-subscriptions-api': 6.8.0(typescript@5.9.3) - '@solana/rpc-subscriptions-channel-websocket': 6.8.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.8.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.8.0(typescript@5.9.3) - '@solana/rpc-types': 6.8.0(typescript@5.9.3) - '@solana/subscribable': 6.8.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/promises': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec-types': 8.5.0(typescript@5.9.3) + '@solana/subscribable': 8.5.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-subscriptions@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 8.5.0(typescript@5.9.3) + '@solana/functional': 8.5.0(typescript@5.9.3) + '@solana/promises': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions-api': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions-channel-websocket': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-transformers': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/subscribable': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -3200,18 +3269,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-transformers@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/functional': 6.8.0(typescript@5.9.3) - '@solana/nominal-types': 6.8.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.8.0(typescript@5.9.3) - '@solana/rpc-types': 6.8.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/rpc-transformers@7.1.1(typescript@5.9.3)': dependencies: '@solana/errors': 7.1.1(typescript@5.9.3) @@ -3224,12 +3281,24 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-transport-http@6.8.0(typescript@5.9.3)': + '@solana/rpc-transformers@8.5.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/rpc-spec': 6.8.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.8.0(typescript@5.9.3) - undici-types: 8.1.0 + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/functional': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-transport-http@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec-types': 8.5.0(typescript@5.9.3) + undici-types: 8.12.3 optionalDependencies: typescript: 5.9.3 @@ -3247,19 +3316,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-types@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.8.0(typescript@5.9.3) - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.8.0(typescript@5.9.3) - '@solana/codecs-strings': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/nominal-types': 6.8.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/rpc-types@7.1.1(typescript@5.9.3)': dependencies: '@solana/addresses': 7.1.1(typescript@5.9.3) @@ -3274,17 +3330,31 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/fast-stable-stringify': 6.8.0(typescript@5.9.3) - '@solana/functional': 6.8.0(typescript@5.9.3) - '@solana/rpc-api': 6.8.0(typescript@5.9.3) - '@solana/rpc-spec': 6.8.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.8.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.8.0(typescript@5.9.3) - '@solana/rpc-transport-http': 6.8.0(typescript@5.9.3) - '@solana/rpc-types': 6.8.0(typescript@5.9.3) + '@solana/rpc-types@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/fixed-points': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 8.5.0(typescript@5.9.3) + '@solana/functional': 8.5.0(typescript@5.9.3) + '@solana/rpc-api': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-transformers': 8.5.0(typescript@5.9.3) + '@solana/rpc-transport-http': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -3306,22 +3376,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/signers@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.8.0(typescript@5.9.3) - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/instructions': 6.8.0(typescript@5.9.3) - '@solana/keys': 6.8.0(typescript@5.9.3) - '@solana/nominal-types': 6.8.0(typescript@5.9.3) - '@solana/offchain-messages': 6.8.0(typescript@5.9.3) - '@solana/transaction-messages': 6.8.0(typescript@5.9.3) - '@solana/transactions': 6.8.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/signers@7.1.1(typescript@5.9.3)': dependencies: '@solana/addresses': 7.1.1(typescript@5.9.3) @@ -3338,6 +3392,22 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/signers@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/instructions': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) + '@solana/offchain-messages': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/subscribable@6.10.0(typescript@5.9.3)': dependencies: '@solana/errors': 6.10.0(typescript@5.9.3) @@ -3345,26 +3415,27 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/subscribable@6.8.0(typescript@5.9.3)': + '@solana/subscribable@7.1.1(typescript@5.9.3)': dependencies: - '@solana/errors': 6.8.0(typescript@5.9.3) + '@solana/errors': 7.1.1(typescript@5.9.3) + '@solana/promises': 7.1.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/subscribable@7.1.1(typescript@5.9.3)': + '@solana/subscribable@8.5.0(typescript@5.9.3)': dependencies: - '@solana/errors': 7.1.1(typescript@5.9.3) - '@solana/promises': 7.1.1(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/promises': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/subscriptions@0.5.0(@solana/kit@6.8.0(typescript@5.9.3))(typescript@5.9.3)': + '@solana/subscriptions@0.5.0(@solana/kit@8.5.0(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@solana-program/token': 0.15.0(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana-program/token-2022': 0.14.1(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana/kit': 6.8.0(typescript@5.9.3) - '@solana/kit-plugin-rpc': 0.15.0(@solana/kit@6.8.0(typescript@5.9.3)) - '@solana/kit-plugin-signer': 0.13.0(@solana/kit@6.8.0(typescript@5.9.3)) + '@solana-program/token': 0.15.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana-program/token-2022': 0.14.1(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana/kit': 8.5.0(typescript@5.9.3) + '@solana/kit-plugin-rpc': 0.15.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana/kit-plugin-signer': 0.13.0(@solana/kit@8.5.0(typescript@5.9.3)) '@solana/program-client-core': 7.1.1(typescript@5.9.3) transitivePeerDependencies: - '@solana/sysvars' @@ -3372,46 +3443,49 @@ snapshots: - fastestsmallesttextencoderdecoder - typescript - '@solana/surfpool-darwin-arm64@1.4.0': + '@solana/surfpool-darwin-arm64@1.5.0': optional: true - '@solana/surfpool-darwin-x64@1.4.0': + '@solana/surfpool-darwin-x64@1.5.0': optional: true - '@solana/surfpool-linux-x64-gnu@1.4.0': + '@solana/surfpool-linux-x64-gnu@1.5.0': optional: true - '@solana/surfpool@1.4.0': + '@solana/surfpool@1.5.0(@solana/kit-plugin-rpc@0.15.0(@solana/kit@8.5.0(typescript@5.9.3)))(@solana/kit-plugin-signer@0.13.0(@solana/kit@8.5.0(typescript@5.9.3)))(@solana/kit@8.5.0(typescript@5.9.3))': optionalDependencies: - '@solana/surfpool-darwin-arm64': 1.4.0 - '@solana/surfpool-darwin-x64': 1.4.0 - '@solana/surfpool-linux-x64-gnu': 1.4.0 - - '@solana/sysvars@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/accounts': 6.8.0(typescript@5.9.3) - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.8.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/rpc-types': 6.8.0(typescript@5.9.3) + '@solana/kit': 8.5.0(typescript@5.9.3) + '@solana/kit-plugin-rpc': 0.15.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana/kit-plugin-signer': 0.13.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana/surfpool-darwin-arm64': 1.5.0 + '@solana/surfpool-darwin-x64': 1.5.0 + '@solana/surfpool-linux-x64-gnu': 1.5.0 + + '@solana/sysvars@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-data-structures': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/transaction-confirmation@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.8.0(typescript@5.9.3) - '@solana/codecs-strings': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/keys': 6.8.0(typescript@5.9.3) - '@solana/promises': 6.8.0(typescript@5.9.3) - '@solana/rpc': 6.8.0(typescript@5.9.3) - '@solana/rpc-subscriptions': 6.8.0(typescript@5.9.3) - '@solana/rpc-types': 6.8.0(typescript@5.9.3) - '@solana/transaction-messages': 6.8.0(typescript@5.9.3) - '@solana/transactions': 6.8.0(typescript@5.9.3) + '@solana/transaction-confirmation@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/promises': 8.5.0(typescript@5.9.3) + '@solana/rpc': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -3419,6 +3493,21 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate + '@solana/transaction-introspection@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/instructions': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/transaction-messages@6.10.0(typescript@5.9.3)': dependencies: '@solana/addresses': 6.10.0(typescript@5.9.3) @@ -3435,22 +3524,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/transaction-messages@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.8.0(typescript@5.9.3) - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.8.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/functional': 6.8.0(typescript@5.9.3) - '@solana/instructions': 6.8.0(typescript@5.9.3) - '@solana/nominal-types': 6.8.0(typescript@5.9.3) - '@solana/rpc-types': 6.8.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/transaction-messages@7.1.1(typescript@5.9.3)': dependencies: '@solana/addresses': 7.1.1(typescript@5.9.3) @@ -3467,6 +3540,22 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/transaction-messages@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-data-structures': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/functional': 8.5.0(typescript@5.9.3) + '@solana/instructions': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/transactions@6.10.0(typescript@5.9.3)': dependencies: '@solana/addresses': 6.10.0(typescript@5.9.3) @@ -3486,25 +3575,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/transactions@6.8.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.8.0(typescript@5.9.3) - '@solana/codecs-core': 6.8.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.8.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.8.0(typescript@5.9.3) - '@solana/codecs-strings': 6.8.0(typescript@5.9.3) - '@solana/errors': 6.8.0(typescript@5.9.3) - '@solana/functional': 6.8.0(typescript@5.9.3) - '@solana/instructions': 6.8.0(typescript@5.9.3) - '@solana/keys': 6.8.0(typescript@5.9.3) - '@solana/nominal-types': 6.8.0(typescript@5.9.3) - '@solana/rpc-types': 6.8.0(typescript@5.9.3) - '@solana/transaction-messages': 6.8.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/transactions@7.1.1(typescript@5.9.3)': dependencies: '@solana/addresses': 7.1.1(typescript@5.9.3) @@ -3524,6 +3594,25 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/transactions@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-data-structures': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/functional': 8.5.0(typescript@5.9.3) + '@solana/instructions': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@standard-schema/spec@1.1.0': {} '@stripe/stripe-js@9.13.0': {} @@ -3678,8 +3767,6 @@ snapshots: chalk@5.6.2: {} - commander@14.0.3: {} - commander@15.0.0: {} content-disposition@0.5.4: @@ -4171,7 +4258,7 @@ snapshots: undici-types@7.19.2: {} - undici-types@8.1.0: {} + undici-types@8.12.3: {} unpipe@1.0.0: {} diff --git a/harness/requirements/x402-txv1.toml b/harness/requirements/x402-txv1.toml index e89d26fa4..3627bff41 100644 --- a/harness/requirements/x402-txv1.toml +++ b/harness/requirements/x402-txv1.toml @@ -1,20 +1,21 @@ repo = "x402-txv1" -commit = "3d723dd54706b9edab8a33dc2c4e9cad22f35745" +commit = "f7043a123097e674fca864c39c58adcb0c9c649d" files = [ "specs/schemes/exact/scheme_exact_svm.md", "specs/schemes/upto/scheme_upto_svm.md", "specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", ] -# SVM transaction-version negotiation, pinned from x402-foundation/x402 -# PR 3473 (solana-foundation/x402 spec/svm-transaction-versions) until it -# merges. id = "X402TX-" + sha256(normalised text)[:10]. `required = true`: +# SVM transaction-version negotiation (x402-foundation/x402 PR 3473, merged, +# with the TransactionConfigMask wording from PR 3474), pinned at the +# solana-foundation/x402 branch feat/svm-client-transaction-v1 that carries +# it alongside the client-built version-1 implementation. id = "X402TX-" + sha256(normalised text)[:10]. `required = true`: # `pkc req-lint` fails if no case maps the id. [[requirement]] -id = "X402TX-0f874a9c63" +id = "X402TX-703c03cfb5" doc = "specs/schemes/upto/scheme_upto_svm.md" -text = "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed 400000, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= 5000000 computeUnitLimit." +text = "In a version-1 transaction the same caps apply to the message config values instead (see [Transaction versions](#transaction-versions)): computeUnitLimit (bit 2) MUST be set and MUST NOT exceed 400000, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy priorityFee 1000000 <= 5000000 computeUnitLimit, evaluated without overflow." required = true [[requirement]] @@ -48,9 +49,9 @@ text = "The client MUST intersect the advertised versions ([0] when the field is required = true [[requirement]] -id = "X402TX-644919eb3b" +id = "X402TX-f9bcc1a14a" doc = "specs/schemes/exact/scheme_exact_svm.md" -text = "It MUST set computeUnitLimit and loadedAccountsDataSizeLimit (a version-1 transaction that omits either is budgeted zero and cannot execute), it MUST NOT contain Compute Budget program instructions, and its priorityFee is a total in lamports, evaluated against a per-compute-unit cap as priorityFee 1000000 <= maxPriorityFeeMicroLamports computeUnitLimit." +text = "(The cost model still reserves 32 KiB of loaded account data for scheduling, but the transaction's own budget is 0.) A transaction that leaves bit 2 or bit 3 unset therefore cannot execute its instructions, so a client-built version-1 transaction MUST set both." required = true [[requirement]] @@ -60,9 +61,9 @@ text = "They are never advertised in extra.transactionVersions and clients MUST required = true [[requirement]] -id = "X402TX-936b492daa" +id = "X402TX-915632f040" doc = "specs/schemes/exact/scheme_exact_svm.md" -text = "A version-1 transaction that contains a Compute Budget instruction MUST be rejected." +text = "A version-1 transaction that contains a Compute Budget instruction MUST be rejected (an x402 sponsor rule; the runtime treats such instructions as no-ops)." required = true [[requirement]] @@ -102,9 +103,9 @@ text = "The sponsor MUST reject a message whose version is outside the set it ac required = true [[requirement]] -id = "X402TX-2ad7a3f326" +id = "X402TX-655bb4a79a" doc = "specs/schemes/exact/scheme_exact_svm.md" -text = "The legacy/version-0 Compute Budget price and the version-1 total priority fee MUST each be no greater than 5 lamports/CU on this path, using the normalization in §1.5 for version 1." +text = "The legacy/version-0 Compute Budget price and the version-1 total priority fee MUST each be no greater than maxPriorityFeeMicroLamports (default 5 lamports/CU) on this path, using the normalization in §1.5 for version 1." required = true [[requirement]] @@ -126,9 +127,9 @@ text = "The fee payer / sponsor MUST NOT be the authority on any observed transf required = true [[requirement]] -id = "X402TX-d188782061" +id = "X402TX-4c2fd60e66" doc = "specs/schemes/exact/scheme_exact_svm.md" -text = "A version-1 transaction MUST contain 1 to 5 instructions in this order:" +text = "For a single-payee charge, a version-1 transaction MUST contain 1 to 5 instructions in this order:" required = true [[requirement]] @@ -138,9 +139,9 @@ text = "Fee payer isolation (§2.1.1): the fee payer MUST NOT appear in any inst required = true [[requirement]] -id = "X402TX-eb681e1701" +id = "X402TX-997feeb51d" doc = "specs/schemes/exact/scheme_exact_svm.md" -text = "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed the configured maximum, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= maxPriorityFeeMicroLamports computeUnitLimit." +text = "In a version-1 transaction the same caps apply to the message config values instead (§1.5): computeUnitLimit (bit 2) MUST be set and MUST NOT exceed the configured maximum, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy priorityFee 1000000 <= capMicroLamports computeUnitLimit, where capMicroLamports is the price cap of the accepting path, evaluated without overflow as specified in §1.5." required = true [[requirement]] @@ -154,3 +155,21 @@ id = "X402TX-f9c2b66234" doc = "specs/schemes/exact/scheme_exact_svm.md" text = "Match exactly one transfer (§1.4): across top-level and inner instructions, exactly one TransferChecked MUST match the required mint, destination ATA (derived for both token programs), and amount (>= required)." required = true + +[[requirement]] +id = "X402TX-4cd70365fd" +doc = "specs/schemes/exact/scheme_exact_svm.md" +text = "As an x402 sponsor rule, a client-built version-1 transaction MUST NOT contain them, and the sponsor MUST reject one that does." +required = true + +[[requirement]] +id = "X402TX-74fb884aa9" +doc = "specs/schemes/exact/scheme_exact_svm.md" +text = "The sponsor MUST evaluate both sides of the inequality with arbitrary-precision integers (or at least 128-bit unsigned integers), so that an oversized priorityFee cannot wrap and pass the check." +required = true + +[[requirement]] +id = "X402TX-927d17b62e" +doc = "specs/schemes/exact/scheme_exact_svm.md" +text = "A client or server MUST treat a field containing any non-integer entry (a string, null, or \"legacy\") or any integer other than 0 or 1 as invalid and fail closed with unsupported_transaction_version." +required = true diff --git a/harness/requirements/x402.toml b/harness/requirements/x402.toml index 4b77b350e..a3f7cdf39 100644 --- a/harness/requirements/x402.toml +++ b/harness/requirements/x402.toml @@ -1,5 +1,5 @@ repo = "x402" -commit = "03b3919b3d422d2b094ea3539e0b577558e1ae86" +commit = "f7043a123097e674fca864c39c58adcb0c9c649d" files = [ "specs/x402-specification-v2.md", "specs/schemes/exact/scheme_exact.md", @@ -113,9 +113,9 @@ text = "These are wallet-injected user protection mechanisms and MUST be allowed required = true [[requirement]] -id = "X402-a8bd75d71b" +id = "X402-05c2aacafc" doc = "specs/schemes/exact/scheme_exact_svm.md" -text = "The decompiled transaction MUST contain 3 to 7 instructions in this order:" +text = "For a single-payee charge (no extra.splits and no ATA creation), a legacy or version-0 transaction MUST contain 3 to 7 instructions in this order:" required = true [[requirement]] @@ -289,9 +289,9 @@ text = "The payload.from signature MUST be present and valid before the facilita required = true [[requirement]] -id = "X402-c1174b72d8" +id = "X402-4de59a1f27" doc = "specs/schemes/upto/scheme_upto_svm.md" -text = "The message MAY be legacy or version 0, but it MUST NOT contain Address Lookup Table lookups." +text = "The message version MUST be one advertised in extra.transactionVersions (0 when the field is absent; see [Transaction versions](#transaction-versions)), and the message MUST NOT contain Address Lookup Table lookups." required = true [[requirement]] @@ -671,9 +671,21 @@ text = "MUST be an integer from 900 through 2592000 (15 minutes through 30 days) required = true [[requirement]] -id = "X402-7f4ee54a73" +id = "X402-76654742e7" doc = "specs/schemes/batch-settlement/scheme_batch_settlement_svm.md" -text = "claims[] MUST contain between one and four entries so the instruction pairs fit in a legacy Solana transaction without address lookup tables." +text = "claims[] MUST contain at least one entry and at most extra.maxClaimChannels entries, or four when the facilitator advertises no maxClaimChannels, so the instruction pairs fit in one transaction without address lookup tables." +required = true + +[[requirement]] +id = "X402-c2ca42b7a4" +doc = "specs/schemes/batch-settlement/scheme_batch_settlement_svm.md" +text = "channels[] MUST contain at least one entry and at most extra.maxSettleChannels entries, or four when the facilitator advertises no maxSettleChannels." +required = true + +[[requirement]] +id = "X402-8f57677e36" +doc = "specs/schemes/batch-settlement/scheme_batch_settlement_svm.md" +text = "The server MUST copy feePayer, transactionVersions, maxClaimChannels, maxSettleChannels, and maxIdleSecs into PaymentRequirements.extra, MUST NOT author a claim or settle request with more entries than the copied capacity (four when absent), then set extra.tokenProgram from the selected asset's verified mint owner." required = true [[requirement]] diff --git a/harness/src/conformance/contract-schema.ts b/harness/src/conformance/contract-schema.ts index b98f512a4..2117eaa3a 100644 --- a/harness/src/conformance/contract-schema.ts +++ b/harness/src/conformance/contract-schema.ts @@ -129,6 +129,19 @@ export const conformanceVectorSchema = { properties: { outcome: { enum: ["accept", "reject"] }, rejectCode: rejectCodeSchema, + alsoConformant: { + type: "array", + minItems: 1, + items: { + type: "object", + required: ["outcome"], + properties: { + outcome: { enum: ["accept", "reject"] }, + rejectCode: rejectCodeSchema, + }, + }, + }, + alsoConformantReason: { type: "string", minLength: 1 }, }, }, }, diff --git a/harness/src/conformance/intents/subscription.ts b/harness/src/conformance/intents/subscription.ts index 9462d2294..6d34ab30f 100644 --- a/harness/src/conformance/intents/subscription.ts +++ b/harness/src/conformance/intents/subscription.ts @@ -90,10 +90,10 @@ async function canonical(vector: ConformanceVector): Promise { if (input.subscriptionPeriod) { const { periodUnit, periodCount } = input.subscriptionPeriod; try { - // The SDK's own client reads periodCount with Number() before mapping. + // The wire string, as the SDK's client and server pass it. const periodHours = mapSubscriptionPeriodToHours( periodUnit as "day" | "week", - Number(periodCount), + periodCount, ); return exactJson(vector.id, { periodHours }); } catch (error) { diff --git a/harness/src/conformance/intents/x402-batch-settlement.ts b/harness/src/conformance/intents/x402-batch-settlement.ts index 1a4d5bfaf..158806618 100644 --- a/harness/src/conformance/intents/x402-batch-settlement.ts +++ b/harness/src/conformance/intents/x402-batch-settlement.ts @@ -177,7 +177,29 @@ async function verify( "@x402/svm adopts a corrective 402 only inside its client channel flow, with no single-shot entry point", ); } + // The testee drives the stateless upstream facilitator: it never sees the + // resource server's store record, so a vector whose verdict rests on that + // record alone (RULINGS B1) cannot be expressed. + if (input.batchVerdictFromStore === true) { + return unsupported( + vector, + "the testee drives the stateless upstream facilitator, which never sees the resource server's store record (chargedCumulativeAmount, the accepted cumulative, a close-pending mark) this verdict rests on (RULINGS B1)", + ); + } const server = input.batchServer as Json; + // The upstream facilitator accepts legacy, version 0 and version 1 with + // no option to narrow the set ("The facilitator enforces its own accepted + // set"). + const versions = server.transactionVersions as Array<0 | 1> | undefined; + if ( + versions !== undefined && + !(new Set(versions).size === 2 && versions.includes(0) && versions.includes(1)) + ) { + return unsupported( + vector, + "the upstream batch facilitator's accepted transaction-version set is fixed (legacy, 0 and 1) with no option to narrow it (batchServer.transactionVersions other than absent or [0, 1])", + ); + } const requirements = input.batchRequirements as PaymentRequirements; const feePayer = await createKeyPairSignerFromBytes( new Uint8Array(server.feePayerSecretKey as number[]), @@ -190,7 +212,7 @@ async function verify( }; const facilitator = new x402Facilitator().register( requirements.network as Network, - new BatchFacilitator(signer, { rpcUrl: rpcUrl(input) }), + new BatchFacilitator(signer), ); let payload: PaymentPayload; try { @@ -233,12 +255,19 @@ async function build( const signer = await createKeyPairSignerFromBytes( new Uint8Array(c.secretKey as number[]), ); + // The highest version the client's signer signs, through the upstream + // client's own option, as @solana/pay-kit maps its maxTransactionVersion + // (typescript/packages/pay-kit/src/client/index.ts). + const maxVersion = c.maxTransactionVersion as 0 | 1 | undefined; const client = new x402Client().register( requirements.network as Network, new BatchClient(signer, { depositAmount: String(c.depositAmount), discoverChannels: false, rpcUrl: rpcUrl(input), + ...(maxVersion !== undefined + ? { transactionVersions: maxVersion === 0 ? [0] : [0, 1] } + : {}), }), ); try { diff --git a/harness/src/conformance/intents/x402-upto.ts b/harness/src/conformance/intents/x402-upto.ts index f30b802e2..4d691a4a1 100644 --- a/harness/src/conformance/intents/x402-upto.ts +++ b/harness/src/conformance/intents/x402-upto.ts @@ -112,6 +112,18 @@ function codeFor(reason: string, message: string): RejectCode | undefined { } if (/unsupported_transaction_version|transaction version/.test(m)) return "unsupported-version"; + // Version-1 header budget (x402-txv1 §1.5) and per-version size limit: + // `transaction v1 config rejected ()` and `above the N-byte + // limit for version V`. A ComputeBudget instruction beside the open is an + // instruction outside the open (the Rust verifier's category for upto); + // an unset or malformed header field and an oversize message are + // malformed payloads (RULINGS T4). + const v1 = /v1 config rejected \(([a-z_]+)\)/.exec(m)?.[1]; + if (v1 === "compute_budget_instruction") return "unexpected-instruction"; + if (v1 === "compute_unit_limit_too_high") return "compute-limit-over-cap"; + if (v1 === "priority_fee_too_high") return "compute-price-over-cap"; + if (v1 !== undefined) return "invalid-payload"; + if (/byte limit for version/.test(m)) return "invalid-payload"; if (/setcomputeunitprice .* exceeds/.test(m)) return "compute-price-over-cap"; if (/setcomputeunitlimit .* exceeds/.test(m)) return "compute-limit-over-cap"; if ( @@ -182,6 +194,7 @@ async function build(vector: ConformanceVector): Promise { // Permissions are the client's spending policy, not wire behaviour. const client = await createPayKitClient({ accept: ["x402"], + maxTransactionVersion: input.x402ClientMaxTransactionVersion as 0 | 1 | undefined, permissions: false, rpcUrl: rpcUrlOf(vector), signer, @@ -213,8 +226,27 @@ async function build(vector: ConformanceVector): Promise { } } +// The vendored upto facilitator accepts legacy, version 0 and version 1 with +// no option to narrow the set, so a sponsor configured with another set +// (input.x402ServerTransactionVersions other than absent or [0, 1]) cannot +// be expressed (scheme_upto_svm.md: "The facilitator enforces its own +// accepted set"). +function sponsorVersionsExpressible(versions: Array<0 | 1> | undefined): boolean { + if (versions === undefined) return true; + const set = new Set(versions); + return set.size === 2 && set.has(0) && set.has(1); +} + async function verify(vector: ConformanceVector): Promise { const input = vector.input; + if (!sponsorVersionsExpressible(input.x402ServerTransactionVersions)) { + return { + error: + "unsupported-mode: the vendored @x402/svm upto facilitator's accepted transaction-version set is fixed (legacy, 0 and 1) with no option to narrow it (input.x402ServerTransactionVersions other than absent or [0, 1])", + id: vector.id, + outcome: "unsupported-mode", + }; + } if (!input.x402PaymentHeader) throw new Error( "invalid payload: upto verify vector missing x402PaymentHeader", diff --git a/harness/src/conformance/reject.ts b/harness/src/conformance/reject.ts index f40fdcc0b..d871db7d5 100644 --- a/harness/src/conformance/reject.ts +++ b/harness/src/conformance/reject.ts @@ -37,6 +37,14 @@ const PATTERNS: Array<[RegExp, RejectCode]> = [ [/invalid_batch_settlement_svm_channel_state/, "channel-state"], [/invalid_batch_settlement_svm_refund_transaction/, "refund-transaction"], [/\bduplicate_settlement\b/, "duplicate-settlement"], + // The bare x402 reason (not `invalid_exact_svm_network_mismatch`): the + // facilitator compares `paymentPayload.accepted.network` with the + // requirements' network, so it names an accepted that differs from the + // requirements (RULINGS B3), not a transaction for another cluster. + [/\bnetwork_mismatch\b/, "accepted-mismatch"], + // The batch facilitator's /verify envelope check: paymentPayload.accepted + // differs from paymentRequirements (spec 4.5), named with core's code. + [/\binvalid_payment_requirements\b/, "accepted-mismatch"], [/\bunsupported_scheme\b/, "unsupported-scheme"], // @x402/svm batch-settlement client: refusals of a challenge's terms // (plain Errors, no reason code). @@ -87,7 +95,7 @@ const PATTERNS: Array<[RegExp, RejectCode]> = [ ], // Client refusing a challenge that violates the method spec (RULINGS C2, // C3). Checked first: these messages also contain generic words. - [/decimals is required|failed to determine token program/i, "invalid-challenge"], + [/decimals is required|failed to determine token program|tokenprogram must not be present/i, "invalid-challenge"], // @solana/pay-kit's client refusing an offer's terms (an unknown network). [/invalid_challenge_terms|unsupported solana network/i, "invalid-challenge"], // Sponsors bound the priority fee as limit x price (RULINGS S6). @@ -114,6 +122,8 @@ const PATTERNS: Array<[RegExp, RejectCode]> = [ [/network mismatch/i, "wrong-network"], // @x402/svm exact verifier reason codes. [/invalid_exact_svm_network_mismatch/i, "wrong-network"], + [/compute_price_instruction_too_high/i, "compute-price-over-cap"], + [/compute_limit_instruction_too_high/i, "compute-limit-over-cap"], [/invalid_exact_svm_payload_amount_mismatch/i, "amount-mismatch"], [ /invalid_exact_svm_payload_(mint_mismatch|recipient_mismatch|no_transfer_instruction)/i, diff --git a/harness/src/conformance/schema.ts b/harness/src/conformance/schema.ts index adb731640..be5adb889 100644 --- a/harness/src/conformance/schema.ts +++ b/harness/src/conformance/schema.ts @@ -192,6 +192,14 @@ export type VectorExpect = { // Optional human-readable reason for reject vectors; not asserted, just // documents the divergence class. rejectReason?: string; + // Other verdicts the pinned specs allow where they leave the choice to the + // implementation (a sponsor's stricter local policy, an unordered pair of + // checks, a rule stated for another instruction). The judge passes a + // result matching the primary verdict or any of these (outcome and, for a + // reject, its code); an accepted build is still judged on its artifact. + alsoConformant?: Array<{ outcome: VectorOutcome; rejectCode?: RejectCode }>; + // Why the alternatives conform, quoting the spec. + alsoConformantReason?: string; // Normalized reject category asserted across every SDK. Pins WHY the SDK // rejected, not just that it did, so a guard that fires for the wrong // reason (e.g. a decimals-mismatch caught only by a generic @@ -564,10 +572,14 @@ export type VectorInput = { // `methodDetails.transactionVersions` (`[0]` when absent); charge verify // runners configure the server from it. signerMaxTransactionVersion?: 0 | 1; - // verify-transaction (x402): the sponsor's own accepted message versions - // (scheme_exact_svm §1.5: "The sponsor enforces its own accepted set"; - // absent means [0]). The route advertises them as - // `extra.transactionVersions` and the vector's `accepted` echoes them. + // verify-transaction (x402 exact and upto): the sponsor's own accepted + // message versions (scheme_exact_svm §1.5: "The sponsor enforces its own + // accepted set"). The spec gives that set no default, so every vector + // whose verdict depends on it states it; absent, the Rust reference + // sponsor accepts [0]. The route advertises them as + // `extra.transactionVersions` (nothing for [0]) and the vector's + // `accepted` echoes them. A testee whose SDK cannot configure the set + // reports unsupported-mode for a value it cannot express. x402ServerTransactionVersions?: Array<0 | 1>; // canonical-bytes (charge): an MPP charge request round-trip. The runner // DECODES `value` with the production SDK charge-request type (incl. diff --git a/harness/src/conformance/ts-runner.ts b/harness/src/conformance/ts-runner.ts index 29c9eb26e..fe6b2d032 100644 --- a/harness/src/conformance/ts-runner.ts +++ b/harness/src/conformance/ts-runner.ts @@ -189,9 +189,6 @@ async function buildX402Vector(vector: ConformanceVector): Promise outcome: "unsupported-mode", }; } - if (input.signerMaxTransactionVersion !== undefined) { - return { error: SIGNER_VERSION_UNSUPPORTED, id: vector.id, outcome: "unsupported-mode" }; - } const signer = await createKeyPairSignerFromBytes(new Uint8Array(input.signerSecretKey)); let captured: string | undefined; const server = createServer((req, res) => { @@ -213,6 +210,7 @@ async function buildX402Vector(vector: ConformanceVector): Promise // vector judges the payment the SDK builds, so allow every payment. const client = await createPayKitClient({ accept: ["x402"], + maxTransactionVersion: input.signerMaxTransactionVersion, permissions: false, rpcUrl: rpcUrlOf(vector), signer, @@ -248,12 +246,18 @@ type X402VerifyInput = ConformanceVector["input"]; // Transaction-version knobs the TypeScript SDKs do not expose. The runner // cannot express them, so it reports unsupported-mode instead of guessing. const SIGNER_VERSION_UNSUPPORTED = - "unsupported-mode: neither @solana/mpp buildChargeTransaction nor the @solana/pay-kit x402 client takes a highest signable transaction version (input.signerMaxTransactionVersion)"; + "unsupported-mode: @solana/mpp buildChargeTransaction takes no highest signable transaction version (input.signerMaxTransactionVersion)"; const SPONSOR_VERSIONS_UNSUPPORTED = - "unsupported-mode: the vendored @x402/svm exact facilitator (x402 @03b3919b, before x402-foundation/x402 PR 3474) has no accepted transaction-version set to configure (input.x402ServerTransactionVersions other than [0])"; + "unsupported-mode: the @x402/svm exact facilitator's accepted transaction-version set is fixed at [0, 1] (legacy tolerated), with no option to narrow it (input.x402ServerTransactionVersions other than absent or [0, 1])"; function sponsorVersionsExpressible(versions: ConformanceVector["input"]["x402ServerTransactionVersions"]): boolean { - return versions === undefined || (versions.length === 1 && versions[0] === 0); + // Absent: the vector's verdict does not depend on the sponsor's own set + // (the spec gives it no default, so every vector that depends on it states + // it), and the facilitator's fixed [0, 1] serves. + if (versions === undefined) return true; + // A repeated entry names the same version (RULINGS T1): compare as sets. + const set = new Set(versions); + return set.size === 2 && set.has(0) && set.has(1); } async function verifyX402Vector(vector: ConformanceVector): Promise { diff --git a/harness/src/expectations.ts b/harness/src/expectations.ts index 706d50177..6acabbee0 100644 --- a/harness/src/expectations.ts +++ b/harness/src/expectations.ts @@ -51,6 +51,7 @@ export const INTEROP_CLAIMS: readonly string[] = [ "mpp:charge", "x402:exact", "x402:upto", + "x402:batch-settlement", "mpp:session", ].flatMap((intent) => [`${intent}:client`, `${intent}:server`]); diff --git a/harness/src/fixtures/typescript/charge-client.ts b/harness/src/fixtures/typescript/charge-client.ts index f5ecc9a42..8999ee880 100644 --- a/harness/src/fixtures/typescript/charge-client.ts +++ b/harness/src/fixtures/typescript/charge-client.ts @@ -107,6 +107,14 @@ async function payTarget( // the choice via MPP_HARNESS_PAYMENT_MODE so a single client // adapter covers both wire modes. broadcast: environment.paymentMode === "push", + // Like the Rust client fixture: refuse a challenge for another + // cluster or above the amount the scenario agreed to pay. + ...(process.env.MPP_HARNESS_NETWORK + ? { expectedNetwork: process.env.MPP_HARNESS_NETWORK } + : {}), + ...(process.env.MPP_HARNESS_AMOUNT + ? { maxAmount: BigInt(process.env.MPP_HARNESS_AMOUNT) } + : {}), signer, rpcUrl: environment.rpcUrl, ...(environment.computeUnitLimit !== undefined diff --git a/harness/src/fixtures/typescript/upto-server.ts b/harness/src/fixtures/typescript/upto-server.ts new file mode 100644 index 000000000..0619c675b --- /dev/null +++ b/harness/src/fixtures/typescript/upto-server.ts @@ -0,0 +1,141 @@ +// ts-x402 upto server adapter: a @solana/pay-kit `usage` (x402 `upto`) gate. +// +// Env in (X402_HARNESS_*, same as the Rust upto adapter +// rust/crates/harness-bins/src/bin/x402_harness_upto_server.rs), JSON out: +// prints one `ready` line with the bound port, then serves +// GET X402_HARNESS_RESOURCE_PATH authorizes up to X402_HARNESS_PRICE and +// settles X402_HARNESS_ACTUAL_AMOUNT +// GET /health +// The route is `pay.fetch(gate, handler)` on a `usage` gate: pay-kit issues +// the 402, verifies and broadcasts the client's channel `open` with the +// vendored @x402/svm upto facilitator (its open + settle + distribute +// readiness simulation included), then settles the metered amount with +// settle_and_seal and distribute. The operator (X402_HARNESS_FEE_PAYER_SECRET_KEY) +// is fee payer, rent payer, receiver authorizer and recipient. The handler +// only reports the metered amount through the SDK's `charge` meter; the +// adapter translates node:http to fetch and exposes the settlement signature +// pay-kit recorded on the scenario's settlement header. + +import http from "node:http"; +import type { AddressInfo } from "node:net"; +import { createPayKit, Signer, usage, usd } from "@solana/pay-kit"; +import { readX402ServerEnvironment } from "./exact-shared"; + +const MAINNET_PATCHED_TREASURY_OWNER = "Cs2zdfUNonRdRGsiZUQQLdTxzxVvJZmgiX2mpLYKuEqP"; + +function readRequiredEnv(name: string): string { + const value = process.env[name]; + if (!value || value.trim() === "") throw new Error(`${name} is required`); + return value; +} + +function toRequest(req: http.IncomingMessage, origin: string): Request { + const headers = new Headers(); + for (const [name, value] of Object.entries(req.headers)) { + if (value === undefined) continue; + headers.set(name, Array.isArray(value) ? value.join(", ") : value); + } + return new Request(new URL(req.url ?? "/", origin), { headers, method: req.method ?? "GET" }); +} + +async function writeResponse( + res: http.ServerResponse, + response: Response, + extraHeaders: Record, +): Promise { + const body = await response.text(); + const headers: Record = {}; + response.headers.forEach((value, name) => { + if (name !== "content-length") headers[name] = value; + }); + res.writeHead(response.status, { ...headers, ...extraHeaders }); + res.end(body); +} + +async function main(): Promise { + const env = readX402ServerEnvironment(); + const operator = await Signer.bytes( + new Uint8Array(JSON.parse(readRequiredEnv("X402_HARNESS_FEE_PAYER_SECRET_KEY")) as number[]), + ); + const actualAmount = BigInt(process.env.X402_HARNESS_ACTUAL_AMOUNT ?? "0"); + const pay = await createPayKit({ + accept: ["x402"], + network: env.network, + operator: { recipient: env.payTo, signer: operator }, + pricing: { usage: usage(usd(env.price, "USDC")) }, + rpcUrl: env.rpcUrl, + // The local validator's payment-channels build has its treasury-owner + // sentinel patched to the *mainnet* constant + // (.github/actions/build-payment-channels) while the scenario labels the + // network devnet, so name that treasury instead of devnet's. + x402: { paymentChannelsTreasuryOwner: MAINNET_PATCHED_TREASURY_OWNER }, + }); + + const route = pay.fetch("usage", (request) => { + pay.charge(request)?.charge(actualAmount); + return Response.json({ ok: true, paid: true }); + }); + + const server = http.createServer((req, res) => { + const url = new URL(req.url ?? "/", "http://127.0.0.1"); + if (url.pathname === "/health") { + res.writeHead(200, { "content-type": "application/json" }); + res.end(JSON.stringify({ ok: true })); + return; + } + if (url.pathname !== env.resourcePath) { + res.writeHead(404, { "content-type": "application/json" }); + res.end(JSON.stringify({ error: "not_found" })); + return; + } + const request = toRequest(req, `http://${req.headers.host ?? "127.0.0.1"}`); + route(request) + .then((response) => { + // pay-kit records the settlement transaction on the request's payment. + const transaction = pay.payment(request)?.transaction; + return writeResponse( + res, + response, + response.status === 200 && transaction ? { [env.settlementHeader]: transaction } : {}, + ); + }) + .catch((error: unknown) => { + console.error("ts-x402 upto server error:", error); + res.writeHead(500, { "content-type": "application/json" }); + res.end(JSON.stringify({ error: error instanceof Error ? error.message : String(error) })); + }); + }); + + await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + const { port } = server.address() as AddressInfo; + + // Refuse to serve a payment the scenario did not ask for (see exact-server.ts). + const challenge = await route(new Request(`http://127.0.0.1:${port}${env.resourcePath}`)); + const offered = (await challenge.json()) as { accepts?: { amount?: string; asset?: string }[] }; + const offer = offered.accepts?.[0]; + if (offer?.asset !== env.mint || (env.amount !== undefined && offer.amount !== env.amount)) { + throw new Error( + `pay-kit prices ${env.price} USD on ${env.network} as ${offer?.amount} of ${offer?.asset}; ` + + `the scenario expects ${env.amount ?? "(any)"} of ${env.mint}`, + ); + } + + console.log( + JSON.stringify({ + type: "ready", + implementation: "typescript", + role: "server", + port, + capabilities: ["upto"], + }), + ); + + const shutdown = () => server.close(() => process.exit(0)); + process.on("SIGTERM", shutdown); + process.on("SIGINT", shutdown); +} + +main().catch((error: unknown) => { + console.error(error); + process.exit(1); +}); diff --git a/harness/test/onchain.e2e.test.ts b/harness/test/onchain.e2e.test.ts index c6ba40928..23ccc1493 100644 --- a/harness/test/onchain.e2e.test.ts +++ b/harness/test/onchain.e2e.test.ts @@ -1,13 +1,16 @@ /** * On-chain settlement E2E — the regression net the structural harness lacks. * - * Boots a mainnet-forking surfnet (@solana/surfpool 1.4, which executes the + * Boots a mainnet-forking surfnet (@solana/surfpool 1.5, which executes the * deployed payment-channels program) and drives the real pay-kit client/server * end-to-end. A success is only returned after settlement CONFIRMS on-chain, so * this catches settlement-class regressions the byte-shape harness cannot — e.g. * the `TreasuryAccountMismatch` (0x961) that made `upto` silently 402 after * payment. (surfpool-sdk 1.2 could not run the program — "unsupported BPF * instruction" — which is a chief reason these regressions evaded local CI.) + * 1.5 is the first release that executes version-1 transactions, which the + * x402 clients build once the server advertises `transactionVersions: [0, 1]`; + * 1.6.1 fails MPP charge simulation with "Blockhash not found". * * Network-gated: surfpool forks from a mainnet datasource RPC. Set * HARNESS_ONCHAIN=1 to run; SURFPOOL_DATASOURCE_RPC_URL sets that datasource diff --git a/harness/vectors/FILL.sha256 b/harness/vectors/FILL.sha256 index 27db47d47..580e270f9 100644 --- a/harness/vectors/FILL.sha256 +++ b/harness/vectors/FILL.sha256 @@ -16,20 +16,20 @@ cbf1964d7942ddc90cb59e0b6dc136f5e0855975bdf3bac790a3b8be6f7ab4d4 annotated/batc b1883c0a8adc8b00b8948695a5e061854f7f26e54e2bc6ecae4053ae2b8e1fe0 annotated/batch-close-authorization-digest-frozen.txt 7c5fd3bf6909e3a09619d36d51ec48669d7ac12c8e9cf26f7564302ee19b2796 annotated/batch-receiver-binding-memo-frozen.txt cebe8c2e2e835e00d366a614716fc950a269a3156558576a166c109302e9a7fd annotated/batch-txv1-refund-v1-not-advertised-reject.txt -f8d3e9bebedb8a01efc88e78b6ae45cdcabea6197707d73cb59a88a96b31b96f annotated/batch-txv1-top-up-legacy-policed-as-v0-reject.txt -ece22f1b28d2be87465baf9bdf110213e77141f083ae3745dae8866199539080 annotated/batch-txv1-top-up-v0-on-v1-route.txt -b77dd4cbf99080b666aed8f724aaa055ababd4583d1af03178ab03d5b794cb6c annotated/batch-txv1-top-up-v0-over-1232-bytes-reject.txt -d604af8add177a92f454d815a11fbafe02d82f76476c19a7968d622eb684df15 annotated/batch-txv1-top-up-v1-advertised.txt -081e8ae823b8a11c43ffa53902aed6d5cc17450570787b4af3fbbef1641e884c annotated/batch-txv1-top-up-v1-compute-budget-instruction-reject.txt -ea981eedf129540b23117a2f7e9e72916e8b93da074c345231e06e342cc2df0e annotated/batch-txv1-top-up-v1-loaded-limit-below-max.txt -853a6cee8cbde406c19a663bd666d21724ce2639cf3578e642bfd0eee1c86a16 annotated/batch-txv1-top-up-v1-missing-loaded-limit-reject.txt -a7659349471ab46653e0e08233655e80038fd828fcf733b065d00b9664871b22 annotated/batch-txv1-top-up-v1-missing-unit-limit-reject.txt +b0e6a1126bc85644a2295e6f1b2ab82aa13d6cb8c54c91ca0522aea547d80716 annotated/batch-txv1-top-up-legacy-policed-as-v0-reject.txt +0dd575d558e08585ff289fcc3b2d872ab42eca456d7cea17202cd8152320bf08 annotated/batch-txv1-top-up-v0-on-v1-route.txt +4be4718bdeb05a47800d3424075ca8bcb42de848d388c949598e34fa2521a08e annotated/batch-txv1-top-up-v0-over-1232-bytes-reject.txt +98566f41f49831132ac9dbd741c756f557223ed6e2d3b5a31af1398b5a740b97 annotated/batch-txv1-top-up-v1-advertised.txt +a595e8f51887195d55422fb08d04a9f7ea1f57f9ebef7c0a04b6e4d5c68acb9e annotated/batch-txv1-top-up-v1-compute-budget-instruction-reject.txt +b4203c6e2946a7508dbf99ee6601ecb7082ae332789b7d76f688777437e83d49 annotated/batch-txv1-top-up-v1-loaded-limit-below-max.txt +2eb93762fbd1879fd6272eb2f0681ed3b1c411c9d6c0e849c54975f6c6e7c9cb annotated/batch-txv1-top-up-v1-missing-loaded-limit-reject.txt +3e870a07ca91217780627ac5d595fea6b31c7bc30f8f991fac42ec7f766baeef annotated/batch-txv1-top-up-v1-missing-unit-limit-reject.txt 78c007df83fe926d4b7b52b9b9398f6d57281cb954e730e3cba8814acb6d2f3d annotated/batch-txv1-top-up-v1-not-advertised-reject.txt -22fe677b27fe02e32faaffe2822eb07ccedc2434cabbf4a45112d7f144acc2c9 annotated/batch-txv1-top-up-v1-over-1232-bytes.txt -9d58aa022a5771c09d78c97691e2cabb8cf08eb3f7c39b0c12e177bfd5973109 annotated/batch-txv1-top-up-v1-priority-fee-at-cap.txt -bc2917705fb7456d265b510dfd05e9f3d58c861238870eebf94f6f4005714071 annotated/batch-txv1-top-up-v1-priority-fee-over-cap-reject.txt -39907cb3f1674a0cdb1e2351cdadadb5692a011594328dbbfbeac752986f95ab annotated/batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject.txt -a2e031a6a4276a2d28779bb931e2af3b3b3f7e22f1ae2c41184581e9ed37e843 annotated/batch-txv1-top-up-v1-unit-limit-over-cap-reject.txt +915ebbe8863a40adb641c5a6ca524756609892c8eb1908a2a74a5186bf8b7f95 annotated/batch-txv1-top-up-v1-over-1232-bytes.txt +98f3a48906631a2bf8dd905f634869c163d155db08cb1c2902e69c160f59f8c2 annotated/batch-txv1-top-up-v1-priority-fee-at-cap.txt +32b43edb6d4a79588749a18a26d406dd50515341b9cafeeec49effe4dacc8920 annotated/batch-txv1-top-up-v1-priority-fee-over-cap-reject.txt +1244bd723333a8b7e2b6cc8eca416d1642efff78f2a16c4ac1bad2dec18faccc annotated/batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject.txt +f4f0c83f3dfc903fdb5c0ce98eef3261d426cd2de589210157c11cbf7c6692c3 annotated/batch-txv1-top-up-v1-unit-limit-over-cap-reject.txt ac6856f925b534e013855d6edc22b1616924bc914052fee52ca411431d39f2b5 annotated/batch-verify-accepted-amount-mismatch-reject.txt e5711029cc266f1fc00b60d5c28e4cf08c83bc4f7ed2067933c5a2d0e66d1e95 annotated/batch-verify-accepted-network-mismatch-reject.txt 788c8f8411535d523701e8d12b01e0c2619ead9ced6abf5b5afb8e6e8f571b39 annotated/batch-verify-accepted-pay-to-mismatch-reject.txt @@ -136,14 +136,18 @@ c3be1f3448c26af23af513e02c7aa6934fd5598ec31c24ef8a3f0fd0b4089864 annotated/batc 96571e60b2d1beff74095c494310d311f94aa67db101e4f830f42ecb449d64bc annotated/batch-wire-payload-unknown-type-reject.txt b5329b58c7d856b43529565f1b7b4633ea5073ca6676512270da34eccc42a5b6 annotated/batch-wire-payload-voucher-frozen.txt 7216a0e2794c1127daa5f6fd2fa2ba7fa1a8acc17e14d43d48343b2441f2978e annotated/batch-wire-payment-payload-frozen.txt +fa4e50d0ff78e3d289b089ac249c1486223d0e218ef2d89b555e2ddc6b582a76 annotated/batch-wire-redemption-claim-eighteen-entries.txt a9c1c59e7ab6b6ff1241425651a5c4e18e2b6d0017214a36b01d2a78aa3f8edb annotated/batch-wire-redemption-claim-empty-reject.txt 0b0fedab1bd005ca625f2ee4c48f060bbaefba3dcfa42848da31c56755dd6028 annotated/batch-wire-redemption-claim-entry-without-config-reject.txt -6b943039e38fc8058b392191fb509fb3cec406bdb01e986397b2e21e01514e6f annotated/batch-wire-redemption-claim-five-entries-reject.txt 13e9ed7c81d2c20a0a67fe2b36c812b7a39d69b8ac7caa1eaeab967875c4161d annotated/batch-wire-redemption-claim-frozen.txt +bcf5691e235d43922d6c5a154622aa05411d619b868c3a4c257f09e4a1231602 annotated/batch-wire-redemption-claim-nineteen-entries-reject.txt d7664695b5f05a9708be29f22daf3b4321e0e5eff45c667c75a8c66bf0376c7a annotated/batch-wire-redemption-seal-frozen.txt +54430551260168a40e15c8f36fb3967e88977ff315a501714f8278da007e8ff4 annotated/batch-wire-redemption-settle-fourteen-channels-reject.txt 6678a671bbe6b6090ad87d32697be8fe7589c6af93247326d327704b1f49b503 annotated/batch-wire-redemption-settle-frozen.txt +6ca0645a88505b31bf339d44c51b461df745b4c2930e92e6f6c049e5037b7dd4 annotated/batch-wire-redemption-settle-thirteen-channels.txt e5c035fff26bc29e126695735380a1a2062495b17781a14806d495c2a1c97901 annotated/batch-wire-requirements-frozen.txt -6c7ff4ca6f85430e3220d805bf6f084cb09785dc621934e2e92784a14c518577 annotated/batch-wire-requirements-transaction-versions.txt +ea2a58fe10370a47a5bf80215080fb5ac607db8f13d29ffe03ed3561495d0699 annotated/batch-wire-requirements-redemption-capacity.txt +123dcb26d90c9ae053c1c509474e3d0c31812f91b4bd56cf6737d50ac117efdb annotated/batch-wire-requirements-transaction-versions.txt 50af62264075b82e55d608a0261fb3aee213b1ab2e1f6630172a0e997d2cea47 annotated/batch-wire-requirements-unknown-transaction-version-reject.txt 62a2c4abaf41a5c181326b93f5d4bda79877ca4803b39e6e8ee20f73376102db annotated/batch-wire-settlement-response-voucher-acceptance.txt e33e5ac35f869e8eeaadf88f449287d96c54929c0d523a89913f613679953241 annotated/canonical-bytes-48-base64url.txt @@ -591,13 +595,16 @@ c990a038b0b2ada183227986a3355217212ac3c5bded7b06c10ee8d29c8deb8a annotated/x402 32d7e93a504fbbba2a5ea7d9a7716c6980c9184f1b1e34eb47e83ce5e4e01043 annotated/x402-verify-v0-with-v1-sponsor-accept.txt 41c340af7b49ab751d9b4e7735d3ac4979141adf6b7f4aeb2c575cf5cd1241aa annotated/x402-verify-v1-accept.txt 24eb1b403b372a7ec687f6635ae104af4373a125e7920bc1295844b7c05ccbd2 annotated/x402-verify-v1-compute-budget-instruction-reject.txt -98aa629fd1ce7bde0c60f1ba21103a93aca5323c2ec19426086f14ede67c1bdc annotated/x402-verify-v1-compute-limit-at-cap-accept.txt -f5be46826129cde0e271e8f17a5e87cec1c270647de769903b664119979ed442 annotated/x402-verify-v1-compute-limit-over-cap-reject.txt +7ed5c8baf33357fab18dc82212abdc64b87b567fbed7677e16cc547bc79db8a1 annotated/x402-verify-v1-compute-limit-at-cap-accept.txt +f91fb91482ac310e3eab9ff60f3d57f26175a918d73995a3e0f5aeb409b817d0 annotated/x402-verify-v1-compute-limit-over-cap-reject.txt d00bd3620a79320e1862841e29052166535e8fd36b27b1460e33e5f89caf8415 annotated/x402-verify-v1-decimals-reject.txt 906f622ea65e8a2f5ef4144567870ca2b02c4419bebeb3e1122d67c314dd6164 annotated/x402-verify-v1-explicit-v0-sponsor-reject.txt 0461554796f1e5cb015a2fd25e6d744b6f253f6e916fb7b1d3def7b48be6e5ad annotated/x402-verify-v1-extra-signer-reject.txt f6f4c736800ac8eda78ac8c1a7a3e02fc1f8f67860c2b1f9b2ab283e0fc88bb5 annotated/x402-verify-v1-fee-payer-authority-reject.txt 8ae9ddd8b332a92b90202c43001d5b098c7a27472109bd73ba7bcb680eb75a68 annotated/x402-verify-v1-fee-payer-in-accounts-reject.txt +5e84ce47631c8c39348cfd23c65833ac3ace65ea4670d3ab4ffe28c7861a4f26 annotated/x402-verify-v1-heap-size-reject.txt +92e71b89b9168b75d7589cbab2242cd2e521e703c4a5bfdc748bda676eb7f477 annotated/x402-verify-v1-loaded-data-limit-4mib-accept.txt +c54ce1aee62029fbdca28e7cbdff14b3eb6fedf78919ec9d85e14c8ba05f86b7 annotated/x402-verify-v1-loaded-data-limit-small-accept.txt 793d2c1c67c7fd90951804a0e129ab943f8567f913cf9d9dd8278337bbfc55a8 annotated/x402-verify-v1-missing-compute-unit-limit-reject.txt 2c0337853e1397f8f1e05c73d4d1f0e558e9229d4102962f418bf07b459b8515 annotated/x402-verify-v1-missing-loaded-data-limit-reject.txt 59e56227a21cf39a8403344cb30d7b5a76215f6ea4dcf312257e7461aada2612 annotated/x402-verify-v1-not-accepted-reject.txt @@ -611,15 +618,15 @@ a21a0bf71278d43da4ebbff0d32f0e232085f47386fd9476e746a0198a2fc2d1 annotated/x402 53b6a226079b89ff63242d8d71e6baca5eb3cd2e727a702a0c9e5a4962260edb annotated/x402-verify-v1-wrong-recipient-reject.txt ee17ec2e291409954d77a23e40909764e62a3cd53730fd693a72ce0462212811 annotated/x402-wire-transaction-versions-golden.txt 6ee44f50ea0166824340503d06597ab72387f672a3f8b97965efe0a1a9e008d9 annotated/x402-wire-transaction-versions-v1-only-golden.txt -00d714eb0b579a1bc8ee6c0f017297dad3dcdec91827a30efbd8927634021937 batch-build.json +da0b8e79ef64a23bfaff865b6940e9c664b8bc7661adca70e9ffb8701b5e47a5 batch-build.json 1e0bb980d86a6dca02071160befe39f9603b73d7ddb06de06e3f32a68fb248ec batch-canonical.json 9d29189ac18e7f3219a336acb593d6a64527b9357ff60ce0be44108ed38e2598 batch-corrective.json -b906fc5e25dc7ebe454f0d24e881cae5bb06bb7fa2d0c5c0b2f9307138a484ce batch-txv1.json +3720bf9619ed67d98ae8a244247d2cf9a41a3bc35eb2942e4a9973c2ad8e89e8 batch-txv1.json b07ebc33137c3c1c6c6ae99f757e720b8e35afc964ae24547e8fc53f64b76f7c batch-verify-open.json -2c69a2d23afd0c815d5be2634154208f608c157cf1132c9675d1434a8d5d2857 batch-verify-refund.json -4d50c26ef9207a2636478fcf6355cf502fbb100c07fe540c9cc682a59bccd34a batch-verify-setup-policy.json -62a0d7e58d5b3578ee7eef92a244edcb74b841ad8a81e8dc7e7ecd07b740c222 batch-verify-voucher.json -0c6f4fae057ce68548cc4c496ecaa36cef906709abafc3463cd3de8f2543a5b5 batch-wire.json +15bc380bb473fa8e23bbecdbc3fbc3e4183bb09675f60ee45e667ff281225ae1 batch-verify-refund.json +b0375d1f1437128c3ad5b0051eaec40536032f3b6033f1a70d2454a2665031ee batch-verify-setup-policy.json +c6a7c5ee92d522a70183ca5852f6d6ca7216d1e03a50757cd56becadcfbf085e batch-verify-voucher.json +59ee352470ffa77ff4ad40f9207daf30119716ba7bd4a085e8d3eff9e0c99a8d batch-wire.json 65a3a4793b3ef918d2b6464e0aa24e8f30de634c1a8223543960224fef443bea canonical-bytes.json d751557cf0494e0b1d0cccad86bddf0f7ec0b784fe8e21ac2bf621793e1e956c charge-build-policy.json e82e3d3a8fb515bb7b69f4a34b1126d134456522351078680f2622bc551ee8e6 charge-defaults.json @@ -649,14 +656,14 @@ c033a9a8ebbceabbf477b542173afc78db89a3529f8d42f8467de03a2842e689 subscription-w 560897640e9668490a4869cd9877ac20bc729d5ffbd4a4f04001e5d82af80fae x402-build-policy.json ce46f0ac323f508415a6dea09315596ed4fa52e38b511e2f0cf808f485d32f2a x402-build.json 812e251b273d84998507068b1b41c9710db973f05c9c38b340bb5b009f0060fc x402-extensions.json -2c75e41fa50fdbaeff061100d455866af1bd1d5393d1a8a2277608072ac99e52 x402-tx-versions.json -6ada287c38a26eb633fdaedf9b5c5b6d52c1cb9777cf23d9e7b65a6db8cdcb10 x402-upto-build.json -53f6cdf619c05aa0b10b1bbf74c36251be48ce4ff166a3fb84bc1e2a59da9e66 x402-upto-open-policy.json -226edd935ccd71e8fa835fc5d6d04b46736b3414c110158f99f397e8594b58ad x402-upto-txv1.json +3bda4223dfd2459e08d60fbf0fdca55e47bfc4fa98bd256ca6980ebc8aa20772 x402-tx-versions.json +ac2555712b1f952bb8c59dbcc57dccd0f3fe2de480f0a98982e15a801229e695 x402-upto-build.json +56e1326fcf81fd7bc04675ef81df0927c19ce6b6a081c8c0207a49bfc1babbe0 x402-upto-open-policy.json +ce0f857b5654557f61f18fadb2f1f5639a5b8a274b0378fe82599b0d8a21b124 x402-upto-txv1.json ed579f6183f66be54f127aaec7beb5ba19f6a22222b0dbeeb18479f901f67d43 x402-upto-verify.json 7c2c19185d91c9a2d7b8d55ef4342cbcf49dc7e2918d5daa5b0357c624ad2ab1 x402-upto-wire.json a0b94e993a0766fe74aa500254c63672ddeab94aad6ec4b1ed136bb7ccd26be8 x402-v1-build.json 20db1ed7696fcb2d445cab1839bdda4737295a99cc525068dbbb63008f210821 x402-v1-verify.json -14d20064e411a8f8b88017745420b772f48a5ab50d10f93bbe47ff39d5e468da x402-verify-mutations.json -24618f97f70d81d808110aaa75c104dd69e2828b33b6ea7e7fd0f49676230390 x402-verify-policy.json +40e281d00a66b411396a18ed3040fa60c53a72c0964144903263920c459bc727 x402-verify-mutations.json +5ba2a0b6f79301f9518b568ea41cb37aaf37a14bf13962cbed3ee3adc56db4f1 x402-verify-policy.json 65ad8e90bd56fd2bf4da7d7a1a3bad9215fc19294beb6eb4ee88b513760f05f8 x402-verify.json diff --git a/harness/vectors/annotated/batch-txv1-top-up-legacy-policed-as-v0-reject.txt b/harness/vectors/annotated/batch-txv1-top-up-legacy-policed-as-v0-reject.txt index 6a3815f00..1823365bc 100644 --- a/harness/vectors/annotated/batch-txv1-top-up-legacy-policed-as-v0-reject.txt +++ b/harness/vectors/annotated/batch-txv1-top-up-legacy-policed-as-v0-reject.txt @@ -8,6 +8,8 @@ payment header (base64 JSON) "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", diff --git a/harness/vectors/annotated/batch-txv1-top-up-v0-on-v1-route.txt b/harness/vectors/annotated/batch-txv1-top-up-v0-on-v1-route.txt index 215c30f18..f3f166efa 100644 --- a/harness/vectors/annotated/batch-txv1-top-up-v0-on-v1-route.txt +++ b/harness/vectors/annotated/batch-txv1-top-up-v0-on-v1-route.txt @@ -8,6 +8,8 @@ payment header (base64 JSON) "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", diff --git a/harness/vectors/annotated/batch-txv1-top-up-v0-over-1232-bytes-reject.txt b/harness/vectors/annotated/batch-txv1-top-up-v0-over-1232-bytes-reject.txt index 34ff91a5d..366086813 100644 --- a/harness/vectors/annotated/batch-txv1-top-up-v0-over-1232-bytes-reject.txt +++ b/harness/vectors/annotated/batch-txv1-top-up-v0-over-1232-bytes-reject.txt @@ -8,6 +8,8 @@ payment header (base64 JSON) "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", diff --git a/harness/vectors/annotated/batch-txv1-top-up-v1-advertised.txt b/harness/vectors/annotated/batch-txv1-top-up-v1-advertised.txt index 4cfc3bcd5..579272061 100644 --- a/harness/vectors/annotated/batch-txv1-top-up-v1-advertised.txt +++ b/harness/vectors/annotated/batch-txv1-top-up-v1-advertised.txt @@ -8,6 +8,8 @@ payment header (base64 JSON) "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", diff --git a/harness/vectors/annotated/batch-txv1-top-up-v1-compute-budget-instruction-reject.txt b/harness/vectors/annotated/batch-txv1-top-up-v1-compute-budget-instruction-reject.txt index 1ffbe68ca..40861fbb9 100644 --- a/harness/vectors/annotated/batch-txv1-top-up-v1-compute-budget-instruction-reject.txt +++ b/harness/vectors/annotated/batch-txv1-top-up-v1-compute-budget-instruction-reject.txt @@ -8,6 +8,8 @@ payment header (base64 JSON) "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", diff --git a/harness/vectors/annotated/batch-txv1-top-up-v1-loaded-limit-below-max.txt b/harness/vectors/annotated/batch-txv1-top-up-v1-loaded-limit-below-max.txt index 98517c02c..1e39a6e2d 100644 --- a/harness/vectors/annotated/batch-txv1-top-up-v1-loaded-limit-below-max.txt +++ b/harness/vectors/annotated/batch-txv1-top-up-v1-loaded-limit-below-max.txt @@ -8,6 +8,8 @@ payment header (base64 JSON) "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", diff --git a/harness/vectors/annotated/batch-txv1-top-up-v1-missing-loaded-limit-reject.txt b/harness/vectors/annotated/batch-txv1-top-up-v1-missing-loaded-limit-reject.txt index 2fcaa16da..6082e9bf5 100644 --- a/harness/vectors/annotated/batch-txv1-top-up-v1-missing-loaded-limit-reject.txt +++ b/harness/vectors/annotated/batch-txv1-top-up-v1-missing-loaded-limit-reject.txt @@ -8,6 +8,8 @@ payment header (base64 JSON) "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", diff --git a/harness/vectors/annotated/batch-txv1-top-up-v1-missing-unit-limit-reject.txt b/harness/vectors/annotated/batch-txv1-top-up-v1-missing-unit-limit-reject.txt index 336d821c4..24a3b3c47 100644 --- a/harness/vectors/annotated/batch-txv1-top-up-v1-missing-unit-limit-reject.txt +++ b/harness/vectors/annotated/batch-txv1-top-up-v1-missing-unit-limit-reject.txt @@ -8,6 +8,8 @@ payment header (base64 JSON) "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", diff --git a/harness/vectors/annotated/batch-txv1-top-up-v1-over-1232-bytes.txt b/harness/vectors/annotated/batch-txv1-top-up-v1-over-1232-bytes.txt index b2fc6b4e0..b1efbaa34 100644 --- a/harness/vectors/annotated/batch-txv1-top-up-v1-over-1232-bytes.txt +++ b/harness/vectors/annotated/batch-txv1-top-up-v1-over-1232-bytes.txt @@ -8,6 +8,8 @@ payment header (base64 JSON) "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", diff --git a/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-at-cap.txt b/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-at-cap.txt index 80c803343..ac69e737b 100644 --- a/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-at-cap.txt +++ b/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-at-cap.txt @@ -8,6 +8,8 @@ payment header (base64 JSON) "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", diff --git a/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-cap-reject.txt b/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-cap-reject.txt index fed22fa8f..24b34dc6c 100644 --- a/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-cap-reject.txt +++ b/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-cap-reject.txt @@ -8,6 +8,8 @@ payment header (base64 JSON) "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", diff --git a/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject.txt b/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject.txt index 7ede7f8a7..286051fab 100644 --- a/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject.txt +++ b/harness/vectors/annotated/batch-txv1-top-up-v1-priority-fee-over-sponsor-cap-reject.txt @@ -8,6 +8,8 @@ payment header (base64 JSON) "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", diff --git a/harness/vectors/annotated/batch-txv1-top-up-v1-unit-limit-over-cap-reject.txt b/harness/vectors/annotated/batch-txv1-top-up-v1-unit-limit-over-cap-reject.txt index f44079382..9f5f80bc7 100644 --- a/harness/vectors/annotated/batch-txv1-top-up-v1-unit-limit-over-cap-reject.txt +++ b/harness/vectors/annotated/batch-txv1-top-up-v1-unit-limit-over-cap-reject.txt @@ -8,6 +8,8 @@ payment header (base64 JSON) "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", diff --git a/harness/vectors/annotated/batch-wire-redemption-claim-eighteen-entries.txt b/harness/vectors/annotated/batch-wire-redemption-claim-eighteen-entries.txt new file mode 100644 index 000000000..b530fff2e --- /dev/null +++ b/harness/vectors/annotated/batch-wire-redemption-claim-eighteen-entries.txt @@ -0,0 +1,5 @@ +# batch-wire-redemption-claim-eighteen-entries (x402-batch-settlement canonical-bytes, expect accept) +# generated by pkc fill; do not edit + + canonicalJson (11745 bytes) {"claims":[{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"100","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"Br4wUi9TpNTB7wL9BXoCqKAaHhLVAiiiaWbxve2og5DM","voucher":{"channelId":"Br4wUi9TpNTB7wL9BXoCqKAaHhLVAiiiaWbxve2og5DM","expiresAt":0,"maxClaimableAmount":"1000","signature":"5webiD4DbhJpjGjToBLXPonCCcDp5jK6KvJaG6y9LZj8RFsuxUgfeH5FLUKfZwxCkhc2qpxn9d9noyNxpwe5vhWo"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"101","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"96wiMpqdLQvBK2vTHw2ALnzKjoXeHPe9UHL8GPM6VBH3","voucher":{"channelId":"96wiMpqdLQvBK2vTHw2ALnzKjoXeHPe9UHL8GPM6VBH3","expiresAt":0,"maxClaimableAmount":"1000","signature":"23ed7u1sWVL67DgP2XS5S6a8QNSNDNjx46N3WrDjQcYMkdTKwJxSovjLvESREwinqaX7qFGwZiH4KhX8whvKdyrm"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"102","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"918ujLxiyqZA2WmxznvtHsEk31nDmPr6Gs8nA73oY2yn","voucher":{"channelId":"918ujLxiyqZA2WmxznvtHsEk31nDmPr6Gs8nA73oY2yn","expiresAt":0,"maxClaimableAmount":"1000","signature":"5M1EwT6SshyUKRhv6qKfSjk7qjjsw7rqZ1q1bjfpHnfqAUm6PUdzxMVspDQX1ptvQwjdwB4xd6xdpKJ9QC8gksdJ"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"103","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"27P2VM5swSSRGK83AqMhGNg9ZfTNVXtx74MkKevV8PpH","voucher":{"channelId":"27P2VM5swSSRGK83AqMhGNg9ZfTNVXtx74MkKevV8PpH","expiresAt":0,"maxClaimableAmount":"1000","signature":"2yyjqaHsdiBKKHvjR8vdqqHeQ36AFruuGdsazmDBMEbtPiXjbDqA3q6s9FyugebWpzMWResiLPcNfkUBX2onVdyQ"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"104","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"BJtkqYs9cWfuyP1x9VGsdU2bmjQYTr2sDzPE1Wq6vFXs","voucher":{"channelId":"BJtkqYs9cWfuyP1x9VGsdU2bmjQYTr2sDzPE1Wq6vFXs","expiresAt":0,"maxClaimableAmount":"1000","signature":"53JvbdCtBUmDgVwdPDbvwyWXMtXaZBvXR7uUsQq8EPLYtmB8HFSadt7LdhqJ2oGwS4iCcYm1WdCBu3PTU47YDR4h"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"105","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"4ANNVYxLfjNvjgR6kqD7W7waAfNGZQ3izAqrPuonvswN","voucher":{"channelId":"4ANNVYxLfjNvjgR6kqD7W7waAfNGZQ3izAqrPuonvswN","expiresAt":0,"maxClaimableAmount":"1000","signature":"5M3HkGtcYhugcEhwguEn3kMuk3oP1tCeL1iUKXcFjr5V2E5e2QrK48rz7eEfZK66yo44gCGEEPPCC1W3VRzkqGK9"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"106","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"4q9jEnqAMp8hvBisuXh9HuitWBHRNKthHmdJ1bhBy7pN","voucher":{"channelId":"4q9jEnqAMp8hvBisuXh9HuitWBHRNKthHmdJ1bhBy7pN","expiresAt":0,"maxClaimableAmount":"1000","signature":"2GiPnYGRk8fjqRf4TnpiXU3xV1HyrSfyKgQ2JXJVKK3R68ahvdfU11Frcc5HM2SeSLPrHDrZdnaXL9et1hwHvQtt"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"107","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"8F5xwzrKcgrMKLaTYGcKMZdcuDhiq7PxSGnHuWt6Md9F","voucher":{"channelId":"8F5xwzrKcgrMKLaTYGcKMZdcuDhiq7PxSGnHuWt6Md9F","expiresAt":0,"maxClaimableAmount":"1000","signature":"2NHpct6EYtPLcX7pvV9CG6aB3tWuW9kpn9JDqPkiHZYZvfZUaUCmqxWzYSnRg5ZNCTUzSsXcvnRMDyLaoKRUWje4"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"108","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"GUNsKpc5ybB7tj7SUF8UasuByHS7Sxs3aptt5eRicATC","voucher":{"channelId":"GUNsKpc5ybB7tj7SUF8UasuByHS7Sxs3aptt5eRicATC","expiresAt":0,"maxClaimableAmount":"1000","signature":"2aF1Rda2h8ecvpj6Dg99rBXd3Z1TAKtkoq8LPnwRw4UMbTYuqhVHjUn6hrPbnuzQTQiUj4VvEwTu813eu7dyzCh3"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"109","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"Fmw75DJk8fi8i6yjf3HA9oyxjz5QL6gs8SRXYV4hkxQ3","voucher":{"channelId":"Fmw75DJk8fi8i6yjf3HA9oyxjz5QL6gs8SRXYV4hkxQ3","expiresAt":0,"maxClaimableAmount":"1000","signature":"5LEJTzesUtMgvaY25KSUo1TAQPQeht7RBpqYRyEc1vRijHDzv2P2tCYAXKqKVU7ke8RZuMmxcpajLAXXcqWWZCqe"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"110","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"Bpd4syvg5BSByt7xXbNVSztCpgwHsCDrzSm54pm49VjQ","voucher":{"channelId":"Bpd4syvg5BSByt7xXbNVSztCpgwHsCDrzSm54pm49VjQ","expiresAt":0,"maxClaimableAmount":"1000","signature":"5ju5RhAzvKY9v1tub5tUR5aBcBRJjioyfeoJqXSo6WEd1ywCc1nw7tPpdAdJCjc4K4s9XFZPH9P6U2FCJH8WuDC7"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"111","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"EMJFPxSkCK8QztvKAjPniNbgevAu3Tcx8WpqDhw3zHxE","voucher":{"channelId":"EMJFPxSkCK8QztvKAjPniNbgevAu3Tcx8WpqDhw3zHxE","expiresAt":0,"maxClaimableAmount":"1000","signature":"57r7o5SRxtLsJr9wMj8wEhB74inVaJFwVAqEqAqY6qqqtFZmpWprUE3CdBBjiCZym6Zb6jjsZB4iL5uyNtSHod9U"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"112","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"9ZZL2NSCaoQRmKqBJjtC5AyhuongALRcpiKi8oP5fZ3t","voucher":{"channelId":"9ZZL2NSCaoQRmKqBJjtC5AyhuongALRcpiKi8oP5fZ3t","expiresAt":0,"maxClaimableAmount":"1000","signature":"3Dr3f4jFaMRQr8CW52yjNwsUMYekoaRXsWd93rmtsgo5Q7kGFKsEt5bLKDdjw53LS9G2SeCvVtbJKnyFdGxgHe4H"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"113","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"3bqqR4WnvtTMJxbChKYJHTktHyakzyUvYZbDEytT8umV","voucher":{"channelId":"3bqqR4WnvtTMJxbChKYJHTktHyakzyUvYZbDEytT8umV","expiresAt":0,"maxClaimableAmount":"1000","signature":"3GULYmEqbBEXVNVPvhUAnKG9MHon55ktkBAGCixUSLwKdoKP1CMDRtWiCyXN963LHzmBQ4V4nxUWfJGPQgYoq8qi"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"114","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"AzABWhvJfRpZu9cPfoAGkfSgA7n6CLN7L1Tsz4kSsPtA","voucher":{"channelId":"AzABWhvJfRpZu9cPfoAGkfSgA7n6CLN7L1Tsz4kSsPtA","expiresAt":0,"maxClaimableAmount":"1000","signature":"2CW2iPoeJx3EdeEgJ68bREhKhVRfGcyrbsQ9LWWoKM4sSLSF2Gm3y7BK2CaGRy9hX58QD7Rdi1pUM9Zv6sX24vQR"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"115","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"6GwxXVRNTRG1rMnvCs4Agy5Tw24Ag7JnPgZo5zDP6acv","voucher":{"channelId":"6GwxXVRNTRG1rMnvCs4Agy5Tw24Ag7JnPgZo5zDP6acv","expiresAt":0,"maxClaimableAmount":"1000","signature":"37HNwRRV62mnVBg1X3F7T4pumj1B74i5Tz8YzXjvwEy6oU6ccxiawySDNi8Ezz9cCTyyZHkWJ7J4beaXhC6JKYbt"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"116","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"BhgXfPYvNtMZFhrKF3MpatXjVMM9KmppZgBugyfVWsmY","voucher":{"channelId":"BhgXfPYvNtMZFhrKF3MpatXjVMM9KmppZgBugyfVWsmY","expiresAt":0,"maxClaimableAmount":"1000","signature":"5CzWp2MfYojT83Tu19vdpY6MuTFW9g5Vpha25N8u1Rw561xADeaoRcEK6fevHbo35ybACn3iT9xXf7xqRuiKKwSw"}},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"117","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"F2cTdjHc7JAfCogJzxiz2YiTsvtG4k55qvLewHRP6wvW","voucher":{"channelId":"F2cTdjHc7JAfCogJzxiz2YiTsvtG4k55qvLewHRP6wvW","expiresAt":0,"maxClaimableAmount":"1000","signature":"2KpMKJ4doNJrtVkkRmxFTrn7BUGcRX8a2F5oSX5pN2GfUUWW9XNueUdycYMLMoi9tYopn1iqnQfJ77oQzCqPsquM"}}],"type":"claim"} + base64Url (15660 chars) eyJjbGFpbXMiOlt7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwMCIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiQnI0d1VpOVRwTlRCN3dMOUJYb0NxS0FhSGhMVkFpaWlhV2J4dmUyb2c1RE0iLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkJyNHdVaTlUcE5UQjd3TDlCWG9DcUtBYUhoTFZBaWlpYVdieHZlMm9nNURNIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNXdlYmlENERiaEpwakdqVG9CTFhQb25DQ2NEcDVqSzZLdkphRzZ5OUxaajhSRnN1eFVnZmVINUZMVUtmWnd4Q2toYzJxcHhuOWQ5bm95Tnhwd2U1dmhXbyJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwMSIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiOTZ3aU1wcWRMUXZCSzJ2VEh3MkFMbnpLam9YZUhQZTlVSEw4R1BNNlZCSDMiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6Ijk2d2lNcHFkTFF2QksydlRIdzJBTG56S2pvWGVIUGU5VUhMOEdQTTZWQkgzIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMjNlZDd1MXNXVkw2N0RnUDJYUzVTNmE4UU5TTkROang0Nk4zV3JEalFjWU1rZFRLd0p4U292akx2RVNSRXdpbnFhWDdxRkd3WmlINEtoWDh3aHZLZHlybSJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwMiIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiOTE4dWpMeGl5cVpBMldteHpudnRIc0VrMzFuRG1QcjZHczhuQTczb1kyeW4iLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjkxOHVqTHhpeXFaQTJXbXh6bnZ0SHNFazMxbkRtUHI2R3M4bkE3M29ZMnluIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNU0xRXdUNlNzaHlVS1JodjZxS2ZTams3cWpqc3c3cnFaMXExYmpmcEhuZnFBVW02UFVkenhNVnNwRFFYMXB0dlF3amR3QjR4ZDZ4ZHBLSjlRQzhna3NkSiJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwMyIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiMjdQMlZNNXN3U1NSR0s4M0FxTWhHTmc5WmZUTlZYdHg3NE1rS2V2VjhQcEgiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjI3UDJWTTVzd1NTUkdLODNBcU1oR05nOVpmVE5WWHR4NzRNa0tldlY4UHBIIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMnl5anFhSHNkaUJLS0h2alI4dmRxcUhlUTM2QUZydXVHZHNhem1EQk1FYnRQaVhqYkRxQTNxNnM5Rnl1Z2ViV3B6TVdSZXNpTFBjTmZrVUJYMm9uVmR5USJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwNCIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiQkp0a3FZczljV2Z1eVAxeDlWR3NkVTJibWpRWVRyMnNEelBFMVdxNnZGWHMiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkJKdGtxWXM5Y1dmdXlQMXg5VkdzZFUyYm1qUVlUcjJzRHpQRTFXcTZ2RlhzIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNTNKdmJkQ3RCVW1EZ1Z3ZFBEYnZ3eVdYTXRYYVpCdlhSN3VVc1FxOEVQTFl0bUI4SEZTYWR0N0xkaHFKMm9Hd1M0aUNjWW0xV2RDQnUzUFRVNDdZRFI0aCJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwNSIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiNEFOTlZZeExmak52amdSNmtxRDdXN3dhQWZOR1pRM2l6QXFyUHVvbnZzd04iLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjRBTk5WWXhMZmpOdmpnUjZrcUQ3Vzd3YUFmTkdaUTNpekFxclB1b252c3dOIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNU0zSGtHdGNZaHVnY0Vod2d1RW4za011azNvUDF0Q2VMMWlVS1hjRmpyNVYyRTVlMlFySzQ4cno3ZUVmWks2NnlvNDRnQ0dFRVBQQ0MxVzNWUnprcUdLOSJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwNiIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiNHE5akVucUFNcDhodkJpc3VYaDlIdWl0V0JIUk5LdGhIbWRKMWJoQnk3cE4iLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjRxOWpFbnFBTXA4aHZCaXN1WGg5SHVpdFdCSFJOS3RoSG1kSjFiaEJ5N3BOIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMkdpUG5ZR1JrOGZqcVJmNFRucGlYVTN4VjFIeXJTZnlLZ1EySlhKVktLM1I2OGFodmRmVTExRnJjYzVITTJTZVNMUHJIRHJaZG5hWEw5ZXQxaHdIdlF0dCJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwNyIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiOEY1eHd6cktjZ3JNS0xhVFlHY0tNWmRjdURoaXE3UHhTR25IdVd0Nk1kOUYiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjhGNXh3enJLY2dyTUtMYVRZR2NLTVpkY3VEaGlxN1B4U0duSHVXdDZNZDlGIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMk5IcGN0NkVZdFBMY1g3cHZWOUNHNmFCM3RXdVc5a3BuOUpEcVBraUhaWVp2ZlpVYVVDbXF4V3pZU25SZzVaTkNUVXpTc1hjdm5STUR5TGFvS1JVV2plNCJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwOCIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiR1VOc0twYzV5YkI3dGo3U1VGOFVhc3VCeUhTN1N4czNhcHR0NWVSaWNBVEMiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkdVTnNLcGM1eWJCN3RqN1NVRjhVYXN1QnlIUzdTeHMzYXB0dDVlUmljQVRDIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMmFGMVJkYTJoOGVjdnBqNkRnOTlyQlhkM1oxVEFLdGtvcThMUG53Unc0VU1iVFl1cWhWSGpVbjZoclBibnV6UVRRaVVqNFZ2RXdUdTgxM2V1N2R5ekNoMyJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwOSIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiRm13NzVESms4Zmk4aTZ5amYzSEE5b3l4ano1UUw2Z3M4U1JYWVY0aGt4UTMiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkZtdzc1REprOGZpOGk2eWpmM0hBOW95eGp6NVFMNmdzOFNSWFlWNGhreFEzIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNUxFSlR6ZXNVdE1ndmFZMjVLU1VvMVRBUVBRZWh0N1JCcHFZUnlFYzF2UmlqSER6djJQMnRDWUFYS3FLVlU3a2U4Ulp1TW14Y3BhakxBWFhjcVdXWkNxZSJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExMCIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiQnBkNHN5dmc1QlNCeXQ3eFhiTlZTenRDcGd3SHNDRHJ6U201NHBtNDlWalEiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkJwZDRzeXZnNUJTQnl0N3hYYk5WU3p0Q3Bnd0hzQ0RyelNtNTRwbTQ5VmpRIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNWp1NVJoQXp2S1k5djF0dWI1dFVSNWFCY0JSSmppb3lmZW9KcVhTbzZXRWQxeXdDYzFudzd0UHBkQWRKQ2pjNEs0czlYRlpQSDlQNlUyRkNKSDhXdURDNyJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExMSIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiRU1KRlB4U2tDSzhRenR2S0FqUG5pTmJnZXZBdTNUY3g4V3BxRGh3M3pIeEUiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkVNSkZQeFNrQ0s4UXp0dktBalBuaU5iZ2V2QXUzVGN4OFdwcURodzN6SHhFIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNTdyN281U1J4dExzSnI5d01qOHdFaEI3NGluVmFKRndWQXFFcUFxWTZxcXF0RlptcFdwclVFM0NkQkJqaUNaeW02WmI2ampzWkI0aUw1dXlOdFNIb2Q5VSJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExMiIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiOVpaTDJOU0Nhb1FSbUtxQkpqdEM1QXlodW9uZ0FMUmNwaUtpOG9QNWZaM3QiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjlaWkwyTlNDYW9RUm1LcUJKanRDNUF5aHVvbmdBTFJjcGlLaThvUDVmWjN0IiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiM0RyM2Y0akZhTVJRcjhDVzUyeWpOd3NVTVlla29hUlhzV2Q5M3JtdHNnbzVRN2tHRktzRXQ1YkxLRGRqdzUzTFM5RzJTZUN2VnRiSktueUZkR3hnSGU0SCJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExMyIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiM2JxcVI0V252dFRNSnhiQ2hLWUpIVGt0SHlha3p5VXZZWmJERXl0VDh1bVYiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjNicXFSNFdudnRUTUp4YkNoS1lKSFRrdEh5YWt6eVV2WVpiREV5dFQ4dW1WIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiM0dVTFltRXFiQkVYVk5WUHZoVUFuS0c5TUhvbjU1a3RrQkFHQ2l4VVNMd0tkb0tQMUNNRFJ0V2lDeVhOOTYzTEh6bUJRNFY0bnhVV2ZKR1BRZ1lvcThxaSJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExNCIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiQXpBQldodkpmUnBadTljUGZvQUdrZlNnQTduNkNMTjdMMVRzejRrU3NQdEEiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkF6QUJXaHZKZlJwWnU5Y1Bmb0FHa2ZTZ0E3bjZDTE43TDFUc3o0a1NzUHRBIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMkNXMmlQb2VKeDNFZGVFZ0o2OGJSRWhLaFZSZkdjeXJic1E5TFdXb0tNNHNTTFNGMkdtM3k3QksyQ2FHUnk5aFg1OFFEN1JkaTFwVU05WnY2c1gyNHZRUiJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExNSIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiNkd3eFhWUk5UUkcxck1udkNzNEFneTVUdzI0QWc3Sm5QZ1pvNXpEUDZhY3YiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjZHd3hYVlJOVFJHMXJNbnZDczRBZ3k1VHcyNEFnN0puUGdabzV6RFA2YWN2IiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMzdITndSUlY2Mm1uVkJnMVgzRjdUNHB1bWoxQjc0aTVUejhZelhqdndFeTZvVTZjY3hpYXd5U0ROaThFeno5Y0NUeXlaSGtXSjdKNGJlYVhoQzZKS1lidCJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExNiIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiQmhnWGZQWXZOdE1aRmhyS0YzTXBhdFhqVk1NOUttcHBaZ0J1Z3lmVldzbVkiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkJoZ1hmUFl2TnRNWkZocktGM01wYXRYalZNTTlLbXBwWmdCdWd5ZlZXc21ZIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNUN6V3AyTWZZb2pUODNUdTE5dmRwWTZNdVRGVzlnNVZwaGEyNU44dTFSdzU2MXhBRGVhb1JjRUs2ZmV2SGJvMzV5YkFDbjNpVDl4WGY3eHFSdWlLS3dTdyJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExNyIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiRjJjVGRqSGM3SkFmQ29nSnp4aXoyWWlUc3Z0RzRrNTVxdkxld0hSUDZ3dlciLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkYyY1RkakhjN0pBZkNvZ0p6eGl6MllpVHN2dEc0azU1cXZMZXdIUlA2d3ZXIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMktwTUtKNGRvTkpydFZra1JteEZUcm43QlVHY1JYOGEyRjVvU1g1cE4yR2ZVVVdXOVhOdWVVZHljWU1MTW9pOXRZb3BuMWlxblFmSjc3b1F6Q3FQc3F1TSJ9fV0sInR5cGUiOiJjbGFpbSJ9 diff --git a/harness/vectors/annotated/batch-wire-redemption-claim-five-entries-reject.txt b/harness/vectors/annotated/batch-wire-redemption-claim-five-entries-reject.txt deleted file mode 100644 index 1992bc0e1..000000000 --- a/harness/vectors/annotated/batch-wire-redemption-claim-five-entries-reject.txt +++ /dev/null @@ -1,3 +0,0 @@ -# batch-wire-redemption-claim-five-entries-reject (x402-batch-settlement canonical-bytes, expect reject) -# generated by pkc fill; do not edit - diff --git a/harness/vectors/annotated/batch-wire-redemption-claim-nineteen-entries-reject.txt b/harness/vectors/annotated/batch-wire-redemption-claim-nineteen-entries-reject.txt new file mode 100644 index 000000000..1448426b0 --- /dev/null +++ b/harness/vectors/annotated/batch-wire-redemption-claim-nineteen-entries-reject.txt @@ -0,0 +1,3 @@ +# batch-wire-redemption-claim-nineteen-entries-reject (x402-batch-settlement canonical-bytes, expect reject) +# generated by pkc fill; do not edit + diff --git a/harness/vectors/annotated/batch-wire-redemption-settle-fourteen-channels-reject.txt b/harness/vectors/annotated/batch-wire-redemption-settle-fourteen-channels-reject.txt new file mode 100644 index 000000000..cfc087526 --- /dev/null +++ b/harness/vectors/annotated/batch-wire-redemption-settle-fourteen-channels-reject.txt @@ -0,0 +1,3 @@ +# batch-wire-redemption-settle-fourteen-channels-reject (x402-batch-settlement canonical-bytes, expect reject) +# generated by pkc fill; do not edit + diff --git a/harness/vectors/annotated/batch-wire-redemption-settle-thirteen-channels.txt b/harness/vectors/annotated/batch-wire-redemption-settle-thirteen-channels.txt new file mode 100644 index 000000000..afc8eabb9 --- /dev/null +++ b/harness/vectors/annotated/batch-wire-redemption-settle-thirteen-channels.txt @@ -0,0 +1,5 @@ +# batch-wire-redemption-settle-thirteen-channels (x402-batch-settlement canonical-bytes, expect accept) +# generated by pkc fill; do not edit + + canonicalJson (5685 bytes) {"channels":[{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"200","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"CKksPyLk4CiewPo7a3XeSLT67sRwsnwXg79RrpSs2KPw"},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"201","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"6CJAudALg2pEfuNU86wbewVmSQ1SbbqgxAbKyuyoqoZZ"},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"202","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"5sPNJYZc5djn9Pt7s2fXjwzmNRCVTrStfUnymhT1wnJd"},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"203","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"7wyGAu8UXQap8WhjUP7j3pTTQ371NbdT6qMUPtezsZa7"},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"204","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"37j8xzib7vzqcuZ92iPQ6e4b78tn9km77Ce2Bep56fD4"},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"205","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"3ECV7Q7eAtmXH9NBK4KiN8EKogkYWa4HmVrMkpbZj6rj"},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"206","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"ApAcndckB7RHy3H6tRUS4vByUouCVKaevUqzGdVUuGFf"},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"207","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"HGANnRDTeGCP7adfdPrshqRPpY4DruJmNW1edZVmL19A"},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"208","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"Gt4MVUCG393EQ3rg4PqbNXN488sEteZHEH8T9iSfz5bz"},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"209","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"Ftv6JqPjkLqkrYvLsUbKRN5ohDdC3AFS9FycPWb4bxfm"},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"210","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"EoqfLABd1Pzcv1G4NnmXkxALWPeqQw7caTLr5kV7Q48g"},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"211","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"E5tAKx8Xsf7U8ezYyGe1fH63k6qiFnrzgePm3d6XzPeo"},{"channelConfig":{"openSlot":341000000,"payer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","payerAuthorizer":"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB","receiver":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","salt":"212","token":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","withdrawDelay":3600},"channelId":"2w4mLaE3eXLKp46FZWAQvqb2iUgHBWN889BxJqa7aqaS"}],"type":"settle"} + base64Url (7580 chars) eyJjaGFubmVscyI6W3siY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjAwIiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiJDS2tzUHlMazRDaWV3UG83YTNYZVNMVDY3c1J3c253WGc3OVJycFNzMktQdyJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjAxIiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiI2Q0pBdWRBTGcycEVmdU5VODZ3YmV3Vm1TUTFTYmJxZ3hBYkt5dXlvcW9aWiJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjAyIiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiI1c1BOSllaYzVkam45UHQ3czJmWGp3em1OUkNWVHJTdGZVbnltaFQxd25KZCJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjAzIiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiI3d3lHQXU4VVhRYXA4V2hqVVA3ajNwVFRRMzcxTmJkVDZxTVVQdGV6c1phNyJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjA0IiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiIzN2o4eHppYjd2enFjdVo5MmlQUTZlNGI3OHRuOWttNzdDZTJCZXA1NmZENCJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjA1IiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiIzRUNWN1E3ZUF0bVhIOU5CSzRLaU44RUtvZ2tZV2E0SG1Wck1rcGJaajZyaiJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjA2IiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiJBcEFjbmRja0I3Ukh5M0g2dFJVUzR2QnlVb3VDVkthZXZVcXpHZFZVdUdGZiJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjA3IiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiJIR0FOblJEVGVHQ1A3YWRmZFByc2hxUlBwWTREcnVKbU5XMWVkWlZtTDE5QSJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjA4IiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiJHdDRNVlVDRzM5M0VRM3JnNFBxYk5YTjQ4OHNFdGVaSEVIOFQ5aVNmejVieiJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjA5IiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiJGdHY2SnFQamtMcWtyWXZMc1ViS1JONW9oRGRDM0FGUzlGeWNQV2I0YnhmbSJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjEwIiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiJFb3FmTEFCZDFQemN2MUc0Tm5tWGt4QUxXUGVxUXc3Y2FUTHI1a1Y3UTQ4ZyJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjExIiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiJFNXRBS3g4WHNmN1U4ZXpZeUdlMWZINjNrNnFpRm5yemdlUG0zZDZYelBlbyJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjEyIiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiIydzRtTGFFM2VYTEtwNDZGWldBUXZxYjJpVWdIQldOODg5QnhKcWE3YXFhUyJ9XSwidHlwZSI6InNldHRsZSJ9 diff --git a/harness/vectors/annotated/batch-wire-requirements-redemption-capacity.txt b/harness/vectors/annotated/batch-wire-requirements-redemption-capacity.txt new file mode 100644 index 000000000..6051fc6fe --- /dev/null +++ b/harness/vectors/annotated/batch-wire-requirements-redemption-capacity.txt @@ -0,0 +1,5 @@ +# batch-wire-requirements-redemption-capacity (x402-batch-settlement canonical-bytes, expect accept) +# generated by pkc fill; do not edit + + canonicalJson (542 bytes) {"amount":"1000","asset":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","extra":{"feePayer":"J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf","maxClaimChannels":18,"maxSettleChannels":13,"memo":"invoice-42","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","tokenProgram":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","transactionVersions":[0,1],"withdrawDelay":3600},"maxTimeoutSeconds":300,"network":"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","payTo":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","scheme":"batch-settlement"} + base64Url (723 chars) eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0 diff --git a/harness/vectors/annotated/batch-wire-requirements-transaction-versions.txt b/harness/vectors/annotated/batch-wire-requirements-transaction-versions.txt index 710ddb141..07ca21d36 100644 --- a/harness/vectors/annotated/batch-wire-requirements-transaction-versions.txt +++ b/harness/vectors/annotated/batch-wire-requirements-transaction-versions.txt @@ -1,5 +1,5 @@ # batch-wire-requirements-transaction-versions (x402-batch-settlement canonical-bytes, expect accept) # generated by pkc fill; do not edit - canonicalJson (497 bytes) {"amount":"1000","asset":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","extra":{"feePayer":"J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf","memo":"invoice-42","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","tokenProgram":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","transactionVersions":[0,1],"withdrawDelay":3600},"maxTimeoutSeconds":300,"network":"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","payTo":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","scheme":"batch-settlement"} - base64Url (663 chars) eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0 + canonicalJson (542 bytes) {"amount":"1000","asset":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","extra":{"feePayer":"J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf","maxClaimChannels":18,"maxSettleChannels":13,"memo":"invoice-42","receiverAuthorizer":"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os","tokenProgram":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","transactionVersions":[0,1],"withdrawDelay":3600},"maxTimeoutSeconds":300,"network":"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","payTo":"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY","scheme":"batch-settlement"} + base64Url (723 chars) eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0 diff --git a/harness/vectors/annotated/x402-verify-v1-compute-limit-at-cap-accept.txt b/harness/vectors/annotated/x402-verify-v1-compute-limit-at-cap-accept.txt index e2c0290fe..4561ad138 100644 --- a/harness/vectors/annotated/x402-verify-v1-compute-limit-at-cap-accept.txt +++ b/harness/vectors/annotated/x402-verify-v1-compute-limit-at-cap-accept.txt @@ -26,7 +26,7 @@ payment header (base64 JSON) transaction version 1 recent blockhash 11111111111111111111111111111111 - config computeUnitLimit 200000 priorityFee 1 lamports loadedAccountsDataSizeLimit 67108864 + config computeUnitLimit 400000 priorityFee 1 lamports loadedAccountsDataSizeLimit 67108864 signatures [0] empty J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf (server fee payer / charge recipient) [1] signed GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB (client) diff --git a/harness/vectors/annotated/x402-verify-v1-compute-limit-over-cap-reject.txt b/harness/vectors/annotated/x402-verify-v1-compute-limit-over-cap-reject.txt index c3d3a277d..c7f016eb1 100644 --- a/harness/vectors/annotated/x402-verify-v1-compute-limit-over-cap-reject.txt +++ b/harness/vectors/annotated/x402-verify-v1-compute-limit-over-cap-reject.txt @@ -26,7 +26,7 @@ payment header (base64 JSON) transaction version 1 recent blockhash 11111111111111111111111111111111 - config computeUnitLimit 200001 priorityFee 1 lamports loadedAccountsDataSizeLimit 67108864 + config computeUnitLimit 400001 priorityFee 1 lamports loadedAccountsDataSizeLimit 67108864 signatures [0] empty J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf (server fee payer / charge recipient) [1] signed GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB (client) diff --git a/harness/vectors/annotated/x402-verify-v1-heap-size-reject.txt b/harness/vectors/annotated/x402-verify-v1-heap-size-reject.txt new file mode 100644 index 000000000..2b4c03e4e --- /dev/null +++ b/harness/vectors/annotated/x402-verify-v1-heap-size-reject.txt @@ -0,0 +1,50 @@ +# x402-verify-v1-heap-size-reject (x402-exact verify-transaction, expect reject) +# generated by pkc fill; do not edit + +payment header (base64 JSON) +{ + "accepted": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "transactionVersions": [ + 0, + 1 + ] + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "exact" + }, + "payload": { + "transaction": "" + }, + "x402Version": 2 +} + +transaction version 1 + recent blockhash 11111111111111111111111111111111 + config computeUnitLimit 200000 priorityFee 1 lamports loadedAccountsDataSizeLimit 67108864 + signatures + [0] empty J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf (server fee payer / charge recipient) + [1] signed GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB (client) + accounts + [0] J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf (server fee payer / charge recipient) [signer, writable, fee payer] + [1] GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB (client) [signer] + [2] PjeTAeWHZHjrBForCEJvMVmRJpW5dngPaRzCp8w1MM4 (ATA(x402 payTo, mint, SPL Token)) [writable] + [3] 8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP (ATA(client, mint, SPL Token)) [writable] + [4] MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr (Memo) [readonly] + [5] TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA (SPL Token) [readonly] + [6] 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU (mint) [readonly] + instructions + #0 SPL Token TransferChecked + amount 1000 + decimals 6 + source 8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP (ATA(client, mint, SPL Token)) + mint 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU (mint) + destination PjeTAeWHZHjrBForCEJvMVmRJpW5dngPaRzCp8w1MM4 (ATA(x402 payTo, mint, SPL Token)) + authority GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB (client) + #1 Memo + text "x402verifyv1heap0000000000000000" diff --git a/harness/vectors/annotated/x402-verify-v1-loaded-data-limit-4mib-accept.txt b/harness/vectors/annotated/x402-verify-v1-loaded-data-limit-4mib-accept.txt new file mode 100644 index 000000000..fc2eb8947 --- /dev/null +++ b/harness/vectors/annotated/x402-verify-v1-loaded-data-limit-4mib-accept.txt @@ -0,0 +1,50 @@ +# x402-verify-v1-loaded-data-limit-4mib-accept (x402-exact verify-transaction, expect accept) +# generated by pkc fill; do not edit + +payment header (base64 JSON) +{ + "accepted": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "transactionVersions": [ + 0, + 1 + ] + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "exact" + }, + "payload": { + "transaction": "" + }, + "x402Version": 2 +} + +transaction version 1 + recent blockhash 11111111111111111111111111111111 + config computeUnitLimit 200000 priorityFee 1 lamports loadedAccountsDataSizeLimit 4194304 + signatures + [0] empty J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf (server fee payer / charge recipient) + [1] signed GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB (client) + accounts + [0] J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf (server fee payer / charge recipient) [signer, writable, fee payer] + [1] GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB (client) [signer] + [2] PjeTAeWHZHjrBForCEJvMVmRJpW5dngPaRzCp8w1MM4 (ATA(x402 payTo, mint, SPL Token)) [writable] + [3] 8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP (ATA(client, mint, SPL Token)) [writable] + [4] MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr (Memo) [readonly] + [5] TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA (SPL Token) [readonly] + [6] 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU (mint) [readonly] + instructions + #0 SPL Token TransferChecked + amount 1000 + decimals 6 + source 8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP (ATA(client, mint, SPL Token)) + mint 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU (mint) + destination PjeTAeWHZHjrBForCEJvMVmRJpW5dngPaRzCp8w1MM4 (ATA(x402 payTo, mint, SPL Token)) + authority GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB (client) + #1 Memo + text "x402verifyv1load0000000000000000" diff --git a/harness/vectors/annotated/x402-verify-v1-loaded-data-limit-small-accept.txt b/harness/vectors/annotated/x402-verify-v1-loaded-data-limit-small-accept.txt new file mode 100644 index 000000000..3d0828192 --- /dev/null +++ b/harness/vectors/annotated/x402-verify-v1-loaded-data-limit-small-accept.txt @@ -0,0 +1,50 @@ +# x402-verify-v1-loaded-data-limit-small-accept (x402-exact verify-transaction, expect accept) +# generated by pkc fill; do not edit + +payment header (base64 JSON) +{ + "accepted": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "transactionVersions": [ + 0, + 1 + ] + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "exact" + }, + "payload": { + "transaction": "" + }, + "x402Version": 2 +} + +transaction version 1 + recent blockhash 11111111111111111111111111111111 + config computeUnitLimit 200000 priorityFee 1 lamports loadedAccountsDataSizeLimit 32768 + signatures + [0] empty J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf (server fee payer / charge recipient) + [1] signed GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB (client) + accounts + [0] J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf (server fee payer / charge recipient) [signer, writable, fee payer] + [1] GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB (client) [signer] + [2] PjeTAeWHZHjrBForCEJvMVmRJpW5dngPaRzCp8w1MM4 (ATA(x402 payTo, mint, SPL Token)) [writable] + [3] 8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP (ATA(client, mint, SPL Token)) [writable] + [4] MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr (Memo) [readonly] + [5] TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA (SPL Token) [readonly] + [6] 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU (mint) [readonly] + instructions + #0 SPL Token TransferChecked + amount 1000 + decimals 6 + source 8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP (ATA(client, mint, SPL Token)) + mint 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU (mint) + destination PjeTAeWHZHjrBForCEJvMVmRJpW5dngPaRzCp8w1MM4 (ATA(x402 payTo, mint, SPL Token)) + authority GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB (client) + #1 Memo + text "x402verifyv1load0000000000000000" diff --git a/harness/vectors/batch-build.json b/harness/vectors/batch-build.json index 0588fd5a7..a59ef5476 100644 --- a/harness/vectors/batch-build.json +++ b/harness/vectors/batch-build.json @@ -894,6 +894,8 @@ "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", diff --git a/harness/vectors/batch-txv1.json b/harness/vectors/batch-txv1.json index f7a49e12b..e75738fb7 100644 --- a/harness/vectors/batch-txv1.json +++ b/harness/vectors/batch-txv1.json @@ -12,6 +12,8 @@ "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", @@ -148,7 +150,7 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3V5QUFBQUFBQUFBQkFEUU1BQUFBQUJBZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEVlA4QmxYSGNRckxXamlNdk9FN1NJZE1pZ2ZHOGg0SGhBZzNnUDA5dTFYejBYU0Z6UDE5MFg5MHdiQVl5VkQ0RGhXUFpTc1lFdHN0dHd2ZTdqemFRTyJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3V5QUFBQUFBQUFBQkFEUU1BQUFBQUJBZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEVlA4QmxYSGNRckxXamlNdk9FN1NJZE1pZ2ZHOGg0SGhBZzNnUDA5dTFYejBYU0Z6UDE5MFg5MHdiQVl5VkQ0RGhXUFpTc1lFdHN0dHd2ZTdqemFRTyJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", @@ -156,19 +158,19 @@ "requirements": [ "X402TX-4de59a1f27", "X402TX-d444d01b9e", - "X402TX-644919eb3b" + "X402TX-f9bcc1a14a" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", - "quote": "A version-1 transaction carries its compute budget in the message `TransactionConfig`.", + "quote": "A version-1 transaction carries its compute budget in the message's `TransactionConfigMask` and the config values that follow it", "section": "Transaction versions" }, "tier": "offline" }, { "bugType": "auth-bypass", - "description": "The same version-1 top_up on a route that accepts only version 0 (no transactionVersions advertised).", + "description": "The same version-1 top_up to a facilitator configured to accept only version 0 (batchServer.transactionVersions [0]).", "expect": { "outcome": "reject", "rejectCode": "unsupported-version" @@ -265,6 +267,9 @@ "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", "price": "0.001", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "transactionVersions": [ + 0 + ], "withdrawDelay": 3600 }, "batchServerChannel": { @@ -338,6 +343,8 @@ "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", @@ -474,7 +481,7 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCSno5QWhpMmE2VTRpUWtyeDhlWCt5RGlWVkNXclZja3Jqd1Y2Y2dXS2N4S0ZjSEU1WGE0bmd1dnRBcVIwZUhhaUZ3MUljdEkvVlA2dS9sVlp3NW9RSmdBSUFCQW45RnlRNFdxREhXMlQ3ZU0xZ0w2SFprZjNyOTJzVHhZN1hBdXJJTmVuMkdPcEtiR1BpbkZJS3Z2VlFleE11eGZtVlIzYXV2cjU3a2tJZTZta1VSdElzRXVrMks2Y2tQY3EvRXBLOVIyVjBDc3p3ZzQ1d3h1ZjgwWnQvWkxGZUl4NXJoUDVVQlptUXB1b2pDTnhsaUZXdGxZcGxIaFJYSmlQMyt0T1QyN0FUN1BpcGdsdFk3eTFjeDNReDRmbkdMUTEvcFNZZmk3ZjRoMjJmSG9tZzJTc2dCVXBUV3BrcElRWk5KT2h4WU5vNGZIdzF0ZDI4a3J1QjVCK29RRUVGUkkwRzNmYmgxMldoazluTDRVYk82M21zSExTRjdWOWJONUU2alBXRmZ2OEFxVHRFTExPUklWZnhPcE05QVRRb0xRTXJYLzdOQWFMYjhiZDVCZ2pmQUM2bnA2SDdwT3NyQ1FtVDk5TGYxaXVKNHJoeUIzcGpuOWZYUjZqcG4yUFVGYTRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUlCZ0VFQXdJSEJna0RjQmNBQUFBQUFBQUZBQXBwYm5admFXTmxMVFF5QUE9PSJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCSno5QWhpMmE2VTRpUWtyeDhlWCt5RGlWVkNXclZja3Jqd1Y2Y2dXS2N4S0ZjSEU1WGE0bmd1dnRBcVIwZUhhaUZ3MUljdEkvVlA2dS9sVlp3NW9RSmdBSUFCQW45RnlRNFdxREhXMlQ3ZU0xZ0w2SFprZjNyOTJzVHhZN1hBdXJJTmVuMkdPcEtiR1BpbkZJS3Z2VlFleE11eGZtVlIzYXV2cjU3a2tJZTZta1VSdElzRXVrMks2Y2tQY3EvRXBLOVIyVjBDc3p3ZzQ1d3h1ZjgwWnQvWkxGZUl4NXJoUDVVQlptUXB1b2pDTnhsaUZXdGxZcGxIaFJYSmlQMyt0T1QyN0FUN1BpcGdsdFk3eTFjeDNReDRmbkdMUTEvcFNZZmk3ZjRoMjJmSG9tZzJTc2dCVXBUV3BrcElRWk5KT2h4WU5vNGZIdzF0ZDI4a3J1QjVCK29RRUVGUkkwRzNmYmgxMldoazluTDRVYk82M21zSExTRjdWOWJONUU2alBXRmZ2OEFxVHRFTExPUklWZnhPcE05QVRRb0xRTXJYLzdOQWFMYjhiZDVCZ2pmQUM2bnA2SDdwT3NyQ1FtVDk5TGYxaXVKNHJoeUIzcGpuOWZYUjZqcG4yUFVGYTRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUlCZ0VFQXdJSEJna0RjQmNBQUFBQUFBQUZBQXBwYm5admFXTmxMVFF5QUE9PSJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", @@ -504,6 +511,8 @@ "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", @@ -640,18 +649,18 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJROEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUsvUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBTUdSbS9sSVJjeS8reXR1bkxEbStlOGpPVzd4ZmNTYXl4RG16cEFBQUFBQlVwVFdwa3BJUVpOSk9oeFlObzRmSHcxdGQyOGtydUI1QitvUUVFRlJJMEczZmJoMTJXaGs5bkw0VWJPNjNtc0hMU0Y3VjliTjVFNmpQV0ZmdjhBcVR0RUxMT1JJVmZ4T3BNOUFUUW9MUU1yWC83TkFhTGI4YmQ1QmdqZkFDNm5wNkg3cE9zckNRbVQ5OUxmMWl1SjRyaHlCM3BqbjlmWFI2anBuMlBVRmE3SUFBQUFBQUFBQUVBTkF3QUFBQUFFQlFBRkFBa0dDUUFHQUFvQUFrQU5Bd0FCQkFNQ0NBY0RjQmNBQUFBQUFBQnBiblp2YVdObExUUXlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnBNQ3BDK3htK1lzOEJ1eThQVkhqbmdyOXczanp5SmtGOXhXdDlBTW1oUk9VMnB6KzBoMEo4VWNBL2hlUndHM0xqd1A2cjFEbkNoQ2c5ZXVkU0E2QVU9In0sInR5cGUiOiJkZXBvc2l0Iiwidm91Y2hlciI6eyJjaGFubmVsSWQiOiJIamcyUERnTHhZRGlRV1JIckplZVk5VjlpTnllYk05TVd1dG9BNjdlaXZzWiIsImV4cGlyZXNBdCI6MCwibWF4Q2xhaW1hYmxlQW1vdW50IjoiNDAwMCIsInNpZ25hdHVyZSI6IjNXWU5qY21oZDRzWG9ueFFQckJxckZic1Z0OUpvZ0ZTdG9BU3BqNG8xTFRuTHhpOUhlNGI0ZTh0SGpzdUN0TUNXQlBrdG9SZnpHWHhIU2ZKOXVZZ2FYRFIifX0sIng0MDJWZXJzaW9uIjoyfQ==" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJROEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUsvUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBTUdSbS9sSVJjeS8reXR1bkxEbStlOGpPVzd4ZmNTYXl4RG16cEFBQUFBQlVwVFdwa3BJUVpOSk9oeFlObzRmSHcxdGQyOGtydUI1QitvUUVFRlJJMEczZmJoMTJXaGs5bkw0VWJPNjNtc0hMU0Y3VjliTjVFNmpQV0ZmdjhBcVR0RUxMT1JJVmZ4T3BNOUFUUW9MUU1yWC83TkFhTGI4YmQ1QmdqZkFDNm5wNkg3cE9zckNRbVQ5OUxmMWl1SjRyaHlCM3BqbjlmWFI2anBuMlBVRmE3SUFBQUFBQUFBQUVBTkF3QUFBQUFFQlFBRkFBa0dDUUFHQUFvQUFrQU5Bd0FCQkFNQ0NBY0RjQmNBQUFBQUFBQnBiblp2YVdObExUUXlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnBNQ3BDK3htK1lzOEJ1eThQVkhqbmdyOXczanp5SmtGOXhXdDlBTW1oUk9VMnB6KzBoMEo4VWNBL2hlUndHM0xqd1A2cjFEbkNoQ2c5ZXVkU0E2QVU9In0sInR5cGUiOiJkZXBvc2l0Iiwidm91Y2hlciI6eyJjaGFubmVsSWQiOiJIamcyUERnTHhZRGlRV1JIckplZVk5VjlpTnllYk05TVd1dG9BNjdlaXZzWiIsImV4cGlyZXNBdCI6MCwibWF4Q2xhaW1hYmxlQW1vdW50IjoiNDAwMCIsInNpZ25hdHVyZSI6IjNXWU5qY21oZDRzWG9ueFFQckJxckZic1Z0OUpvZ0ZTdG9BU3BqNG8xTFRuTHhpOUhlNGI0ZTh0SGpzdUN0TUNXQlBrdG9SZnpHWHhIU2ZKOXVZZ2FYRFIifX0sIng0MDJWZXJzaW9uIjoyfQ==" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-936b492daa" + "X402TX-915632f040" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", - "quote": "A version-1 transaction that contains a Compute Budget instruction MUST be rejected.", + "quote": "A version-1 transaction that contains a Compute Budget instruction MUST be rejected (an x402 sponsor rule; the runtime treats such instructions as no-ops).", "section": "Top-level instruction layout" }, "tier": "offline" @@ -670,6 +679,8 @@ "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", @@ -806,19 +817,19 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3VBQUFBQkFnR0NRQUZBQW9BQVFRREFnY0dBM0FYQUFBQUFBQUFhVzUyYjJsalpTMDBNZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJCbmEwd2tOaGtCSWNGZFRkSEg5M3Fyc0ROUnBhdnVIZnVrTW16alFFRWlNOEJxcmllQis2L3cyR29LZUhwSGFTd1pUdjJzVFNONlB6Zm5rOGJWMllCIn0sInR5cGUiOiJkZXBvc2l0Iiwidm91Y2hlciI6eyJjaGFubmVsSWQiOiJIamcyUERnTHhZRGlRV1JIckplZVk5VjlpTnllYk05TVd1dG9BNjdlaXZzWiIsImV4cGlyZXNBdCI6MCwibWF4Q2xhaW1hYmxlQW1vdW50IjoiNDAwMCIsInNpZ25hdHVyZSI6IjNXWU5qY21oZDRzWG9ueFFQckJxckZic1Z0OUpvZ0ZTdG9BU3BqNG8xTFRuTHhpOUhlNGI0ZTh0SGpzdUN0TUNXQlBrdG9SZnpHWHhIU2ZKOXVZZ2FYRFIifX0sIng0MDJWZXJzaW9uIjoyfQ==" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3VBQUFBQkFnR0NRQUZBQW9BQVFRREFnY0dBM0FYQUFBQUFBQUFhVzUyYjJsalpTMDBNZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJCbmEwd2tOaGtCSWNGZFRkSEg5M3Fyc0ROUnBhdnVIZnVrTW16alFFRWlNOEJxcmllQis2L3cyR29LZUhwSGFTd1pUdjJzVFNONlB6Zm5rOGJWMllCIn0sInR5cGUiOiJkZXBvc2l0Iiwidm91Y2hlciI6eyJjaGFubmVsSWQiOiJIamcyUERnTHhZRGlRV1JIckplZVk5VjlpTnllYk05TVd1dG9BNjdlaXZzWiIsImV4cGlyZXNBdCI6MCwibWF4Q2xhaW1hYmxlQW1vdW50IjoiNDAwMCIsInNpZ25hdHVyZSI6IjNXWU5qY21oZDRzWG9ueFFQckJxckZic1Z0OUpvZ0ZTdG9BU3BqNG8xTFRuTHhpOUhlNGI0ZTh0SGpzdUN0TUNXQlBrdG9SZnpHWHhIU2ZKOXVZZ2FYRFIifX0sIng0MDJWZXJzaW9uIjoyfQ==" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-0f874a9c63", - "X402TX-644919eb3b" + "X402TX-703c03cfb5", + "X402TX-f9bcc1a14a" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", - "quote": "`computeUnitLimit` MUST be present and MUST NOT exceed `400000`", + "quote": "`computeUnitLimit` (bit 2) MUST be set and MUST NOT exceed `400000`", "section": "Top-level instruction layout" }, "tier": "offline" @@ -837,6 +848,8 @@ "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", @@ -973,19 +986,19 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3VRQTBEQUFnR0NRQUZBQW9BQVFRREFnY0dBM0FYQUFBQUFBQUFhVzUyYjJsalpTMDBNZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJsMnZiR0xidmFGOVVFVHlvQ0ZsQ3BmZFJvWjMxRmQxOGNZOGlrYitCLzZzRnpBeHhyc241Zzl1THVOZkJsWmNOQnlFMTRsSzFPMkI4cGdnTC9QR3dPIn0sInR5cGUiOiJkZXBvc2l0Iiwidm91Y2hlciI6eyJjaGFubmVsSWQiOiJIamcyUERnTHhZRGlRV1JIckplZVk5VjlpTnllYk05TVd1dG9BNjdlaXZzWiIsImV4cGlyZXNBdCI6MCwibWF4Q2xhaW1hYmxlQW1vdW50IjoiNDAwMCIsInNpZ25hdHVyZSI6IjNXWU5qY21oZDRzWG9ueFFQckJxckZic1Z0OUpvZ0ZTdG9BU3BqNG8xTFRuTHhpOUhlNGI0ZTh0SGpzdUN0TUNXQlBrdG9SZnpHWHhIU2ZKOXVZZ2FYRFIifX0sIng0MDJWZXJzaW9uIjoyfQ==" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3VRQTBEQUFnR0NRQUZBQW9BQVFRREFnY0dBM0FYQUFBQUFBQUFhVzUyYjJsalpTMDBNZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJsMnZiR0xidmFGOVVFVHlvQ0ZsQ3BmZFJvWjMxRmQxOGNZOGlrYitCLzZzRnpBeHhyc241Zzl1THVOZkJsWmNOQnlFMTRsSzFPMkI4cGdnTC9QR3dPIn0sInR5cGUiOiJkZXBvc2l0Iiwidm91Y2hlciI6eyJjaGFubmVsSWQiOiJIamcyUERnTHhZRGlRV1JIckplZVk5VjlpTnllYk05TVd1dG9BNjdlaXZzWiIsImV4cGlyZXNBdCI6MCwibWF4Q2xhaW1hYmxlQW1vdW50IjoiNDAwMCIsInNpZ25hdHVyZSI6IjNXWU5qY21oZDRzWG9ueFFQckJxckZic1Z0OUpvZ0ZTdG9BU3BqNG8xTFRuTHhpOUhlNGI0ZTh0SGpzdUN0TUNXQlBrdG9SZnpHWHhIU2ZKOXVZZ2FYRFIifX0sIng0MDJWZXJzaW9uIjoyfQ==" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-0f874a9c63", - "X402TX-644919eb3b" + "X402TX-703c03cfb5", + "X402TX-f9bcc1a14a" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", - "quote": "`loadedAccountsDataSizeLimit` MUST be present", + "quote": "`loadedAccountsDataSizeLimit` (bit 3) MUST be set", "section": "Top-level instruction layout" }, "tier": "offline" @@ -1003,6 +1016,8 @@ "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", @@ -1139,19 +1154,19 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3V5QUFBQUFBQUFBQkFEUU1BQUFBQUFnZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWTVYODBtS1I5ditpYU9BVXMvT1RpZkZiMTZBSnQ5MmtQRmtkT3V3a05hdUwwY0wrTkFXSlJOVk1tajN4TW9EaDRwUUNkUTl2KzlHNnQ4bjRLYVNFRyJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3V5QUFBQUFBQUFBQkFEUU1BQUFBQUFnZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWTVYODBtS1I5ditpYU9BVXMvT1RpZkZiMTZBSnQ5MmtQRmtkT3V3a05hdUwwY0wrTkFXSlJOVk1tajN4TW9EaDRwUUNkUTl2KzlHNnQ4bjRLYVNFRyJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", "provenance": "authored", "requirements": [ - "X402TX-0f874a9c63", - "X402TX-644919eb3b" + "X402TX-703c03cfb5", + "X402TX-f9bcc1a14a" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", - "quote": "`loadedAccountsDataSizeLimit` MUST be present", + "quote": "`loadedAccountsDataSizeLimit` (bit 3) MUST be set", "section": "Top-level instruction layout" }, "tier": "offline" @@ -1170,6 +1185,8 @@ "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", @@ -1306,18 +1323,18 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3V5QUFBQUFBQUFBQ0JHZ1lBQUFBQUJBZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSlJZcGlEdUJjQnNyL1FGMnhFeDhYMUN0U2JNTUxDS0lVbTB0dU1iRVN4OWdpdEZscWREU0l6UGJsNG9Ec1V3bVVwZXAyZExSL1MvSjgwbTI2QTRrSiJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3V5QUFBQUFBQUFBQ0JHZ1lBQUFBQUJBZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSlJZcGlEdUJjQnNyL1FGMnhFeDhYMUN0U2JNTUxDS0lVbTB0dU1iRVN4OWdpdEZscWREU0l6UGJsNG9Ec1V3bVVwZXAyZExSL1MvSjgwbTI2QTRrSiJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-0f874a9c63" + "X402TX-703c03cfb5" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", - "quote": "`computeUnitLimit` MUST be present and MUST NOT exceed `400000`", + "quote": "`computeUnitLimit` (bit 2) MUST be set and MUST NOT exceed `400000`", "section": "Top-level instruction layout" }, "tier": "offline" @@ -1336,6 +1353,8 @@ "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", @@ -1472,13 +1491,13 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3UzUVVBQUFBQUFBQXNBUUFBQUFBQUJBZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDZDFoQ0V2OVYxRVE5Y0Z1cWVmLzBRSnE1V20wM1hjNlNERWNETmJUZ1o0UWlHL1FWbWJyMEY5Mk1KbGJoaGRkMUZkM3Z1UmpRbUpwM3crMGtBTmNJUCJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3UzUVVBQUFBQUFBQXNBUUFBQUFBQUJBZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDZDFoQ0V2OVYxRVE5Y0Z1cWVmLzBRSnE1V20wM1hjNlNERWNETmJUZ1o0UWlHL1FWbWJyMEY5Mk1KbGJoaGRkMUZkM3Z1UmpRbUpwM3crMGtBTmNJUCJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-0f874a9c63" + "X402TX-703c03cfb5" ], "role": "server", "spec": { @@ -1501,6 +1520,8 @@ "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", @@ -1637,13 +1658,13 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3UzQVVBQUFBQUFBQXNBUUFBQUFBQUJBZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBODJvQWZVUDZ0OHRRbFZ5V0FRS2FaYS8rRXhPSjd1V2EyZkR6TFVYVXRMS3JKWGl6NnFOeGx5dElzSDhiT1Q5V0dLdjZyY2I4NlFSZXJ4TENFWEY0RCJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3UzQVVBQUFBQUFBQXNBUUFBQUFBQUJBZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBODJvQWZVUDZ0OHRRbFZ5V0FRS2FaYS8rRXhPSjd1V2EyZkR6TFVYVXRMS3JKWGl6NnFOeGx5dElzSDhiT1Q5V0dLdjZyY2I4NlFSZXJ4TENFWEY0RCJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-0f874a9c63" + "X402TX-703c03cfb5" ], "role": "server", "spec": { @@ -1657,6 +1678,12 @@ "bugType": "auth-bypass", "description": "priorityFee 2001 lamports at computeUnitLimit 200000: far under the per-unit cap, but one lamport over the cap the sponsor puts on the total fee it pays (RULINGS S6).", "expect": { + "alsoConformant": [ + { + "outcome": "accept" + } + ], + "alsoConformantReason": "the upto and batch-settlement schemes cap the compute unit limit at 400,000 and the unit price at 5,000,000 micro-lamports (or a version-1 priorityFee at 5 lamports per unit) and this transaction is within them; the 2,000 lamport cap on the total fee is pay-kit's stricter local policy, which the schemes allow but do not require (upto: “A sponsor MAY apply a stricter local policy for compute-unit limit, compute-unit price, and required-signature count”; batch-settlement: “A sponsor MAY apply stricter local compute-unit, priority-fee, or required-signature caps”), so a sponsor without it accepts (RULINGS S6).", "outcome": "reject", "rejectCode": "setup-transaction" }, @@ -1667,6 +1694,8 @@ "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", @@ -1803,13 +1832,13 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3UwUWNBQUFBQUFBQkFEUU1BQUFBQUJBZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnZmQzB2UUs0eGxvQzlsalFtMjRNR0NJVGVXWXRaOENucm5NcWY3bmtnMzlwbXZKb09aUHdKbnRMNThqQUh2WlMxNGVCSDR0RFQwNUkybE1ZWE53RCJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJBOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUovUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVktVMXFaS1NFR1RTVG9jV0RhT0h4OE5iWGR2Sks3Z2VRZnFFQkJCVVNOQnQzMjRkZGxvWlBaeStGR3p1dDVyQnkwaGUxZld6ZVJPb3oxaFg3L0FLazdSQ3l6a1NGWDhUcVRQUUUwS0MwREsxLyt6UUdpMi9HM2VRWUkzd0F1cDZlaCs2VHJLd2tKay9mUzM5WXJpZUs0Y2dkNlk1L1gxMGVvNlo5ajFCV3UwUWNBQUFBQUFBQkFEUU1BQUFBQUJBZ0dDUUFGQUFvQUFRUURBZ2NHQTNBWEFBQUFBQUFBYVc1MmIybGpaUzAwTWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnZmQzB2UUs0eGxvQzlsalFtMjRNR0NJVGVXWXRaOENucm5NcWY3bmtnMzlwbXZKb09aUHdKbnRMNThqQUh2WlMxNGVCSDR0RFQwNUkybE1ZWE53RCJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-0f874a9c63" + "X402TX-703c03cfb5" ], "role": "server", "spec": { @@ -1833,6 +1862,8 @@ "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", @@ -1969,7 +2000,7 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCMFYwdHhTM2h4d1VUdWJXbnZFOFdxY29qRzZVRnpOMFJYVlg1ZFo4YytMZ1RtTGRyOXppYjZEM3VRTEhOK0djWFNxMTl3dEw0MTRDWnZpRmtHN0JvQmdBSUFCUXI5RnlRNFdxREhXMlQ3ZU0xZ0w2SFprZjNyOTJzVHhZN1hBdXJJTmVuMkdPcEtiR1BpbkZJS3Z2VlFleE11eGZtVlIzYXV2cjU3a2tJZTZta1VSdElzRXVrMks2Y2tQY3EvRXBLOVIyVjBDc3p3ZzQ1d3h1ZjgwWnQvWkxGZUl4NXJoUDVVQlptUXB1b2pDTnhsaUZXdGxZcGxIaFJYSmlQMyt0T1QyN0FUN1BpcGdsdFk3eTFjeDNReDRmbkdMUTEvcFNZZmk3ZjRoMjJmSG9tZzJTc2dCTit0ZVdML3NkMlNYUXFmdGViUURPWVpXNmk3T3BIOUIrK1lZTVhwZTdnRlNsTmFtU2toQmswazZIRmcyamg4ZkRXMTNieVN1NEhrSDZoQVFRVkVqUWJkOXVIWFphR1QyY3ZoUnM3cmVhd2N0SVh0WDFzM2tUcU05WVYrL3dDcE8wUXNzNUVoVi9FNmt6MEJOQ2d0QXl0Zi9zMEJvdHZ4dDNrR0NOOEFMcWVub2Z1azZ5c0pDWlAzMHQvV0s0bml1SElIZW1PZjE5ZEhxT21mWTlRVnJnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlFrR0FRUURBZ2dIQ1FOd0Z3QUFBQUFBQUFZQUNtbHVkbTlwWTJVdE5ESUZBTW9DQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCUURLQWdFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUVVBeWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBIn0sInR5cGUiOiJkZXBvc2l0Iiwidm91Y2hlciI6eyJjaGFubmVsSWQiOiJIamcyUERnTHhZRGlRV1JIckplZVk5VjlpTnllYk05TVd1dG9BNjdlaXZzWiIsImV4cGlyZXNBdCI6MCwibWF4Q2xhaW1hYmxlQW1vdW50IjoiNDAwMCIsInNpZ25hdHVyZSI6IjNXWU5qY21oZDRzWG9ueFFQckJxckZic1Z0OUpvZ0ZTdG9BU3BqNG8xTFRuTHhpOUhlNGI0ZTh0SGpzdUN0TUNXQlBrdG9SZnpHWHhIU2ZKOXVZZ2FYRFIifX0sIng0MDJWZXJzaW9uIjoyfQ==" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCMFYwdHhTM2h4d1VUdWJXbnZFOFdxY29qRzZVRnpOMFJYVlg1ZFo4YytMZ1RtTGRyOXppYjZEM3VRTEhOK0djWFNxMTl3dEw0MTRDWnZpRmtHN0JvQmdBSUFCUXI5RnlRNFdxREhXMlQ3ZU0xZ0w2SFprZjNyOTJzVHhZN1hBdXJJTmVuMkdPcEtiR1BpbkZJS3Z2VlFleE11eGZtVlIzYXV2cjU3a2tJZTZta1VSdElzRXVrMks2Y2tQY3EvRXBLOVIyVjBDc3p3ZzQ1d3h1ZjgwWnQvWkxGZUl4NXJoUDVVQlptUXB1b2pDTnhsaUZXdGxZcGxIaFJYSmlQMyt0T1QyN0FUN1BpcGdsdFk3eTFjeDNReDRmbkdMUTEvcFNZZmk3ZjRoMjJmSG9tZzJTc2dCTit0ZVdML3NkMlNYUXFmdGViUURPWVpXNmk3T3BIOUIrK1lZTVhwZTdnRlNsTmFtU2toQmswazZIRmcyamg4ZkRXMTNieVN1NEhrSDZoQVFRVkVqUWJkOXVIWFphR1QyY3ZoUnM3cmVhd2N0SVh0WDFzM2tUcU05WVYrL3dDcE8wUXNzNUVoVi9FNmt6MEJOQ2d0QXl0Zi9zMEJvdHZ4dDNrR0NOOEFMcWVub2Z1azZ5c0pDWlAzMHQvV0s0bml1SElIZW1PZjE5ZEhxT21mWTlRVnJnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlFrR0FRUURBZ2dIQ1FOd0Z3QUFBQUFBQUFZQUNtbHVkbTlwWTJVdE5ESUZBTW9DQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCUURLQWdFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUVVBeWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBIn0sInR5cGUiOiJkZXBvc2l0Iiwidm91Y2hlciI6eyJjaGFubmVsSWQiOiJIamcyUERnTHhZRGlRV1JIckplZVk5VjlpTnllYk05TVd1dG9BNjdlaXZzWiIsImV4cGlyZXNBdCI6MCwibWF4Q2xhaW1hYmxlQW1vdW50IjoiNDAwMCIsInNpZ25hdHVyZSI6IjNXWU5qY21oZDRzWG9ueFFQckJxckZic1Z0OUpvZ0ZTdG9BU3BqNG8xTFRuTHhpOUhlNGI0ZTh0SGpzdUN0TUNXQlBrdG9SZnpHWHhIU2ZKOXVZZ2FYRFIifX0sIng0MDJWZXJzaW9uIjoyfQ==" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", @@ -1998,6 +2029,8 @@ "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", @@ -2134,7 +2167,7 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJROEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBVUsvUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVGZyWGxpLzdIZGtsMEtuN1htMEF6bUdWdW91enFSL1Fmdm1HREY2WHU0QlVwVFdwa3BJUVpOSk9oeFlObzRmSHcxdGQyOGtydUI1QitvUUVFRlJJMEczZmJoMTJXaGs5bkw0VWJPNjNtc0hMU0Y3VjliTjVFNmpQV0ZmdjhBcVR0RUxMT1JJVmZ4T3BNOUFUUW9MUU1yWC83TkFhTGI4YmQ1QmdqZkFDNm5wNkg3cE9zckNRbVQ5OUxmMWl1SjRyaHlCM3BqbjlmWFI2anBuMlBVRmE3SUFBQUFBQUFBQUVBTkF3QUFBQUFFQ1FZSkFBWUFDZ0FGQUVvQkJRQktBUVVBU2dFQkJBTUNDQWNEY0JjQUFBQUFBQUJwYm5admFXTmxMVFF5QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUkvL0orL1AzS05IWG1lNE9iNkxBOXpSbmpsbmI5SlJLVTNmMGJlN3ZuU2xyRG45TE5zRlZmMEpwR3c5dHFiNWt2U1ZmNkQ0bFNoQVN0emtIV3VMeHdVPSJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiZ1FJQUJROEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBVUsvUmNrT0ZxZ3gxdGsrM2pOWUMraDJaSDk2L2RyRThXTzF3THF5RFhwOWhqcVNteGo0cHhTQ3I3MVVIc1RMc1g1bFVkMnJyNitlNUpDSHVwcEZFYlNMQkxwTml1bkpEM0t2eEtTdlVkbGRBck04SU9PY01ibi9OR2JmMlN4WGlNZWE0VCtWQVdaa0ticUl3amNaWWhWclpXS1pSNFVWeVlqOS9yVGs5dXdFK3o0cVlKYldPOHRYTWQwTWVINXhpME5mNlVtSDR1MytJZHRueDZKb05rcklBVGZyWGxpLzdIZGtsMEtuN1htMEF6bUdWdW91enFSL1Fmdm1HREY2WHU0QlVwVFdwa3BJUVpOSk9oeFlObzRmSHcxdGQyOGtydUI1QitvUUVFRlJJMEczZmJoMTJXaGs5bkw0VWJPNjNtc0hMU0Y3VjliTjVFNmpQV0ZmdjhBcVR0RUxMT1JJVmZ4T3BNOUFUUW9MUU1yWC83TkFhTGI4YmQ1QmdqZkFDNm5wNkg3cE9zckNRbVQ5OUxmMWl1SjRyaHlCM3BqbjlmWFI2anBuMlBVRmE3SUFBQUFBQUFBQUVBTkF3QUFBQUFFQ1FZSkFBWUFDZ0FGQUVvQkJRQktBUVVBU2dFQkJBTUNDQWNEY0JjQUFBQUFBQUJwYm5admFXTmxMVFF5QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUkvL0orL1AzS05IWG1lNE9iNkxBOXpSbmpsbmI5SlJLVTNmMGJlN3ZuU2xyRG45TE5zRlZmMEpwR3c5dHFiNWt2U1ZmNkQ0bFNoQVN0emtIV3VMeHdVPSJ9LCJ0eXBlIjoiZGVwb3NpdCIsInZvdWNoZXIiOnsiY2hhbm5lbElkIjoiSGpnMlBEZ0x4WURpUVdSSHJKZWVZOVY5aU55ZWJNOU1XdXRvQTY3ZWl2c1oiLCJleHBpcmVzQXQiOjAsIm1heENsYWltYWJsZUFtb3VudCI6IjQwMDAiLCJzaWduYXR1cmUiOiIzV1lOamNtaGQ0c1hvbnhRUHJCcXJGYnNWdDlKb2dGU3RvQVNwajRvMUxUbkx4aTlIZTRiNGU4dEhqc3VDdE1DV0JQa3RvUmZ6R1h4SFNmSjl1WWdhWERSIn19LCJ4NDAyVmVyc2lvbiI6Mn0=" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", @@ -2164,6 +2197,8 @@ "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", @@ -2300,7 +2335,7 @@ "recentBlockhash": "11111111111111111111111111111111", "slot": 341000100 }, - "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEZWgyZVN0VjdmakZUdmRpR2JoYlI4QklJNVIzWHJBNXBQT1JzbDY1ZXB5RjkvUXBEVHNLTjgzbTE0Ynl2cmNxZTI5bUdJMStYTXVBTjFySmdtUmEwT0FnQUZDdjBYSkRoYW9NZGJaUHQ0eldBdm9kbVIvZXYzYXhQRmp0Y0M2c2cxNmZZWTZrcHNZK0tjVWdxKzlWQjdFeTdGK1pWSGRxNit2bnVTUWg3cWFSUkcwaXdTNlRZcnB5UTl5cjhTa3IxSFpYUUt6UENEam5ERzUvelJtMzlrc1Y0akhtdUUvbFFGbVpDbTZpTUkzR1dJVmEyVmltVWVGRmNtSS9mNjA1UGJzQlBzK0ttQ1cxanZMVnpIZERIaCtjWXREWCtsSmgrTHQvaUhiWjhlaWFEWkt5QURCa1p2NVNFWE12L3NyYnB5dzV2bnZJemx1OFgzRW1zc1E1czZRQUFBQUFWS1UxcVpLU0VHVFNUb2NXRGFPSHg4TmJYZHZKSzdnZVFmcUVCQkJVU05CdDMyNGRkbG9aUFp5K0ZHenV0NXJCeTBoZTFmV3plUk9vejFoWDcvQUtrN1JDeXprU0ZYOFRxVFBRRTBLQzBESzEvK3pRR2kyL0czZVFZSTN3QXVwNmVoKzZUckt3a0prL2ZTMzlZcmllSzRjZ2Q2WTUvWDEwZW82WjlqMUJXdUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQlFBSkEwRkxUQUFBQUFBQUNRWUJCQU1DQ0FjSkEzQVhBQUFBQUFBQUJnQUthVzUyYjJsalpTMDBNZz09In0sInR5cGUiOiJkZXBvc2l0Iiwidm91Y2hlciI6eyJjaGFubmVsSWQiOiJIamcyUERnTHhZRGlRV1JIckplZVk5VjlpTnllYk05TVd1dG9BNjdlaXZzWiIsImV4cGlyZXNBdCI6MCwibWF4Q2xhaW1hYmxlQW1vdW50IjoiNDAwMCIsInNpZ25hdHVyZSI6IjNXWU5qY21oZDRzWG9ueFFQckJxckZic1Z0OUpvZ0ZTdG9BU3BqNG8xTFRuTHhpOUhlNGI0ZTh0SGpzdUN0TUNXQlBrdG9SZnpHWHhIU2ZKOXVZZ2FYRFIifX0sIng0MDJWZXJzaW9uIjoyfQ==" + "x402PaymentHeader": "eyJhY2NlcHRlZCI6eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0sInBheWxvYWQiOnsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImRlcG9zaXQiOnsiYW1vdW50IjoiNjAwMCIsInRyYW5zYWN0aW9uIjoiQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEZWgyZVN0VjdmakZUdmRpR2JoYlI4QklJNVIzWHJBNXBQT1JzbDY1ZXB5RjkvUXBEVHNLTjgzbTE0Ynl2cmNxZTI5bUdJMStYTXVBTjFySmdtUmEwT0FnQUZDdjBYSkRoYW9NZGJaUHQ0eldBdm9kbVIvZXYzYXhQRmp0Y0M2c2cxNmZZWTZrcHNZK0tjVWdxKzlWQjdFeTdGK1pWSGRxNit2bnVTUWg3cWFSUkcwaXdTNlRZcnB5UTl5cjhTa3IxSFpYUUt6UENEam5ERzUvelJtMzlrc1Y0akhtdUUvbFFGbVpDbTZpTUkzR1dJVmEyVmltVWVGRmNtSS9mNjA1UGJzQlBzK0ttQ1cxanZMVnpIZERIaCtjWXREWCtsSmgrTHQvaUhiWjhlaWFEWkt5QURCa1p2NVNFWE12L3NyYnB5dzV2bnZJemx1OFgzRW1zc1E1czZRQUFBQUFWS1UxcVpLU0VHVFNUb2NXRGFPSHg4TmJYZHZKSzdnZVFmcUVCQkJVU05CdDMyNGRkbG9aUFp5K0ZHenV0NXJCeTBoZTFmV3plUk9vejFoWDcvQUtrN1JDeXprU0ZYOFRxVFBRRTBLQzBESzEvK3pRR2kyL0czZVFZSTN3QXVwNmVoKzZUckt3a0prL2ZTMzlZcmllSzRjZ2Q2WTUvWDEwZW82WjlqMUJXdUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQlFBSkEwRkxUQUFBQUFBQUNRWUJCQU1DQ0FjSkEzQVhBQUFBQUFBQUJnQUthVzUyYjJsalpTMDBNZz09In0sInR5cGUiOiJkZXBvc2l0Iiwidm91Y2hlciI6eyJjaGFubmVsSWQiOiJIamcyUERnTHhZRGlRV1JIckplZVk5VjlpTnllYk05TVd1dG9BNjdlaXZzWiIsImV4cGlyZXNBdCI6MCwibWF4Q2xhaW1hYmxlQW1vdW50IjoiNDAwMCIsInNpZ25hdHVyZSI6IjNXWU5qY21oZDRzWG9ueFFQckJxckZic1Z0OUpvZ0ZTdG9BU3BqNG8xTFRuTHhpOUhlNGI0ZTh0SGpzdUN0TUNXQlBrdG9SZnpHWHhIU2ZKOXVZZ2FYRFIifX0sIng0MDJWZXJzaW9uIjoyfQ==" }, "intent": "x402-batch-settlement", "mode": "verify-transaction", @@ -2318,7 +2353,7 @@ }, { "bugType": "auth-bypass", - "description": "A client-mode refund whose request_close is version 1 on a route that accepts only version 0.", + "description": "A client-mode refund whose request_close is version 1, to a facilitator configured to accept only version 0 (batchServer.transactionVersions [0]).", "expect": { "outcome": "reject", "rejectCode": "unsupported-version" @@ -2415,6 +2450,9 @@ "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", "price": "0.001", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "transactionVersions": [ + 0 + ], "withdrawDelay": 3600 }, "batchServerChannel": { diff --git a/harness/vectors/batch-verify-refund.json b/harness/vectors/batch-verify-refund.json index 5c4e95c84..f24db5ba4 100644 --- a/harness/vectors/batch-verify-refund.json +++ b/harness/vectors/batch-verify-refund.json @@ -426,6 +426,7 @@ "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", "settled": "0" }, + "batchVerdictFromStore": true, "rpcFixtures": { "accounts": { "8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP": { diff --git a/harness/vectors/batch-verify-setup-policy.json b/harness/vectors/batch-verify-setup-policy.json index f65af56d0..36e0a95cd 100644 --- a/harness/vectors/batch-verify-setup-policy.json +++ b/harness/vectors/batch-verify-setup-policy.json @@ -322,6 +322,12 @@ "bugType": "auth-bypass", "description": "SetComputeUnitLimit 400000 and SetComputeUnitPrice 5000000, each at its own cap: the sponsor would pay a 2000000 lamport priority fee, so it bounds the fee as limit times price (RULINGS S6). Pair: batch-verify-top-up-compute-budget-prefix.", "expect": { + "alsoConformant": [ + { + "outcome": "accept" + } + ], + "alsoConformantReason": "the upto and batch-settlement schemes cap the compute unit limit at 400,000 and the unit price at 5,000,000 micro-lamports (or a version-1 priorityFee at 5 lamports per unit) and this transaction is within them; the 2,000 lamport cap on the total fee is pay-kit's stricter local policy, which the schemes allow but do not require (upto: “A sponsor MAY apply a stricter local policy for compute-unit limit, compute-unit price, and required-signature count”; batch-settlement: “A sponsor MAY apply stricter local compute-unit, priority-fee, or required-signature caps”), so a sponsor without it accepts (RULINGS S6).", "outcome": "reject", "rejectCode": "setup-transaction" }, @@ -481,6 +487,12 @@ "bugType": "auth-bypass", "description": "SetComputeUnitPrice 5001 with no SetComputeUnitLimit: the runtime budgets 200000 units for each of the top_up and the memo, so the sponsor would pay 2001 lamports, one over its cap (RULINGS S6). A verifier that bounds only declared limits accepts it.", "expect": { + "alsoConformant": [ + { + "outcome": "accept" + } + ], + "alsoConformantReason": "the upto and batch-settlement schemes cap the compute unit limit at 400,000 and the unit price at 5,000,000 micro-lamports (or a version-1 priorityFee at 5 lamports per unit) and this transaction is within them; the 2,000 lamport cap on the total fee is pay-kit's stricter local policy, which the schemes allow but do not require (upto: “A sponsor MAY apply a stricter local policy for compute-unit limit, compute-unit price, and required-signature count”; batch-settlement: “A sponsor MAY apply stricter local compute-unit, priority-fee, or required-signature caps”), so a sponsor without it accepts (RULINGS S6).", "outcome": "reject", "rejectCode": "setup-transaction" }, @@ -945,7 +957,7 @@ "role": "server", "spec": { "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", - "quote": "The message MAY be legacy or version `0`, but it MUST NOT contain Address Lookup Table lookups.", + "quote": "The message version MUST be one advertised in `extra.transactionVersions` (0 when the field is absent; see [Transaction versions](#transaction-versions)), and the message MUST NOT contain Address Lookup Table lookups.", "section": "Client-supplied transaction acceptance policy" }, "tier": "offline" @@ -3159,7 +3171,7 @@ "role": "server", "spec": { "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", - "quote": "An optional Compute Budget prefix containing at most one `SetComputeUnitLimit` instruction", + "quote": "In a legacy or version-0 transaction, an optional Compute Budget prefix containing at most one `SetComputeUnitLimit` instruction", "section": "Client-supplied transaction acceptance policy" }, "tier": "offline" @@ -4114,8 +4126,14 @@ }, { "bugType": "auth-bypass", - "description": "top_up data with one trailing byte (10 bytes instead of 9).", + "description": "top_up data with one trailing byte (10 bytes instead of 9). The Rust sponsor decodes the top_up as strictly as the open and refuses it; the spec states the trailing-bytes rule for the open only.", "expect": { + "alsoConformant": [ + { + "outcome": "accept" + } + ], + "alsoConformantReason": "“The facilitator MUST fully decode the instruction data, reject truncated data or trailing bytes” is stated under Canonical open only; Canonical top_up requires that “The facilitator MUST confirm the decoded amount equals `payload.deposit.amount`”, which a decoder that ignores the extra byte also confirms.", "outcome": "reject", "rejectCode": "setup-transaction" }, @@ -4260,13 +4278,13 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402-176a26e5b6" + "X402-06bb8f3a9e" ], "role": "server", "spec": { "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", - "quote": "The facilitator MUST fully decode the instruction data, reject truncated data or trailing bytes", - "section": "Canonical open" + "quote": "The facilitator MUST confirm the decoded amount equals `payload.deposit.amount`; the channel is `Open`;", + "section": "Canonical top_up" }, "tier": "offline" }, diff --git a/harness/vectors/batch-verify-voucher.json b/harness/vectors/batch-verify-voucher.json index 76eb70b54..417993074 100644 --- a/harness/vectors/batch-verify-voucher.json +++ b/harness/vectors/batch-verify-voucher.json @@ -267,6 +267,7 @@ "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", "settled": "0" }, + "batchVerdictFromStore": true, "rpcFixtures": { "accounts": { "8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP": { @@ -425,6 +426,7 @@ "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", "settled": "0" }, + "batchVerdictFromStore": true, "rpcFixtures": { "accounts": { "8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP": { @@ -583,6 +585,7 @@ "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", "settled": "0" }, + "batchVerdictFromStore": true, "rpcFixtures": { "accounts": { "8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP": { @@ -1994,6 +1997,7 @@ "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", "settled": "0" }, + "batchVerdictFromStore": true, "rpcFixtures": { "accounts": { "8EiF91LJfbatqHRY3k2jp8dwrFY3yDQeEovpMDZnpJiP": { @@ -3791,6 +3795,13 @@ "bugType": "auth-bypass", "description": "channelConfig omits receiverAuthorizer while the requirements advertise one: both MUST be present and equal.", "expect": { + "alsoConformant": [ + { + "outcome": "reject", + "rejectCode": "payload-type" + } + ], + "alsoConformantReason": "channelConfig.receiverAuthorizer is a required field of the wire object (“| `receiverAuthorizer` | string | Required.”), so a verifier that validates the payload shape before comparing it with extra.receiverAuthorizer refuses it as invalid_batch_settlement_svm_payload_type; the spec does not order the two checks.", "outcome": "reject", "rejectCode": "receiver-authorizer-mismatch" }, @@ -3950,6 +3961,13 @@ "bugType": "auth-bypass", "description": "channelConfig.voucherSigner \"server\" on a client-mode route: the mode must equal extra.voucherSigner.", "expect": { + "alsoConformant": [ + { + "outcome": "reject", + "rejectCode": "payload-type" + } + ], + "alsoConformantReason": "no reason code names a voucherSigner that differs from extra.voucherSigner; a server-mode channelConfig on a client-mode route is a payload the route's operation does not take (invalid_batch_settlement_svm_payload_type, “payload `type` is not valid for the current verify or settle operation”) as plausibly as a channel-state mismatch.", "outcome": "reject", "rejectCode": "channel-state" }, diff --git a/harness/vectors/batch-wire.json b/harness/vectors/batch-wire.json index 74c605727..b6ff8510e 100644 --- a/harness/vectors/batch-wire.json +++ b/harness/vectors/batch-wire.json @@ -646,12 +646,12 @@ "mode": "canonical-bytes", "provenance": "generated", "requirements": [ - "X402-7f4ee54a73" + "X402-76654742e7" ], "role": "both", "spec": { "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", - "quote": "`claims[]` MUST contain between one and four entries so the instruction pairs fit in a legacy Solana transaction without address lookup tables.", + "quote": "`claims[]` MUST contain at least one entry and at most `extra.maxClaimChannels` entries, or four when the facilitator advertises no `maxClaimChannels`, so the instruction pairs fit in one transaction without address lookup tables.", "section": "4.5 Facilitator Interface" }, "tier": "offline" @@ -677,29 +677,1092 @@ "mode": "canonical-bytes", "provenance": "authored", "requirements": [ - "X402-7f4ee54a73" + "X402-76654742e7" ], "role": "both", "spec": { "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", - "quote": "`claims[]` MUST contain between one and four entries so the instruction pairs fit in a legacy Solana transaction without address lookup tables.", + "quote": "`claims[]` MUST contain at least one entry and at most `extra.maxClaimChannels` entries, or four when the facilitator advertises no `maxClaimChannels`, so the instruction pairs fit in one transaction without address lookup tables.", "section": "4.5 Facilitator Interface" }, "tier": "offline" }, { "bugType": "wire", - "description": "Five claims exceed the four entries one legacy transaction can carry.", + "description": "Eighteen claims, the version-1 capacity (extra.maxClaimChannels 18): the payload parses. More than four is no longer a wire error; a facilitator that builds version 0 rejects it against its own capacity.", + "expect": { + "exactBytes": { + "base64Url": "eyJjbGFpbXMiOlt7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwMCIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiQnI0d1VpOVRwTlRCN3dMOUJYb0NxS0FhSGhMVkFpaWlhV2J4dmUyb2c1RE0iLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkJyNHdVaTlUcE5UQjd3TDlCWG9DcUtBYUhoTFZBaWlpYVdieHZlMm9nNURNIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNXdlYmlENERiaEpwakdqVG9CTFhQb25DQ2NEcDVqSzZLdkphRzZ5OUxaajhSRnN1eFVnZmVINUZMVUtmWnd4Q2toYzJxcHhuOWQ5bm95Tnhwd2U1dmhXbyJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwMSIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiOTZ3aU1wcWRMUXZCSzJ2VEh3MkFMbnpLam9YZUhQZTlVSEw4R1BNNlZCSDMiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6Ijk2d2lNcHFkTFF2QksydlRIdzJBTG56S2pvWGVIUGU5VUhMOEdQTTZWQkgzIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMjNlZDd1MXNXVkw2N0RnUDJYUzVTNmE4UU5TTkROang0Nk4zV3JEalFjWU1rZFRLd0p4U292akx2RVNSRXdpbnFhWDdxRkd3WmlINEtoWDh3aHZLZHlybSJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwMiIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiOTE4dWpMeGl5cVpBMldteHpudnRIc0VrMzFuRG1QcjZHczhuQTczb1kyeW4iLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjkxOHVqTHhpeXFaQTJXbXh6bnZ0SHNFazMxbkRtUHI2R3M4bkE3M29ZMnluIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNU0xRXdUNlNzaHlVS1JodjZxS2ZTams3cWpqc3c3cnFaMXExYmpmcEhuZnFBVW02UFVkenhNVnNwRFFYMXB0dlF3amR3QjR4ZDZ4ZHBLSjlRQzhna3NkSiJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwMyIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiMjdQMlZNNXN3U1NSR0s4M0FxTWhHTmc5WmZUTlZYdHg3NE1rS2V2VjhQcEgiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjI3UDJWTTVzd1NTUkdLODNBcU1oR05nOVpmVE5WWHR4NzRNa0tldlY4UHBIIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMnl5anFhSHNkaUJLS0h2alI4dmRxcUhlUTM2QUZydXVHZHNhem1EQk1FYnRQaVhqYkRxQTNxNnM5Rnl1Z2ViV3B6TVdSZXNpTFBjTmZrVUJYMm9uVmR5USJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwNCIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiQkp0a3FZczljV2Z1eVAxeDlWR3NkVTJibWpRWVRyMnNEelBFMVdxNnZGWHMiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkJKdGtxWXM5Y1dmdXlQMXg5VkdzZFUyYm1qUVlUcjJzRHpQRTFXcTZ2RlhzIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNTNKdmJkQ3RCVW1EZ1Z3ZFBEYnZ3eVdYTXRYYVpCdlhSN3VVc1FxOEVQTFl0bUI4SEZTYWR0N0xkaHFKMm9Hd1M0aUNjWW0xV2RDQnUzUFRVNDdZRFI0aCJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwNSIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiNEFOTlZZeExmak52amdSNmtxRDdXN3dhQWZOR1pRM2l6QXFyUHVvbnZzd04iLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjRBTk5WWXhMZmpOdmpnUjZrcUQ3Vzd3YUFmTkdaUTNpekFxclB1b252c3dOIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNU0zSGtHdGNZaHVnY0Vod2d1RW4za011azNvUDF0Q2VMMWlVS1hjRmpyNVYyRTVlMlFySzQ4cno3ZUVmWks2NnlvNDRnQ0dFRVBQQ0MxVzNWUnprcUdLOSJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwNiIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiNHE5akVucUFNcDhodkJpc3VYaDlIdWl0V0JIUk5LdGhIbWRKMWJoQnk3cE4iLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjRxOWpFbnFBTXA4aHZCaXN1WGg5SHVpdFdCSFJOS3RoSG1kSjFiaEJ5N3BOIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMkdpUG5ZR1JrOGZqcVJmNFRucGlYVTN4VjFIeXJTZnlLZ1EySlhKVktLM1I2OGFodmRmVTExRnJjYzVITTJTZVNMUHJIRHJaZG5hWEw5ZXQxaHdIdlF0dCJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwNyIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiOEY1eHd6cktjZ3JNS0xhVFlHY0tNWmRjdURoaXE3UHhTR25IdVd0Nk1kOUYiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjhGNXh3enJLY2dyTUtMYVRZR2NLTVpkY3VEaGlxN1B4U0duSHVXdDZNZDlGIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMk5IcGN0NkVZdFBMY1g3cHZWOUNHNmFCM3RXdVc5a3BuOUpEcVBraUhaWVp2ZlpVYVVDbXF4V3pZU25SZzVaTkNUVXpTc1hjdm5STUR5TGFvS1JVV2plNCJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwOCIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiR1VOc0twYzV5YkI3dGo3U1VGOFVhc3VCeUhTN1N4czNhcHR0NWVSaWNBVEMiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkdVTnNLcGM1eWJCN3RqN1NVRjhVYXN1QnlIUzdTeHMzYXB0dDVlUmljQVRDIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMmFGMVJkYTJoOGVjdnBqNkRnOTlyQlhkM1oxVEFLdGtvcThMUG53Unc0VU1iVFl1cWhWSGpVbjZoclBibnV6UVRRaVVqNFZ2RXdUdTgxM2V1N2R5ekNoMyJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjEwOSIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiRm13NzVESms4Zmk4aTZ5amYzSEE5b3l4ano1UUw2Z3M4U1JYWVY0aGt4UTMiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkZtdzc1REprOGZpOGk2eWpmM0hBOW95eGp6NVFMNmdzOFNSWFlWNGhreFEzIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNUxFSlR6ZXNVdE1ndmFZMjVLU1VvMVRBUVBRZWh0N1JCcHFZUnlFYzF2UmlqSER6djJQMnRDWUFYS3FLVlU3a2U4Ulp1TW14Y3BhakxBWFhjcVdXWkNxZSJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExMCIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiQnBkNHN5dmc1QlNCeXQ3eFhiTlZTenRDcGd3SHNDRHJ6U201NHBtNDlWalEiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkJwZDRzeXZnNUJTQnl0N3hYYk5WU3p0Q3Bnd0hzQ0RyelNtNTRwbTQ5VmpRIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNWp1NVJoQXp2S1k5djF0dWI1dFVSNWFCY0JSSmppb3lmZW9KcVhTbzZXRWQxeXdDYzFudzd0UHBkQWRKQ2pjNEs0czlYRlpQSDlQNlUyRkNKSDhXdURDNyJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExMSIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiRU1KRlB4U2tDSzhRenR2S0FqUG5pTmJnZXZBdTNUY3g4V3BxRGh3M3pIeEUiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkVNSkZQeFNrQ0s4UXp0dktBalBuaU5iZ2V2QXUzVGN4OFdwcURodzN6SHhFIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNTdyN281U1J4dExzSnI5d01qOHdFaEI3NGluVmFKRndWQXFFcUFxWTZxcXF0RlptcFdwclVFM0NkQkJqaUNaeW02WmI2ampzWkI0aUw1dXlOdFNIb2Q5VSJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExMiIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiOVpaTDJOU0Nhb1FSbUtxQkpqdEM1QXlodW9uZ0FMUmNwaUtpOG9QNWZaM3QiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjlaWkwyTlNDYW9RUm1LcUJKanRDNUF5aHVvbmdBTFJjcGlLaThvUDVmWjN0IiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiM0RyM2Y0akZhTVJRcjhDVzUyeWpOd3NVTVlla29hUlhzV2Q5M3JtdHNnbzVRN2tHRktzRXQ1YkxLRGRqdzUzTFM5RzJTZUN2VnRiSktueUZkR3hnSGU0SCJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExMyIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiM2JxcVI0V252dFRNSnhiQ2hLWUpIVGt0SHlha3p5VXZZWmJERXl0VDh1bVYiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjNicXFSNFdudnRUTUp4YkNoS1lKSFRrdEh5YWt6eVV2WVpiREV5dFQ4dW1WIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiM0dVTFltRXFiQkVYVk5WUHZoVUFuS0c5TUhvbjU1a3RrQkFHQ2l4VVNMd0tkb0tQMUNNRFJ0V2lDeVhOOTYzTEh6bUJRNFY0bnhVV2ZKR1BRZ1lvcThxaSJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExNCIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiQXpBQldodkpmUnBadTljUGZvQUdrZlNnQTduNkNMTjdMMVRzejRrU3NQdEEiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkF6QUJXaHZKZlJwWnU5Y1Bmb0FHa2ZTZ0E3bjZDTE43TDFUc3o0a1NzUHRBIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMkNXMmlQb2VKeDNFZGVFZ0o2OGJSRWhLaFZSZkdjeXJic1E5TFdXb0tNNHNTTFNGMkdtM3k3QksyQ2FHUnk5aFg1OFFEN1JkaTFwVU05WnY2c1gyNHZRUiJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExNSIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiNkd3eFhWUk5UUkcxck1udkNzNEFneTVUdzI0QWc3Sm5QZ1pvNXpEUDZhY3YiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IjZHd3hYVlJOVFJHMXJNbnZDczRBZ3k1VHcyNEFnN0puUGdabzV6RFA2YWN2IiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMzdITndSUlY2Mm1uVkJnMVgzRjdUNHB1bWoxQjc0aTVUejhZelhqdndFeTZvVTZjY3hpYXd5U0ROaThFeno5Y0NUeXlaSGtXSjdKNGJlYVhoQzZKS1lidCJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExNiIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiQmhnWGZQWXZOdE1aRmhyS0YzTXBhdFhqVk1NOUttcHBaZ0J1Z3lmVldzbVkiLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkJoZ1hmUFl2TnRNWkZocktGM01wYXRYalZNTTlLbXBwWmdCdWd5ZlZXc21ZIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiNUN6V3AyTWZZb2pUODNUdTE5dmRwWTZNdVRGVzlnNVZwaGEyNU44dTFSdzU2MXhBRGVhb1JjRUs2ZmV2SGJvMzV5YkFDbjNpVDl4WGY3eHFSdWlLS3dTdyJ9fSx7ImNoYW5uZWxDb25maWciOnsib3BlblNsb3QiOjM0MTAwMDAwMCwicGF5ZXIiOiJHbWFEcnBwQkM3UDVBUktWOGczZGppd1A4OXZ6MWpMSzIzVjJHQmp1QUVHQiIsInBheWVyQXV0aG9yaXplciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicmVjZWl2ZXIiOiJDWGhyRlpKTEtxanptUDNzallMY0Y0ZFRlWFdLQ3k5ZTJTWFhaMllvNk1QWSIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwic2FsdCI6IjExNyIsInRva2VuIjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwiY2hhbm5lbElkIjoiRjJjVGRqSGM3SkFmQ29nSnp4aXoyWWlUc3Z0RzRrNTVxdkxld0hSUDZ3dlciLCJ2b3VjaGVyIjp7ImNoYW5uZWxJZCI6IkYyY1RkakhjN0pBZkNvZ0p6eGl6MllpVHN2dEc0azU1cXZMZXdIUlA2d3ZXIiwiZXhwaXJlc0F0IjowLCJtYXhDbGFpbWFibGVBbW91bnQiOiIxMDAwIiwic2lnbmF0dXJlIjoiMktwTUtKNGRvTkpydFZra1JteEZUcm43QlVHY1JYOGEyRjVvU1g1cE4yR2ZVVVdXOVhOdWVVZHljWU1MTW9pOXRZb3BuMWlxblFmSjc3b1F6Q3FQc3F1TSJ9fV0sInR5cGUiOiJjbGFpbSJ9", + "canonicalJson": "{\"claims\":[{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"100\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"Br4wUi9TpNTB7wL9BXoCqKAaHhLVAiiiaWbxve2og5DM\",\"voucher\":{\"channelId\":\"Br4wUi9TpNTB7wL9BXoCqKAaHhLVAiiiaWbxve2og5DM\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"5webiD4DbhJpjGjToBLXPonCCcDp5jK6KvJaG6y9LZj8RFsuxUgfeH5FLUKfZwxCkhc2qpxn9d9noyNxpwe5vhWo\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"101\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"96wiMpqdLQvBK2vTHw2ALnzKjoXeHPe9UHL8GPM6VBH3\",\"voucher\":{\"channelId\":\"96wiMpqdLQvBK2vTHw2ALnzKjoXeHPe9UHL8GPM6VBH3\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"23ed7u1sWVL67DgP2XS5S6a8QNSNDNjx46N3WrDjQcYMkdTKwJxSovjLvESREwinqaX7qFGwZiH4KhX8whvKdyrm\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"102\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"918ujLxiyqZA2WmxznvtHsEk31nDmPr6Gs8nA73oY2yn\",\"voucher\":{\"channelId\":\"918ujLxiyqZA2WmxznvtHsEk31nDmPr6Gs8nA73oY2yn\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"5M1EwT6SshyUKRhv6qKfSjk7qjjsw7rqZ1q1bjfpHnfqAUm6PUdzxMVspDQX1ptvQwjdwB4xd6xdpKJ9QC8gksdJ\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"103\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"27P2VM5swSSRGK83AqMhGNg9ZfTNVXtx74MkKevV8PpH\",\"voucher\":{\"channelId\":\"27P2VM5swSSRGK83AqMhGNg9ZfTNVXtx74MkKevV8PpH\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"2yyjqaHsdiBKKHvjR8vdqqHeQ36AFruuGdsazmDBMEbtPiXjbDqA3q6s9FyugebWpzMWResiLPcNfkUBX2onVdyQ\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"104\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"BJtkqYs9cWfuyP1x9VGsdU2bmjQYTr2sDzPE1Wq6vFXs\",\"voucher\":{\"channelId\":\"BJtkqYs9cWfuyP1x9VGsdU2bmjQYTr2sDzPE1Wq6vFXs\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"53JvbdCtBUmDgVwdPDbvwyWXMtXaZBvXR7uUsQq8EPLYtmB8HFSadt7LdhqJ2oGwS4iCcYm1WdCBu3PTU47YDR4h\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"105\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"4ANNVYxLfjNvjgR6kqD7W7waAfNGZQ3izAqrPuonvswN\",\"voucher\":{\"channelId\":\"4ANNVYxLfjNvjgR6kqD7W7waAfNGZQ3izAqrPuonvswN\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"5M3HkGtcYhugcEhwguEn3kMuk3oP1tCeL1iUKXcFjr5V2E5e2QrK48rz7eEfZK66yo44gCGEEPPCC1W3VRzkqGK9\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"106\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"4q9jEnqAMp8hvBisuXh9HuitWBHRNKthHmdJ1bhBy7pN\",\"voucher\":{\"channelId\":\"4q9jEnqAMp8hvBisuXh9HuitWBHRNKthHmdJ1bhBy7pN\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"2GiPnYGRk8fjqRf4TnpiXU3xV1HyrSfyKgQ2JXJVKK3R68ahvdfU11Frcc5HM2SeSLPrHDrZdnaXL9et1hwHvQtt\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"107\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"8F5xwzrKcgrMKLaTYGcKMZdcuDhiq7PxSGnHuWt6Md9F\",\"voucher\":{\"channelId\":\"8F5xwzrKcgrMKLaTYGcKMZdcuDhiq7PxSGnHuWt6Md9F\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"2NHpct6EYtPLcX7pvV9CG6aB3tWuW9kpn9JDqPkiHZYZvfZUaUCmqxWzYSnRg5ZNCTUzSsXcvnRMDyLaoKRUWje4\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"108\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"GUNsKpc5ybB7tj7SUF8UasuByHS7Sxs3aptt5eRicATC\",\"voucher\":{\"channelId\":\"GUNsKpc5ybB7tj7SUF8UasuByHS7Sxs3aptt5eRicATC\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"2aF1Rda2h8ecvpj6Dg99rBXd3Z1TAKtkoq8LPnwRw4UMbTYuqhVHjUn6hrPbnuzQTQiUj4VvEwTu813eu7dyzCh3\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"109\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"Fmw75DJk8fi8i6yjf3HA9oyxjz5QL6gs8SRXYV4hkxQ3\",\"voucher\":{\"channelId\":\"Fmw75DJk8fi8i6yjf3HA9oyxjz5QL6gs8SRXYV4hkxQ3\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"5LEJTzesUtMgvaY25KSUo1TAQPQeht7RBpqYRyEc1vRijHDzv2P2tCYAXKqKVU7ke8RZuMmxcpajLAXXcqWWZCqe\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"110\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"Bpd4syvg5BSByt7xXbNVSztCpgwHsCDrzSm54pm49VjQ\",\"voucher\":{\"channelId\":\"Bpd4syvg5BSByt7xXbNVSztCpgwHsCDrzSm54pm49VjQ\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"5ju5RhAzvKY9v1tub5tUR5aBcBRJjioyfeoJqXSo6WEd1ywCc1nw7tPpdAdJCjc4K4s9XFZPH9P6U2FCJH8WuDC7\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"111\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"EMJFPxSkCK8QztvKAjPniNbgevAu3Tcx8WpqDhw3zHxE\",\"voucher\":{\"channelId\":\"EMJFPxSkCK8QztvKAjPniNbgevAu3Tcx8WpqDhw3zHxE\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"57r7o5SRxtLsJr9wMj8wEhB74inVaJFwVAqEqAqY6qqqtFZmpWprUE3CdBBjiCZym6Zb6jjsZB4iL5uyNtSHod9U\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"112\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"9ZZL2NSCaoQRmKqBJjtC5AyhuongALRcpiKi8oP5fZ3t\",\"voucher\":{\"channelId\":\"9ZZL2NSCaoQRmKqBJjtC5AyhuongALRcpiKi8oP5fZ3t\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"3Dr3f4jFaMRQr8CW52yjNwsUMYekoaRXsWd93rmtsgo5Q7kGFKsEt5bLKDdjw53LS9G2SeCvVtbJKnyFdGxgHe4H\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"113\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"3bqqR4WnvtTMJxbChKYJHTktHyakzyUvYZbDEytT8umV\",\"voucher\":{\"channelId\":\"3bqqR4WnvtTMJxbChKYJHTktHyakzyUvYZbDEytT8umV\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"3GULYmEqbBEXVNVPvhUAnKG9MHon55ktkBAGCixUSLwKdoKP1CMDRtWiCyXN963LHzmBQ4V4nxUWfJGPQgYoq8qi\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"114\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"AzABWhvJfRpZu9cPfoAGkfSgA7n6CLN7L1Tsz4kSsPtA\",\"voucher\":{\"channelId\":\"AzABWhvJfRpZu9cPfoAGkfSgA7n6CLN7L1Tsz4kSsPtA\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"2CW2iPoeJx3EdeEgJ68bREhKhVRfGcyrbsQ9LWWoKM4sSLSF2Gm3y7BK2CaGRy9hX58QD7Rdi1pUM9Zv6sX24vQR\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"115\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"6GwxXVRNTRG1rMnvCs4Agy5Tw24Ag7JnPgZo5zDP6acv\",\"voucher\":{\"channelId\":\"6GwxXVRNTRG1rMnvCs4Agy5Tw24Ag7JnPgZo5zDP6acv\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"37HNwRRV62mnVBg1X3F7T4pumj1B74i5Tz8YzXjvwEy6oU6ccxiawySDNi8Ezz9cCTyyZHkWJ7J4beaXhC6JKYbt\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"116\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"BhgXfPYvNtMZFhrKF3MpatXjVMM9KmppZgBugyfVWsmY\",\"voucher\":{\"channelId\":\"BhgXfPYvNtMZFhrKF3MpatXjVMM9KmppZgBugyfVWsmY\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"5CzWp2MfYojT83Tu19vdpY6MuTFW9g5Vpha25N8u1Rw561xADeaoRcEK6fevHbo35ybACn3iT9xXf7xqRuiKKwSw\"}},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"117\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"F2cTdjHc7JAfCogJzxiz2YiTsvtG4k55qvLewHRP6wvW\",\"voucher\":{\"channelId\":\"F2cTdjHc7JAfCogJzxiz2YiTsvtG4k55qvLewHRP6wvW\",\"expiresAt\":0,\"maxClaimableAmount\":\"1000\",\"signature\":\"2KpMKJ4doNJrtVkkRmxFTrn7BUGcRX8a2F5oSX5pN2GfUUWW9XNueUdycYMLMoi9tYopn1iqnQfJ77oQzCqPsquM\"}}],\"type\":\"claim\"}" + }, + "outcome": "accept" + }, + "id": "batch-wire-redemption-claim-eighteen-entries", + "input": { + "batchWire": { + "shape": "redemption", + "value": { + "claims": [ + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "100", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "Br4wUi9TpNTB7wL9BXoCqKAaHhLVAiiiaWbxve2og5DM", + "voucher": { + "channelId": "Br4wUi9TpNTB7wL9BXoCqKAaHhLVAiiiaWbxve2og5DM", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "5webiD4DbhJpjGjToBLXPonCCcDp5jK6KvJaG6y9LZj8RFsuxUgfeH5FLUKfZwxCkhc2qpxn9d9noyNxpwe5vhWo" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "101", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "96wiMpqdLQvBK2vTHw2ALnzKjoXeHPe9UHL8GPM6VBH3", + "voucher": { + "channelId": "96wiMpqdLQvBK2vTHw2ALnzKjoXeHPe9UHL8GPM6VBH3", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "23ed7u1sWVL67DgP2XS5S6a8QNSNDNjx46N3WrDjQcYMkdTKwJxSovjLvESREwinqaX7qFGwZiH4KhX8whvKdyrm" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "102", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "918ujLxiyqZA2WmxznvtHsEk31nDmPr6Gs8nA73oY2yn", + "voucher": { + "channelId": "918ujLxiyqZA2WmxznvtHsEk31nDmPr6Gs8nA73oY2yn", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "5M1EwT6SshyUKRhv6qKfSjk7qjjsw7rqZ1q1bjfpHnfqAUm6PUdzxMVspDQX1ptvQwjdwB4xd6xdpKJ9QC8gksdJ" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "103", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "27P2VM5swSSRGK83AqMhGNg9ZfTNVXtx74MkKevV8PpH", + "voucher": { + "channelId": "27P2VM5swSSRGK83AqMhGNg9ZfTNVXtx74MkKevV8PpH", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "2yyjqaHsdiBKKHvjR8vdqqHeQ36AFruuGdsazmDBMEbtPiXjbDqA3q6s9FyugebWpzMWResiLPcNfkUBX2onVdyQ" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "104", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "BJtkqYs9cWfuyP1x9VGsdU2bmjQYTr2sDzPE1Wq6vFXs", + "voucher": { + "channelId": "BJtkqYs9cWfuyP1x9VGsdU2bmjQYTr2sDzPE1Wq6vFXs", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "53JvbdCtBUmDgVwdPDbvwyWXMtXaZBvXR7uUsQq8EPLYtmB8HFSadt7LdhqJ2oGwS4iCcYm1WdCBu3PTU47YDR4h" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "105", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "4ANNVYxLfjNvjgR6kqD7W7waAfNGZQ3izAqrPuonvswN", + "voucher": { + "channelId": "4ANNVYxLfjNvjgR6kqD7W7waAfNGZQ3izAqrPuonvswN", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "5M3HkGtcYhugcEhwguEn3kMuk3oP1tCeL1iUKXcFjr5V2E5e2QrK48rz7eEfZK66yo44gCGEEPPCC1W3VRzkqGK9" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "106", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "4q9jEnqAMp8hvBisuXh9HuitWBHRNKthHmdJ1bhBy7pN", + "voucher": { + "channelId": "4q9jEnqAMp8hvBisuXh9HuitWBHRNKthHmdJ1bhBy7pN", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "2GiPnYGRk8fjqRf4TnpiXU3xV1HyrSfyKgQ2JXJVKK3R68ahvdfU11Frcc5HM2SeSLPrHDrZdnaXL9et1hwHvQtt" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "107", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "8F5xwzrKcgrMKLaTYGcKMZdcuDhiq7PxSGnHuWt6Md9F", + "voucher": { + "channelId": "8F5xwzrKcgrMKLaTYGcKMZdcuDhiq7PxSGnHuWt6Md9F", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "2NHpct6EYtPLcX7pvV9CG6aB3tWuW9kpn9JDqPkiHZYZvfZUaUCmqxWzYSnRg5ZNCTUzSsXcvnRMDyLaoKRUWje4" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "108", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "GUNsKpc5ybB7tj7SUF8UasuByHS7Sxs3aptt5eRicATC", + "voucher": { + "channelId": "GUNsKpc5ybB7tj7SUF8UasuByHS7Sxs3aptt5eRicATC", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "2aF1Rda2h8ecvpj6Dg99rBXd3Z1TAKtkoq8LPnwRw4UMbTYuqhVHjUn6hrPbnuzQTQiUj4VvEwTu813eu7dyzCh3" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "109", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "Fmw75DJk8fi8i6yjf3HA9oyxjz5QL6gs8SRXYV4hkxQ3", + "voucher": { + "channelId": "Fmw75DJk8fi8i6yjf3HA9oyxjz5QL6gs8SRXYV4hkxQ3", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "5LEJTzesUtMgvaY25KSUo1TAQPQeht7RBpqYRyEc1vRijHDzv2P2tCYAXKqKVU7ke8RZuMmxcpajLAXXcqWWZCqe" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "110", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "Bpd4syvg5BSByt7xXbNVSztCpgwHsCDrzSm54pm49VjQ", + "voucher": { + "channelId": "Bpd4syvg5BSByt7xXbNVSztCpgwHsCDrzSm54pm49VjQ", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "5ju5RhAzvKY9v1tub5tUR5aBcBRJjioyfeoJqXSo6WEd1ywCc1nw7tPpdAdJCjc4K4s9XFZPH9P6U2FCJH8WuDC7" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "111", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "EMJFPxSkCK8QztvKAjPniNbgevAu3Tcx8WpqDhw3zHxE", + "voucher": { + "channelId": "EMJFPxSkCK8QztvKAjPniNbgevAu3Tcx8WpqDhw3zHxE", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "57r7o5SRxtLsJr9wMj8wEhB74inVaJFwVAqEqAqY6qqqtFZmpWprUE3CdBBjiCZym6Zb6jjsZB4iL5uyNtSHod9U" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "112", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "9ZZL2NSCaoQRmKqBJjtC5AyhuongALRcpiKi8oP5fZ3t", + "voucher": { + "channelId": "9ZZL2NSCaoQRmKqBJjtC5AyhuongALRcpiKi8oP5fZ3t", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "3Dr3f4jFaMRQr8CW52yjNwsUMYekoaRXsWd93rmtsgo5Q7kGFKsEt5bLKDdjw53LS9G2SeCvVtbJKnyFdGxgHe4H" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "113", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "3bqqR4WnvtTMJxbChKYJHTktHyakzyUvYZbDEytT8umV", + "voucher": { + "channelId": "3bqqR4WnvtTMJxbChKYJHTktHyakzyUvYZbDEytT8umV", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "3GULYmEqbBEXVNVPvhUAnKG9MHon55ktkBAGCixUSLwKdoKP1CMDRtWiCyXN963LHzmBQ4V4nxUWfJGPQgYoq8qi" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "114", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "AzABWhvJfRpZu9cPfoAGkfSgA7n6CLN7L1Tsz4kSsPtA", + "voucher": { + "channelId": "AzABWhvJfRpZu9cPfoAGkfSgA7n6CLN7L1Tsz4kSsPtA", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "2CW2iPoeJx3EdeEgJ68bREhKhVRfGcyrbsQ9LWWoKM4sSLSF2Gm3y7BK2CaGRy9hX58QD7Rdi1pUM9Zv6sX24vQR" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "115", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "6GwxXVRNTRG1rMnvCs4Agy5Tw24Ag7JnPgZo5zDP6acv", + "voucher": { + "channelId": "6GwxXVRNTRG1rMnvCs4Agy5Tw24Ag7JnPgZo5zDP6acv", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "37HNwRRV62mnVBg1X3F7T4pumj1B74i5Tz8YzXjvwEy6oU6ccxiawySDNi8Ezz9cCTyyZHkWJ7J4beaXhC6JKYbt" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "116", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "BhgXfPYvNtMZFhrKF3MpatXjVMM9KmppZgBugyfVWsmY", + "voucher": { + "channelId": "BhgXfPYvNtMZFhrKF3MpatXjVMM9KmppZgBugyfVWsmY", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "5CzWp2MfYojT83Tu19vdpY6MuTFW9g5Vpha25N8u1Rw561xADeaoRcEK6fevHbo35ybACn3iT9xXf7xqRuiKKwSw" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "117", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "F2cTdjHc7JAfCogJzxiz2YiTsvtG4k55qvLewHRP6wvW", + "voucher": { + "channelId": "F2cTdjHc7JAfCogJzxiz2YiTsvtG4k55qvLewHRP6wvW", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "2KpMKJ4doNJrtVkkRmxFTrn7BUGcRX8a2F5oSX5pN2GfUUWW9XNueUdycYMLMoi9tYopn1iqnQfJ77oQzCqPsquM" + } + } + ], + "type": "claim" + } + } + }, + "intent": "x402-batch-settlement", + "mode": "canonical-bytes", + "provenance": "generated", + "requirements": [ + "X402-76654742e7" + ], + "role": "both", + "spec": { + "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", + "quote": "`claims[]` MUST contain at least one entry and at most `extra.maxClaimChannels` entries, or four when the facilitator advertises no `maxClaimChannels`, so the instruction pairs fit in one transaction without address lookup tables.", + "section": "4.5 Facilitator Interface" + }, + "tier": "offline" + }, + { + "bugType": "wire", + "description": "Nineteen claims exceed what fits one version-1 transaction, so no facilitator can advertise that capacity: the payload is malformed for every facilitator.", + "expect": { + "outcome": "reject", + "rejectCode": "invalid-payload" + }, + "id": "batch-wire-redemption-claim-nineteen-entries-reject", + "input": { + "batchWire": { + "shape": "redemption", + "value": { + "claims": [ + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "100", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "Br4wUi9TpNTB7wL9BXoCqKAaHhLVAiiiaWbxve2og5DM", + "voucher": { + "channelId": "Br4wUi9TpNTB7wL9BXoCqKAaHhLVAiiiaWbxve2og5DM", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "5webiD4DbhJpjGjToBLXPonCCcDp5jK6KvJaG6y9LZj8RFsuxUgfeH5FLUKfZwxCkhc2qpxn9d9noyNxpwe5vhWo" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "101", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "96wiMpqdLQvBK2vTHw2ALnzKjoXeHPe9UHL8GPM6VBH3", + "voucher": { + "channelId": "96wiMpqdLQvBK2vTHw2ALnzKjoXeHPe9UHL8GPM6VBH3", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "23ed7u1sWVL67DgP2XS5S6a8QNSNDNjx46N3WrDjQcYMkdTKwJxSovjLvESREwinqaX7qFGwZiH4KhX8whvKdyrm" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "102", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "918ujLxiyqZA2WmxznvtHsEk31nDmPr6Gs8nA73oY2yn", + "voucher": { + "channelId": "918ujLxiyqZA2WmxznvtHsEk31nDmPr6Gs8nA73oY2yn", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "5M1EwT6SshyUKRhv6qKfSjk7qjjsw7rqZ1q1bjfpHnfqAUm6PUdzxMVspDQX1ptvQwjdwB4xd6xdpKJ9QC8gksdJ" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "103", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "27P2VM5swSSRGK83AqMhGNg9ZfTNVXtx74MkKevV8PpH", + "voucher": { + "channelId": "27P2VM5swSSRGK83AqMhGNg9ZfTNVXtx74MkKevV8PpH", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "2yyjqaHsdiBKKHvjR8vdqqHeQ36AFruuGdsazmDBMEbtPiXjbDqA3q6s9FyugebWpzMWResiLPcNfkUBX2onVdyQ" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "104", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "BJtkqYs9cWfuyP1x9VGsdU2bmjQYTr2sDzPE1Wq6vFXs", + "voucher": { + "channelId": "BJtkqYs9cWfuyP1x9VGsdU2bmjQYTr2sDzPE1Wq6vFXs", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "53JvbdCtBUmDgVwdPDbvwyWXMtXaZBvXR7uUsQq8EPLYtmB8HFSadt7LdhqJ2oGwS4iCcYm1WdCBu3PTU47YDR4h" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "105", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "4ANNVYxLfjNvjgR6kqD7W7waAfNGZQ3izAqrPuonvswN", + "voucher": { + "channelId": "4ANNVYxLfjNvjgR6kqD7W7waAfNGZQ3izAqrPuonvswN", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "5M3HkGtcYhugcEhwguEn3kMuk3oP1tCeL1iUKXcFjr5V2E5e2QrK48rz7eEfZK66yo44gCGEEPPCC1W3VRzkqGK9" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "106", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "4q9jEnqAMp8hvBisuXh9HuitWBHRNKthHmdJ1bhBy7pN", + "voucher": { + "channelId": "4q9jEnqAMp8hvBisuXh9HuitWBHRNKthHmdJ1bhBy7pN", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "2GiPnYGRk8fjqRf4TnpiXU3xV1HyrSfyKgQ2JXJVKK3R68ahvdfU11Frcc5HM2SeSLPrHDrZdnaXL9et1hwHvQtt" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "107", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "8F5xwzrKcgrMKLaTYGcKMZdcuDhiq7PxSGnHuWt6Md9F", + "voucher": { + "channelId": "8F5xwzrKcgrMKLaTYGcKMZdcuDhiq7PxSGnHuWt6Md9F", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "2NHpct6EYtPLcX7pvV9CG6aB3tWuW9kpn9JDqPkiHZYZvfZUaUCmqxWzYSnRg5ZNCTUzSsXcvnRMDyLaoKRUWje4" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "108", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "GUNsKpc5ybB7tj7SUF8UasuByHS7Sxs3aptt5eRicATC", + "voucher": { + "channelId": "GUNsKpc5ybB7tj7SUF8UasuByHS7Sxs3aptt5eRicATC", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "2aF1Rda2h8ecvpj6Dg99rBXd3Z1TAKtkoq8LPnwRw4UMbTYuqhVHjUn6hrPbnuzQTQiUj4VvEwTu813eu7dyzCh3" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "109", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "Fmw75DJk8fi8i6yjf3HA9oyxjz5QL6gs8SRXYV4hkxQ3", + "voucher": { + "channelId": "Fmw75DJk8fi8i6yjf3HA9oyxjz5QL6gs8SRXYV4hkxQ3", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "5LEJTzesUtMgvaY25KSUo1TAQPQeht7RBpqYRyEc1vRijHDzv2P2tCYAXKqKVU7ke8RZuMmxcpajLAXXcqWWZCqe" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "110", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "Bpd4syvg5BSByt7xXbNVSztCpgwHsCDrzSm54pm49VjQ", + "voucher": { + "channelId": "Bpd4syvg5BSByt7xXbNVSztCpgwHsCDrzSm54pm49VjQ", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "5ju5RhAzvKY9v1tub5tUR5aBcBRJjioyfeoJqXSo6WEd1ywCc1nw7tPpdAdJCjc4K4s9XFZPH9P6U2FCJH8WuDC7" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "111", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "EMJFPxSkCK8QztvKAjPniNbgevAu3Tcx8WpqDhw3zHxE", + "voucher": { + "channelId": "EMJFPxSkCK8QztvKAjPniNbgevAu3Tcx8WpqDhw3zHxE", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "57r7o5SRxtLsJr9wMj8wEhB74inVaJFwVAqEqAqY6qqqtFZmpWprUE3CdBBjiCZym6Zb6jjsZB4iL5uyNtSHod9U" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "112", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "9ZZL2NSCaoQRmKqBJjtC5AyhuongALRcpiKi8oP5fZ3t", + "voucher": { + "channelId": "9ZZL2NSCaoQRmKqBJjtC5AyhuongALRcpiKi8oP5fZ3t", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "3Dr3f4jFaMRQr8CW52yjNwsUMYekoaRXsWd93rmtsgo5Q7kGFKsEt5bLKDdjw53LS9G2SeCvVtbJKnyFdGxgHe4H" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "113", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "3bqqR4WnvtTMJxbChKYJHTktHyakzyUvYZbDEytT8umV", + "voucher": { + "channelId": "3bqqR4WnvtTMJxbChKYJHTktHyakzyUvYZbDEytT8umV", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "3GULYmEqbBEXVNVPvhUAnKG9MHon55ktkBAGCixUSLwKdoKP1CMDRtWiCyXN963LHzmBQ4V4nxUWfJGPQgYoq8qi" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "114", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "AzABWhvJfRpZu9cPfoAGkfSgA7n6CLN7L1Tsz4kSsPtA", + "voucher": { + "channelId": "AzABWhvJfRpZu9cPfoAGkfSgA7n6CLN7L1Tsz4kSsPtA", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "2CW2iPoeJx3EdeEgJ68bREhKhVRfGcyrbsQ9LWWoKM4sSLSF2Gm3y7BK2CaGRy9hX58QD7Rdi1pUM9Zv6sX24vQR" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "115", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "6GwxXVRNTRG1rMnvCs4Agy5Tw24Ag7JnPgZo5zDP6acv", + "voucher": { + "channelId": "6GwxXVRNTRG1rMnvCs4Agy5Tw24Ag7JnPgZo5zDP6acv", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "37HNwRRV62mnVBg1X3F7T4pumj1B74i5Tz8YzXjvwEy6oU6ccxiawySDNi8Ezz9cCTyyZHkWJ7J4beaXhC6JKYbt" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "116", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "BhgXfPYvNtMZFhrKF3MpatXjVMM9KmppZgBugyfVWsmY", + "voucher": { + "channelId": "BhgXfPYvNtMZFhrKF3MpatXjVMM9KmppZgBugyfVWsmY", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "5CzWp2MfYojT83Tu19vdpY6MuTFW9g5Vpha25N8u1Rw561xADeaoRcEK6fevHbo35ybACn3iT9xXf7xqRuiKKwSw" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "117", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "F2cTdjHc7JAfCogJzxiz2YiTsvtG4k55qvLewHRP6wvW", + "voucher": { + "channelId": "F2cTdjHc7JAfCogJzxiz2YiTsvtG4k55qvLewHRP6wvW", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "2KpMKJ4doNJrtVkkRmxFTrn7BUGcRX8a2F5oSX5pN2GfUUWW9XNueUdycYMLMoi9tYopn1iqnQfJ77oQzCqPsquM" + } + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "118", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "CutmAqgrNnmJq5uptvRKB691MVM1eWSLJX7ThpUi9iSp", + "voucher": { + "channelId": "CutmAqgrNnmJq5uptvRKB691MVM1eWSLJX7ThpUi9iSp", + "expiresAt": 0, + "maxClaimableAmount": "1000", + "signature": "2YSMAb1267LSdqmqEwKrucL5Tpcpcgg43cpjJy8qL8BwKZwcwQDLqCsdowxXavMgDjsb4favobzMpqfPQrxLxYpV" + } + } + ], + "type": "claim" + } + } + }, + "intent": "x402-batch-settlement", + "mode": "canonical-bytes", + "provenance": "authored", + "requirements": [ + "X402-76654742e7" + ], + "role": "both", + "spec": { + "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", + "quote": "`claims[]` MUST contain at least one entry and at most `extra.maxClaimChannels` entries, or four when the facilitator advertises no `maxClaimChannels`, so the instruction pairs fit in one transaction without address lookup tables.", + "section": "4.5 Facilitator Interface" + }, + "tier": "offline" + }, + { + "bugType": "wire", + "description": "A claim entry without its channelConfig cannot be derived or validated.", + "expect": { + "outcome": "reject", + "rejectCode": "invalid-payload" + }, + "id": "batch-wire-redemption-claim-entry-without-config-reject", + "input": { + "batchWire": { + "shape": "redemption", + "value": { + "claims": [ + { + "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ", + "voucher": { + "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ", + "expiresAt": 0, + "maxClaimableAmount": "5000", + "signature": "pJgs3Kk5XkcdbKcwd6y1AupQ3ncgPtFMkS6WSCNfDt4FvgbRe8HCabuFNPHroAmE8VCvsWKgHJxWjDwAtESXmQ2" + } + } + ], + "type": "claim" + } + } + }, + "intent": "x402-batch-settlement", + "mode": "canonical-bytes", + "provenance": "generated", + "requirements": [ + "X402-76654742e7" + ], + "role": "both", + "spec": { + "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", + "quote": "| Claim | `claims[].channelConfig` | `ChannelConfig` | Full channel configuration. |", + "section": "4.5 Facilitator Interface" + }, + "tier": "offline" + }, + { + "bugType": "wire", + "description": "settle payload: channels[] of {channelId, channelConfig}.", + "expect": { + "exactBytes": { + "base64Url": "eyJjaGFubmVscyI6W3siY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImNoYW5uZWxJZCI6IkhqZzJQRGdMeFlEaVFXUkhySmVlWTlWOWlOeWViTTlNV3V0b0E2N2VpdnNaIn1dLCJ0eXBlIjoic2V0dGxlIn0", + "canonicalJson": "{\"channels\":[{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"42\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ\"}],\"type\":\"settle\"}" + }, + "outcome": "accept" + }, + "id": "batch-wire-redemption-settle-frozen", + "input": { + "batchWire": { + "shape": "redemption", + "value": { + "channels": [ + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "42", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ" + } + ], + "type": "settle" + } + } + }, + "intent": "x402-batch-settlement", + "mode": "canonical-bytes", + "provenance": "generated", + "requirements": [ + "X402-c2ca42b7a4" + ], + "role": "both", + "spec": { + "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", + "quote": "`channels[]` MUST contain at least one entry and at most `extra.maxSettleChannels` entries, or four when the facilitator advertises no `maxSettleChannels`.", + "section": "4.5 Facilitator Interface" + }, + "tier": "offline" + }, + { + "bugType": "wire", + "description": "Thirteen settle channels, the version-1 capacity (extra.maxSettleChannels 13): the payload parses.", + "expect": { + "exactBytes": { + "base64Url": "eyJjaGFubmVscyI6W3siY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjAwIiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiJDS2tzUHlMazRDaWV3UG83YTNYZVNMVDY3c1J3c253WGc3OVJycFNzMktQdyJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjAxIiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiI2Q0pBdWRBTGcycEVmdU5VODZ3YmV3Vm1TUTFTYmJxZ3hBYkt5dXlvcW9aWiJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjAyIiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiI1c1BOSllaYzVkam45UHQ3czJmWGp3em1OUkNWVHJTdGZVbnltaFQxd25KZCJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjAzIiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiI3d3lHQXU4VVhRYXA4V2hqVVA3ajNwVFRRMzcxTmJkVDZxTVVQdGV6c1phNyJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjA0IiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiIzN2o4eHppYjd2enFjdVo5MmlQUTZlNGI3OHRuOWttNzdDZTJCZXA1NmZENCJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjA1IiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiIzRUNWN1E3ZUF0bVhIOU5CSzRLaU44RUtvZ2tZV2E0SG1Wck1rcGJaajZyaiJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjA2IiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiJBcEFjbmRja0I3Ukh5M0g2dFJVUzR2QnlVb3VDVkthZXZVcXpHZFZVdUdGZiJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjA3IiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiJIR0FOblJEVGVHQ1A3YWRmZFByc2hxUlBwWTREcnVKbU5XMWVkWlZtTDE5QSJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjA4IiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiJHdDRNVlVDRzM5M0VRM3JnNFBxYk5YTjQ4OHNFdGVaSEVIOFQ5aVNmejVieiJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjA5IiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiJGdHY2SnFQamtMcWtyWXZMc1ViS1JONW9oRGRDM0FGUzlGeWNQV2I0YnhmbSJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjEwIiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiJFb3FmTEFCZDFQemN2MUc0Tm5tWGt4QUxXUGVxUXc3Y2FUTHI1a1Y3UTQ4ZyJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjExIiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiJFNXRBS3g4WHNmN1U4ZXpZeUdlMWZINjNrNnFpRm5yemdlUG0zZDZYelBlbyJ9LHsiY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiMjEyIiwidG9rZW4iOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsIndpdGhkcmF3RGVsYXkiOjM2MDB9LCJjaGFubmVsSWQiOiIydzRtTGFFM2VYTEtwNDZGWldBUXZxYjJpVWdIQldOODg5QnhKcWE3YXFhUyJ9XSwidHlwZSI6InNldHRsZSJ9", + "canonicalJson": "{\"channels\":[{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"200\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"CKksPyLk4CiewPo7a3XeSLT67sRwsnwXg79RrpSs2KPw\"},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"201\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"6CJAudALg2pEfuNU86wbewVmSQ1SbbqgxAbKyuyoqoZZ\"},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"202\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"5sPNJYZc5djn9Pt7s2fXjwzmNRCVTrStfUnymhT1wnJd\"},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"203\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"7wyGAu8UXQap8WhjUP7j3pTTQ371NbdT6qMUPtezsZa7\"},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"204\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"37j8xzib7vzqcuZ92iPQ6e4b78tn9km77Ce2Bep56fD4\"},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"205\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"3ECV7Q7eAtmXH9NBK4KiN8EKogkYWa4HmVrMkpbZj6rj\"},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"206\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"ApAcndckB7RHy3H6tRUS4vByUouCVKaevUqzGdVUuGFf\"},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"207\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"HGANnRDTeGCP7adfdPrshqRPpY4DruJmNW1edZVmL19A\"},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"208\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"Gt4MVUCG393EQ3rg4PqbNXN488sEteZHEH8T9iSfz5bz\"},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"209\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"Ftv6JqPjkLqkrYvLsUbKRN5ohDdC3AFS9FycPWb4bxfm\"},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"210\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"EoqfLABd1Pzcv1G4NnmXkxALWPeqQw7caTLr5kV7Q48g\"},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"211\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"E5tAKx8Xsf7U8ezYyGe1fH63k6qiFnrzgePm3d6XzPeo\"},{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"212\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"2w4mLaE3eXLKp46FZWAQvqb2iUgHBWN889BxJqa7aqaS\"}],\"type\":\"settle\"}" + }, + "outcome": "accept" + }, + "id": "batch-wire-redemption-settle-thirteen-channels", + "input": { + "batchWire": { + "shape": "redemption", + "value": { + "channels": [ + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "200", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "CKksPyLk4CiewPo7a3XeSLT67sRwsnwXg79RrpSs2KPw" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "201", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "6CJAudALg2pEfuNU86wbewVmSQ1SbbqgxAbKyuyoqoZZ" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "202", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "5sPNJYZc5djn9Pt7s2fXjwzmNRCVTrStfUnymhT1wnJd" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "203", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "7wyGAu8UXQap8WhjUP7j3pTTQ371NbdT6qMUPtezsZa7" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "204", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "37j8xzib7vzqcuZ92iPQ6e4b78tn9km77Ce2Bep56fD4" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "205", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "3ECV7Q7eAtmXH9NBK4KiN8EKogkYWa4HmVrMkpbZj6rj" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "206", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "ApAcndckB7RHy3H6tRUS4vByUouCVKaevUqzGdVUuGFf" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "207", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "HGANnRDTeGCP7adfdPrshqRPpY4DruJmNW1edZVmL19A" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "208", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "Gt4MVUCG393EQ3rg4PqbNXN488sEteZHEH8T9iSfz5bz" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "209", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "Ftv6JqPjkLqkrYvLsUbKRN5ohDdC3AFS9FycPWb4bxfm" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "210", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "EoqfLABd1Pzcv1G4NnmXkxALWPeqQw7caTLr5kV7Q48g" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "211", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "E5tAKx8Xsf7U8ezYyGe1fH63k6qiFnrzgePm3d6XzPeo" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "212", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "2w4mLaE3eXLKp46FZWAQvqb2iUgHBWN889BxJqa7aqaS" + } + ], + "type": "settle" + } + } + }, + "intent": "x402-batch-settlement", + "mode": "canonical-bytes", + "provenance": "generated", + "requirements": [ + "X402-c2ca42b7a4" + ], + "role": "both", + "spec": { + "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", + "quote": "`channels[]` MUST contain at least one entry and at most `extra.maxSettleChannels` entries, or four when the facilitator advertises no `maxSettleChannels`.", + "section": "4.5 Facilitator Interface" + }, + "tier": "offline" + }, + { + "bugType": "wire", + "description": "Fourteen settle channels exceed the largest capacity a facilitator may advertise (13): the payload is malformed for every facilitator.", "expect": { "outcome": "reject", "rejectCode": "invalid-payload" }, - "id": "batch-wire-redemption-claim-five-entries-reject", + "id": "batch-wire-redemption-settle-fourteen-channels-reject", "input": { "batchWire": { "shape": "redemption", "value": { - "claims": [ + "channels": [ { "channelConfig": { "openSlot": 341000000, @@ -707,17 +1770,11 @@ "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", - "salt": "100", + "salt": "200", "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "withdrawDelay": 3600 }, - "channelId": "Br4wUi9TpNTB7wL9BXoCqKAaHhLVAiiiaWbxve2og5DM", - "voucher": { - "channelId": "Br4wUi9TpNTB7wL9BXoCqKAaHhLVAiiiaWbxve2og5DM", - "expiresAt": 0, - "maxClaimableAmount": "1000", - "signature": "5webiD4DbhJpjGjToBLXPonCCcDp5jK6KvJaG6y9LZj8RFsuxUgfeH5FLUKfZwxCkhc2qpxn9d9noyNxpwe5vhWo" - } + "channelId": "CKksPyLk4CiewPo7a3XeSLT67sRwsnwXg79RrpSs2KPw" }, { "channelConfig": { @@ -726,17 +1783,11 @@ "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", - "salt": "101", + "salt": "201", "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "withdrawDelay": 3600 }, - "channelId": "96wiMpqdLQvBK2vTHw2ALnzKjoXeHPe9UHL8GPM6VBH3", - "voucher": { - "channelId": "96wiMpqdLQvBK2vTHw2ALnzKjoXeHPe9UHL8GPM6VBH3", - "expiresAt": 0, - "maxClaimableAmount": "1000", - "signature": "23ed7u1sWVL67DgP2XS5S6a8QNSNDNjx46N3WrDjQcYMkdTKwJxSovjLvESREwinqaX7qFGwZiH4KhX8whvKdyrm" - } + "channelId": "6CJAudALg2pEfuNU86wbewVmSQ1SbbqgxAbKyuyoqoZZ" }, { "channelConfig": { @@ -745,17 +1796,11 @@ "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", - "salt": "102", + "salt": "202", "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "withdrawDelay": 3600 }, - "channelId": "918ujLxiyqZA2WmxznvtHsEk31nDmPr6Gs8nA73oY2yn", - "voucher": { - "channelId": "918ujLxiyqZA2WmxznvtHsEk31nDmPr6Gs8nA73oY2yn", - "expiresAt": 0, - "maxClaimableAmount": "1000", - "signature": "5M1EwT6SshyUKRhv6qKfSjk7qjjsw7rqZ1q1bjfpHnfqAUm6PUdzxMVspDQX1ptvQwjdwB4xd6xdpKJ9QC8gksdJ" - } + "channelId": "5sPNJYZc5djn9Pt7s2fXjwzmNRCVTrStfUnymhT1wnJd" }, { "channelConfig": { @@ -764,17 +1809,11 @@ "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", - "salt": "103", + "salt": "203", "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "withdrawDelay": 3600 }, - "channelId": "27P2VM5swSSRGK83AqMhGNg9ZfTNVXtx74MkKevV8PpH", - "voucher": { - "channelId": "27P2VM5swSSRGK83AqMhGNg9ZfTNVXtx74MkKevV8PpH", - "expiresAt": 0, - "maxClaimableAmount": "1000", - "signature": "2yyjqaHsdiBKKHvjR8vdqqHeQ36AFruuGdsazmDBMEbtPiXjbDqA3q6s9FyugebWpzMWResiLPcNfkUBX2onVdyQ" - } + "channelId": "7wyGAu8UXQap8WhjUP7j3pTTQ371NbdT6qMUPtezsZa7" }, { "channelConfig": { @@ -783,94 +1822,25 @@ "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", - "salt": "104", + "salt": "204", "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "withdrawDelay": 3600 }, - "channelId": "BJtkqYs9cWfuyP1x9VGsdU2bmjQYTr2sDzPE1Wq6vFXs", - "voucher": { - "channelId": "BJtkqYs9cWfuyP1x9VGsdU2bmjQYTr2sDzPE1Wq6vFXs", - "expiresAt": 0, - "maxClaimableAmount": "1000", - "signature": "53JvbdCtBUmDgVwdPDbvwyWXMtXaZBvXR7uUsQq8EPLYtmB8HFSadt7LdhqJ2oGwS4iCcYm1WdCBu3PTU47YDR4h" - } - } - ], - "type": "claim" - } - } - }, - "intent": "x402-batch-settlement", - "mode": "canonical-bytes", - "provenance": "authored", - "requirements": [ - "X402-7f4ee54a73" - ], - "role": "both", - "spec": { - "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", - "quote": "`claims[]` MUST contain between one and four entries so the instruction pairs fit in a legacy Solana transaction without address lookup tables.", - "section": "4.5 Facilitator Interface" - }, - "tier": "offline" - }, - { - "bugType": "wire", - "description": "A claim entry without its channelConfig cannot be derived or validated.", - "expect": { - "outcome": "reject", - "rejectCode": "invalid-payload" - }, - "id": "batch-wire-redemption-claim-entry-without-config-reject", - "input": { - "batchWire": { - "shape": "redemption", - "value": { - "claims": [ + "channelId": "37j8xzib7vzqcuZ92iPQ6e4b78tn9km77Ce2Bep56fD4" + }, { - "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ", - "voucher": { - "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ", - "expiresAt": 0, - "maxClaimableAmount": "5000", - "signature": "pJgs3Kk5XkcdbKcwd6y1AupQ3ncgPtFMkS6WSCNfDt4FvgbRe8HCabuFNPHroAmE8VCvsWKgHJxWjDwAtESXmQ2" - } - } - ], - "type": "claim" - } - } - }, - "intent": "x402-batch-settlement", - "mode": "canonical-bytes", - "provenance": "generated", - "requirements": [ - "X402-7f4ee54a73" - ], - "role": "both", - "spec": { - "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", - "quote": "| Claim | `claims[].channelConfig` | `ChannelConfig` | Full channel configuration. |", - "section": "4.5 Facilitator Interface" - }, - "tier": "offline" - }, - { - "bugType": "wire", - "description": "settle payload: channels[] of {channelId, channelConfig}.", - "expect": { - "exactBytes": { - "base64Url": "eyJjaGFubmVscyI6W3siY2hhbm5lbENvbmZpZyI6eyJvcGVuU2xvdCI6MzQxMDAwMDAwLCJwYXllciI6IkdtYURycHBCQzdQNUFSS1Y4ZzNkaml3UDg5dnoxakxLMjNWMkdCanVBRUdCIiwicGF5ZXJBdXRob3JpemVyIjoiR21hRHJwcEJDN1A1QVJLVjhnM2RqaXdQODl2ejFqTEsyM1YyR0JqdUFFR0IiLCJyZWNlaXZlciI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwicmVjZWl2ZXJBdXRob3JpemVyIjoiQW9Wc0dhajhNU0o2eHdLeGZGeG85aVpXSDNlbkM4UlJUWEtIMmZ4MkY4b3MiLCJzYWx0IjoiNDIiLCJ0b2tlbiI6IjR6TU1DOXNydDVSaTVYMTRHQWdYaGFIaWkzR25QQUVFUllQSmdaSkRuY0RVIiwid2l0aGRyYXdEZWxheSI6MzYwMH0sImNoYW5uZWxJZCI6IkhqZzJQRGdMeFlEaVFXUkhySmVlWTlWOWlOeWViTTlNV3V0b0E2N2VpdnNaIn1dLCJ0eXBlIjoic2V0dGxlIn0", - "canonicalJson": "{\"channels\":[{\"channelConfig\":{\"openSlot\":341000000,\"payer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"payerAuthorizer\":\"GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB\",\"receiver\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"salt\":\"42\",\"token\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"withdrawDelay\":3600},\"channelId\":\"Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ\"}],\"type\":\"settle\"}" - }, - "outcome": "accept" - }, - "id": "batch-wire-redemption-settle-frozen", - "input": { - "batchWire": { - "shape": "redemption", - "value": { - "channels": [ + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "205", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "3ECV7Q7eAtmXH9NBK4KiN8EKogkYWa4HmVrMkpbZj6rj" + }, { "channelConfig": { "openSlot": 341000000, @@ -878,11 +1848,102 @@ "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", - "salt": "42", + "salt": "206", "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "withdrawDelay": 3600 }, - "channelId": "Hjg2PDgLxYDiQWRHrJeeY9V9iNyebM9MWutoA67eivsZ" + "channelId": "ApAcndckB7RHy3H6tRUS4vByUouCVKaevUqzGdVUuGFf" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "207", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "HGANnRDTeGCP7adfdPrshqRPpY4DruJmNW1edZVmL19A" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "208", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "Gt4MVUCG393EQ3rg4PqbNXN488sEteZHEH8T9iSfz5bz" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "209", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "Ftv6JqPjkLqkrYvLsUbKRN5ohDdC3AFS9FycPWb4bxfm" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "210", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "EoqfLABd1Pzcv1G4NnmXkxALWPeqQw7caTLr5kV7Q48g" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "211", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "E5tAKx8Xsf7U8ezYyGe1fH63k6qiFnrzgePm3d6XzPeo" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "212", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "2w4mLaE3eXLKp46FZWAQvqb2iUgHBWN889BxJqa7aqaS" + }, + { + "channelConfig": { + "openSlot": 341000000, + "payer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "payerAuthorizer": "GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB", + "receiver": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "salt": "213", + "token": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "withdrawDelay": 3600 + }, + "channelId": "C9s2aCByGGsp78EWjAqDirgZdKpcXPtQPGcjotGMKXCB" } ], "type": "settle" @@ -891,14 +1952,14 @@ }, "intent": "x402-batch-settlement", "mode": "canonical-bytes", - "provenance": "generated", + "provenance": "authored", "requirements": [ - "X402-7f4ee54a73" + "X402-c2ca42b7a4" ], "role": "both", "spec": { "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", - "quote": "`channels[]` MUST contain between one and four entries, the same transaction-size bound as `claims[]`.", + "quote": "`channels[]` MUST contain at least one entry and at most `extra.maxSettleChannels` entries, or four when the facilitator advertises no `maxSettleChannels`.", "section": "4.5 Facilitator Interface" }, "tier": "offline" @@ -1073,8 +2134,8 @@ "description": "Requirements of a route whose facilitator accepts versions 0 and 1 carry extra.transactionVersions [0, 1].", "expect": { "exactBytes": { - "base64Url": "eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0", - "canonicalJson": "{\"amount\":\"1000\",\"asset\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"extra\":{\"feePayer\":\"J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf\",\"memo\":\"invoice-42\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"tokenProgram\":\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\"transactionVersions\":[0,1],\"withdrawDelay\":3600},\"maxTimeoutSeconds\":300,\"network\":\"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\",\"payTo\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"scheme\":\"batch-settlement\"}" + "base64Url": "eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0", + "canonicalJson": "{\"amount\":\"1000\",\"asset\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"extra\":{\"feePayer\":\"J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf\",\"maxClaimChannels\":18,\"maxSettleChannels\":13,\"memo\":\"invoice-42\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"tokenProgram\":\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\"transactionVersions\":[0,1],\"withdrawDelay\":3600},\"maxTimeoutSeconds\":300,\"network\":\"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\",\"payTo\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"scheme\":\"batch-settlement\"}" }, "outcome": "accept" }, @@ -1087,6 +2148,8 @@ "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "extra": { "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, "memo": "invoice-42", "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", @@ -1117,6 +2180,57 @@ }, "tier": "offline" }, + { + "bugType": "wire", + "description": "Requirements of a route whose facilitator builds redemptions as version 1 carry its capacity, extra.maxClaimChannels 18 and extra.maxSettleChannels 13, copied from /supported; the SDK's requirements type keeps both.", + "expect": { + "exactBytes": { + "base64Url": "eyJhbW91bnQiOiIxMDAwIiwiYXNzZXQiOiI0ek1NQzlzcnQ1Umk1WDE0R0FnWGhhSGlpM0duUEFFRVJZUEpnWkpEbmNEVSIsImV4dHJhIjp7ImZlZVBheWVyIjoiSjJ4Y2NSdHVHNDNkckVTTFl6bkhoTGhRa0xUZGZlcGNLWWJpUTlCc0pWYWYiLCJtYXhDbGFpbUNoYW5uZWxzIjoxOCwibWF4U2V0dGxlQ2hhbm5lbHMiOjEzLCJtZW1vIjoiaW52b2ljZS00MiIsInJlY2VpdmVyQXV0aG9yaXplciI6IkFvVnNHYWo4TVNKNnh3S3hmRnhvOWlaV0gzZW5DOFJSVFhLSDJmeDJGOG9zIiwidG9rZW5Qcm9ncmFtIjoiVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQSIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdLCJ3aXRoZHJhd0RlbGF5IjozNjAwfSwibWF4VGltZW91dFNlY29uZHMiOjMwMCwibmV0d29yayI6InNvbGFuYTpFdFdUUkFCWmFZcTZpTWZlWUtvdVJ1MTY2VlUyeHFhMSIsInBheVRvIjoiQ1hockZaSkxLcWp6bVAzc2pZTGNGNGRUZVhXS0N5OWUyU1hYWjJZbzZNUFkiLCJzY2hlbWUiOiJiYXRjaC1zZXR0bGVtZW50In0", + "canonicalJson": "{\"amount\":\"1000\",\"asset\":\"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\"extra\":{\"feePayer\":\"J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf\",\"maxClaimChannels\":18,\"maxSettleChannels\":13,\"memo\":\"invoice-42\",\"receiverAuthorizer\":\"AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os\",\"tokenProgram\":\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\"transactionVersions\":[0,1],\"withdrawDelay\":3600},\"maxTimeoutSeconds\":300,\"network\":\"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\",\"payTo\":\"CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY\",\"scheme\":\"batch-settlement\"}" + }, + "outcome": "accept" + }, + "id": "batch-wire-requirements-redemption-capacity", + "input": { + "batchWire": { + "shape": "requirements", + "value": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "maxClaimChannels": 18, + "maxSettleChannels": 13, + "memo": "invoice-42", + "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", + "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "transactionVersions": [ + 0, + 1 + ], + "withdrawDelay": 3600 + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "batch-settlement" + } + } + }, + "intent": "x402-batch-settlement", + "mode": "canonical-bytes", + "provenance": "generated", + "requirements": [ + "X402-8f57677e36" + ], + "role": "both", + "spec": { + "doc": "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", + "quote": "The server MUST copy `feePayer`, `transactionVersions`, `maxClaimChannels`, `maxSettleChannels`, and `maxIdleSecs` into `PaymentRequirements.extra`", + "section": "GET /supported" + }, + "tier": "offline" + }, { "bugType": "wire", "description": "extra.transactionVersions [0, 2]: 2 is not a transaction message version.", @@ -1158,7 +2272,7 @@ "role": "both", "spec": { "doc": "x402-txv1/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md", - "quote": "Entries are the integers `0` and `1`, the Wallet Standard `supportedTransactionVersions` vocabulary.", + "quote": "Entries MUST be the JSON integers `0` and `1` only.", "section": "Transaction versions" }, "tier": "offline" diff --git a/harness/vectors/x402-tx-versions.json b/harness/vectors/x402-tx-versions.json index a027dfbbe..e2e8aef1b 100644 --- a/harness/vectors/x402-tx-versions.json +++ b/harness/vectors/x402-tx-versions.json @@ -936,6 +936,239 @@ }, "tier": "offline" }, + { + "bugType": "defaults", + "description": "extra.transactionVersions [2, 1, 0]: version 2 is not a defined entry, so the whole field is invalid and the client fails with unsupported_transaction_version instead of building version 1 from the entries it knows. The build judge verifies the header with a Rust sponsor accepting the offer's versions and compares the message version and header config with the kit's build.", + "expect": { + "outcome": "reject", + "rejectCode": "unsupported-version", + "rejectReason": "unsupported_transaction_version: invalid entry 2" + }, + "id": "x402-build-unknown-entry-reject", + "input": { + "rpcFixtures": { + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "11111111111111111111111111111111" + }, + "signerSecretKey": [ + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 234, + 74, + 108, + 99, + 226, + 156, + 82, + 10, + 190, + 245, + 80, + 123, + 19, + 46, + 197, + 249, + 149, + 71, + 118, + 174, + 190, + 190, + 123, + 146, + 66, + 30, + 234, + 105, + 20, + 70, + 210, + 44 + ], + "x402Offer": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", + "transactionVersions": [ + 2, + 1, + 0 + ] + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "exact" + }, + "x402Version": 2 + }, + "intent": "x402-exact", + "mode": "build-transaction", + "provenance": "authored", + "requirements": [ + "X402TX-927d17b62e" + ], + "role": "client", + "spec": { + "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", + "quote": "A client or server MUST treat a field containing any non-integer entry (a string, null, or \"legacy\") or any integer other than 0 or 1 as invalid and fail closed with unsupported_transaction_version.", + "section": "1.5 Transaction Versions (MUST)" + }, + "tier": "offline" + }, + { + "bugType": "defaults", + "description": "extra.transactionVersions [\"1\", 0]: a stringified version is not a valid entry, so the client fails with unsupported_transaction_version rather than reading it as 1 or skipping it. The build judge verifies the header with a Rust sponsor accepting the offer's versions and compares the message version and header config with the kit's build.", + "expect": { + "outcome": "reject", + "rejectCode": "unsupported-version", + "rejectReason": "unsupported_transaction_version: string entry" + }, + "id": "x402-build-string-entry-reject", + "input": { + "rpcFixtures": { + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "11111111111111111111111111111111" + }, + "signerSecretKey": [ + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 234, + 74, + 108, + 99, + 226, + 156, + 82, + 10, + 190, + 245, + 80, + 123, + 19, + 46, + 197, + 249, + 149, + 71, + 118, + 174, + 190, + 190, + 123, + 146, + 66, + 30, + 234, + 105, + 20, + 70, + 210, + 44 + ], + "x402Offer": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", + "transactionVersions": [ + "1", + 0 + ] + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "exact" + }, + "x402Version": 2 + }, + "intent": "x402-exact", + "mode": "build-transaction", + "provenance": "authored", + "requirements": [ + "X402TX-927d17b62e" + ], + "role": "client", + "spec": { + "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", + "quote": "A client or server MUST treat a field containing any non-integer entry (a string, null, or \"legacy\") or any integer other than 0 or 1 as invalid and fail closed with unsupported_transaction_version.", + "section": "1.5 Transaction Versions (MUST)" + }, + "tier": "offline" + }, { "bugType": "defaults", "description": "extra.transactionVersions [\"legacy\"]: clients MUST NOT build legacy, so nothing in the advertisement is buildable and the client fails with unsupported_transaction_version. The build judge verifies the header with a Rust sponsor accepting the offer's versions and compares the message version and header config with the kit's build.", @@ -1001,64 +1234,393 @@ 80, 123, 19, - 46, + 46, + 197, + 249, + 149, + 71, + 118, + 174, + 190, + 190, + 123, + 146, + 66, + 30, + 234, + 105, + 20, + 70, + 210, + 44 + ], + "x402Offer": { + "amount": "1000", + "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "extra": { + "feePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", + "transactionVersions": [ + "legacy" + ] + }, + "maxTimeoutSeconds": 300, + "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "scheme": "exact" + }, + "x402Version": 2 + }, + "intent": "x402-exact", + "mode": "build-transaction", + "provenance": "authored", + "requirements": [ + "X402TX-77742f428c", + "X402TX-2909c4b4ec" + ], + "role": "client", + "spec": { + "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", + "quote": "They are never advertised in extra.transactionVersions and clients MUST NOT build them.", + "section": "1.5 Transaction Versions (MUST)" + }, + "tier": "offline" + }, + { + "bugType": "wire", + "description": "A sponsor accepting [0, 1] verifies the version-1 static layout (TransferChecked, Memo; computeUnitLimit 200000, priorityFee 1 lamport, maximum loadedAccountsDataSizeLimit in the header): accepted.", + "expect": { + "outcome": "accept" + }, + "id": "x402-verify-v1-accept", + "input": { + "rpcFixtures": { + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "11111111111111111111111111111111" + }, + "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXc4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUVBTkF3QUFBQUFFQlFRS0FBUUFJQUFEQmdJQkRPZ0RBQUFBQUFBQUJuZzBNREoyWlhKcFpubDJNV0ZqWTJVd01EQXdNREF3TURBd01EQXdNREF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIYW5GdFdPK2VYUFJrWWNNYzE3ek4zOUNMQmxtQUxObVl2OXhGRlgvQ3krVWdReFV1cUpodm9HT0FyY0dSL0NYaXN5MGNoTDhmWlVSTWYzdVRnWWc4PSJ9fQ==", + "x402ServerAmount": "1000", + "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "x402ServerFeePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "x402ServerFeePayerSecretKey": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 253, + 23, + 36, + 56, + 90, + 160, + 199, + 91, + 100, + 251, + 120, + 205, + 96, + 47, + 161, + 217, + 145, + 253, + 235, + 247, + 107, + 19, + 197, + 142, + 215, + 2, + 234, + 200, + 53, + 233, + 246, + 24 + ], + "x402ServerNetwork": "devnet", + "x402ServerRecipient": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "x402ServerTransactionVersions": [ + 0, + 1 + ] + }, + "intent": "x402-exact", + "mode": "verify-transaction", + "provenance": "generated", + "requirements": [ + "X402TX-24efe57db3", + "X402TX-10b3fe2ef3", + "X402TX-4c2fd60e66" + ], + "role": "server", + "spec": { + "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", + "quote": "The sponsor MUST reject a message whose version is outside the set it accepts, before inspecting any instruction, with unsupported_transaction_version.", + "section": "1.5 Transaction Versions (MUST)" + }, + "tier": "offline" + }, + { + "bugType": "auth-bypass", + "description": "A sponsor whose accepted set is [0] receives the same valid version-1 transaction: rejected with unsupported_transaction_version before any instruction is inspected. The set is stated explicitly (input.x402ServerTransactionVersions): §1.5 gives the sponsor's own set no default. Pair: x402-verify-v1-accept.", + "expect": { + "outcome": "reject", + "rejectCode": "unsupported-version", + "rejectReason": "unsupported_transaction_version" + }, + "id": "x402-verify-v1-not-accepted-reject", + "input": { + "rpcFixtures": { + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "11111111111111111111111111111111" + }, + "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiJ9fSwicGF5bG9hZCI6eyJ0cmFuc2FjdGlvbiI6ImdRSUJBdzhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlIL1Jja09GcWd4MXRrKzNqTllDK2gyWkg5Ni9kckU4V08xd0xxeURYcDloanFTbXhqNHB4U0NyNzFVSHNUTHNYNWxVZDJycjYrZTVKQ0h1cHBGRWJTTEFYUy8xbFc2VnVHUTZ4QWYyMjFicTRtT1hTUVhSQWo1eDJqM2xNbzRjcGJhNFQrVkFXWmtLYnFJd2pjWlloVnJaV0taUjRVVnlZajkvclRrOXV3RSt3RlNsTmFtU2toQmswazZIRmcyamg4ZkRXMTNieVN1NEhrSDZoQVFRVkVqUWJkOXVIWFphR1QyY3ZoUnM3cmVhd2N0SVh0WDFzM2tUcU05WVYrL3dDcE8wUXNzNUVoVi9FNmt6MEJOQ2d0QXl0Zi9zMEJvdHZ4dDNrR0NOOEFMcWNCQUFBQUFBQUFBRUFOQXdBQUFBQUVCUVFLQUFRQUlBQURCZ0lCRE9nREFBQUFBQUFBQm5nME1ESjJaWEpwWm5sMk1XNXZkR0V3TURBd01EQXdNREF3TURBd01EQXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSjNMaXQ5ZllJazQ4bTNqZTlRcURHMjAvczF5dTJZNEhJUTNwWUVDUTlpc2Vubnc0YlNHV2kxV3dmdWxUVTJsWklOdkdTUGVKN1JjNVJ3Qmt3TlBvUU09In19", + "x402ServerAmount": "1000", + "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "x402ServerFeePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "x402ServerFeePayerSecretKey": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 253, + 23, + 36, + 56, + 90, + 160, + 199, + 91, + 100, + 251, + 120, + 205, + 96, + 47, + 161, + 217, + 145, + 253, + 235, + 247, + 107, + 19, + 197, + 142, + 215, + 2, + 234, + 200, + 53, + 233, + 246, + 24 + ], + "x402ServerNetwork": "devnet", + "x402ServerRecipient": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "x402ServerTransactionVersions": [ + 0 + ] + }, + "intent": "x402-exact", + "mode": "verify-transaction", + "provenance": "generated", + "requirements": [ + "X402TX-24efe57db3", + "X402TX-10b3fe2ef3" + ], + "role": "server", + "spec": { + "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", + "quote": "The sponsor MUST reject a message whose version is outside the set it accepts, before inspecting any instruction, with unsupported_transaction_version.", + "section": "1.5 Transaction Versions (MUST)" + }, + "tier": "offline" + }, + { + "bugType": "auth-bypass", + "description": "A sponsor configured with [0] explicitly receives a version-1 transaction.", + "expect": { + "outcome": "reject", + "rejectCode": "unsupported-version", + "rejectReason": "unsupported_transaction_version" + }, + "id": "x402-verify-v1-explicit-v0-sponsor-reject", + "input": { + "rpcFixtures": { + "mints": { + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { + "decimals": 6, + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + }, + "recentBlockhash": "11111111111111111111111111111111" + }, + "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiJ9fSwicGF5bG9hZCI6eyJ0cmFuc2FjdGlvbiI6ImdRSUJBdzhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlIL1Jja09GcWd4MXRrKzNqTllDK2gyWkg5Ni9kckU4V08xd0xxeURYcDloanFTbXhqNHB4U0NyNzFVSHNUTHNYNWxVZDJycjYrZTVKQ0h1cHBGRWJTTEFYUy8xbFc2VnVHUTZ4QWYyMjFicTRtT1hTUVhSQWo1eDJqM2xNbzRjcGJhNFQrVkFXWmtLYnFJd2pjWlloVnJaV0taUjRVVnlZajkvclRrOXV3RSt3RlNsTmFtU2toQmswazZIRmcyamg4ZkRXMTNieVN1NEhrSDZoQVFRVkVqUWJkOXVIWFphR1QyY3ZoUnM3cmVhd2N0SVh0WDFzM2tUcU05WVYrL3dDcE8wUXNzNUVoVi9FNmt6MEJOQ2d0QXl0Zi9zMEJvdHZ4dDNrR0NOOEFMcWNCQUFBQUFBQUFBRUFOQXdBQUFBQUVCUVFLQUFRQUlBQURCZ0lCRE9nREFBQUFBQUFBQm5nME1ESjJaWEpwWm5sMk1XVjRjR3d3TURBd01EQXdNREF3TURBd01EQXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT0NuRUZxNjFvR0ppWFhiWEZhSW9PTzR6S01RY09rY051Ukd0cTA2dDUyZVVJdzFQaW9wb0lIaEdRTVZkM0FVZC9EeEc2WEVZQnUrUWhPaUxac1c0QUE9In19", + "x402ServerAmount": "1000", + "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "x402ServerFeePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", + "x402ServerFeePayerSecretKey": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 253, + 23, + 36, + 56, + 90, + 160, + 199, + 91, + 100, + 251, + 120, + 205, + 96, + 47, + 161, + 217, + 145, + 253, + 235, + 247, + 107, + 19, 197, - 249, - 149, - 71, - 118, - 174, - 190, - 190, - 123, - 146, - 66, - 30, + 142, + 215, + 2, 234, - 105, - 20, - 70, - 210, - 44 + 200, + 53, + 233, + 246, + 24 ], - "x402Offer": { - "amount": "1000", - "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", - "extra": { - "feePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", - "transactionVersions": [ - "legacy" - ] - }, - "maxTimeoutSeconds": 300, - "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", - "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", - "scheme": "exact" - }, - "x402Version": 2 + "x402ServerNetwork": "devnet", + "x402ServerRecipient": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "x402ServerTransactionVersions": [ + 0 + ] }, "intent": "x402-exact", - "mode": "build-transaction", - "provenance": "authored", + "mode": "verify-transaction", + "provenance": "generated", "requirements": [ - "X402TX-77742f428c", - "X402TX-2909c4b4ec" + "X402TX-24efe57db3" ], - "role": "client", + "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", - "quote": "They are never advertised in extra.transactionVersions and clients MUST NOT build them.", + "quote": "The sponsor MUST reject a message whose version is outside the set it accepts, before inspecting any instruction, with unsupported_transaction_version.", "section": "1.5 Transaction Versions (MUST)" }, "tier": "offline" }, { "bugType": "wire", - "description": "A sponsor accepting [0, 1] verifies the version-1 static layout (TransferChecked, Memo; computeUnitLimit 200000, priorityFee 1 lamport, maximum loadedAccountsDataSizeLimit in the header): accepted.", + "description": "A sponsor accepting [0, 1] still accepts the version-0 static layout, with extra.transactionVersions [0, 1] echoed in accepted.", "expect": { "outcome": "accept" }, - "id": "x402-verify-v1-accept", + "id": "x402-verify-v0-with-v1-sponsor-accept", "input": { "rpcFixtures": { "mints": { @@ -1069,7 +1631,7 @@ }, "recentBlockhash": "11111111111111111111111111111111" }, - "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXc4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUVBTkF3QUFBQUFFQlFRS0FBUUFJQUFEQmdJQkRPZ0RBQUFBQUFBQUJuZzBNREoyWlhKcFpubDJNV0ZqWTJVd01EQXdNREF3TURBd01EQXdNREF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIYW5GdFdPK2VYUFJrWWNNYzE3ek4zOUNMQmxtQUxObVl2OXhGRlgvQ3krVWdReFV1cUpodm9HT0FyY0dSL0NYaXN5MGNoTDhmWlVSTWYzdVRnWWc4PSJ9fQ==", + "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQxVGtXVTByUnl0dzQ4bDI1NHltdGVwSjVPbGlzOE40cmRhN3V5WExCMGIveURRQ3NSUXFzemVvUU5NY2IwN1pzOTR5bi91V0VVRjhwcjRpQW9kTzhBZ0FJQkJBajlGeVE0V3FESFcyVDdlTTFnTDZIWmtmM3I5MnNUeFk3WEF1cklOZW4yR09wS2JHUGluRklLdnZWUWV4TXV4Zm1WUjNhdXZyNTdra0llNm1rVVJ0SXNCZEwvV1ZicFc0WkRyRUIvYmJWdXJpWTVkSkJkRUNQbkhhUGVVeWpoeWx0cmhQNVVCWm1RcHVvakNOeGxpRld0bFlwbEhoUlhKaVAzK3RPVDI3QVQ3QU1HUm0vbElSY3kvK3l0dW5MRG0rZThqT1c3eGZjU2F5eERtenBBQUFBQUJVcFRXcGtwSVFaTkpPaHhZTm80Zkh3MXRkMjhrcnVCNUIrb1FFRUZSSTBHM2ZiaDEyV2hrOW5MNFViTzYzbXNITFNGN1Y5Yk41RTZqUFdGZnY4QXFUdEVMTE9SSVZmeE9wTTlBVFFvTFFNclgvN05BYUxiOGJkNUJnamZBQzZuQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVCQUFGQWtBTkF3QUVBQWtEQVFBQUFBQUFBQUFHQkFNSEFnRUtET2dEQUFBQUFBQUFCZ1VBSUhnME1ESjJaWEpwWm5sMk1IZHBkR2d3TURBd01EQXdNREF3TURBd01EQXdBQT09In19", "x402ServerAmount": "1000", "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "x402ServerFeePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", @@ -1151,8 +1713,7 @@ "provenance": "generated", "requirements": [ "X402TX-24efe57db3", - "X402TX-10b3fe2ef3", - "X402TX-d188782061" + "X402TX-10b3fe2ef3" ], "role": "server", "spec": { @@ -1163,14 +1724,12 @@ "tier": "offline" }, { - "bugType": "auth-bypass", - "description": "A sponsor with the default accepted set [0] receives the same valid version-1 transaction: rejected with unsupported_transaction_version before any instruction is inspected. Pair: x402-verify-v1-accept.", + "bugType": "wire", + "description": "Version-1 static layout whose Memo nonce is 1300 hex characters: about 1.6 KB serialized, over version 0's 1232 bytes but within version 1's 4096. Accepted. Mutation: memo #0 replaced with 1300 hex characters.", "expect": { - "outcome": "reject", - "rejectCode": "unsupported-version", - "rejectReason": "unsupported_transaction_version" + "outcome": "accept" }, - "id": "x402-verify-v1-not-accepted-reject", + "id": "x402-verify-v1-over-1232-accept", "input": { "rpcFixtures": { "mints": { @@ -1181,7 +1740,7 @@ }, "recentBlockhash": "11111111111111111111111111111111" }, - "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiJ9fSwicGF5bG9hZCI6eyJ0cmFuc2FjdGlvbiI6ImdRSUJBdzhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlIL1Jja09GcWd4MXRrKzNqTllDK2gyWkg5Ni9kckU4V08xd0xxeURYcDloanFTbXhqNHB4U0NyNzFVSHNUTHNYNWxVZDJycjYrZTVKQ0h1cHBGRWJTTEFYUy8xbFc2VnVHUTZ4QWYyMjFicTRtT1hTUVhSQWo1eDJqM2xNbzRjcGJhNFQrVkFXWmtLYnFJd2pjWlloVnJaV0taUjRVVnlZajkvclRrOXV3RSt3RlNsTmFtU2toQmswazZIRmcyamg4ZkRXMTNieVN1NEhrSDZoQVFRVkVqUWJkOXVIWFphR1QyY3ZoUnM3cmVhd2N0SVh0WDFzM2tUcU05WVYrL3dDcE8wUXNzNUVoVi9FNmt6MEJOQ2d0QXl0Zi9zMEJvdHZ4dDNrR0NOOEFMcWNCQUFBQUFBQUFBRUFOQXdBQUFBQUVCUVFLQUFRQUlBQURCZ0lCRE9nREFBQUFBQUFBQm5nME1ESjJaWEpwWm5sMk1XNXZkR0V3TURBd01EQXdNREF3TURBd01EQXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSjNMaXQ5ZllJazQ4bTNqZTlRcURHMjAvczF5dTJZNEhJUTNwWUVDUTlpc2Vubnc0YlNHV2kxV3dmdWxUVTJsWklOdkdTUGVKN1JjNVJ3Qmt3TlBvUU09In19", + "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXc4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUVBTkF3QUFBQUFFQlFRS0FBUUFGQVVEQmdJQkRPZ0RBQUFBQUFBQUJqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBb0dVMDVHSWZyb2tET2tvd1FaRzYxOWgzYjZsZmdibEJlNEFVV2htelRaTVlEbXIxazNIQk9CT2swZkQvYk5VT09PRWd1Q3hNcERwN2wxOElFR2hNREE9PSJ9fQ==", "x402ServerAmount": "1000", "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "x402ServerFeePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", @@ -1252,32 +1811,36 @@ 24 ], "x402ServerNetwork": "devnet", - "x402ServerRecipient": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY" + "x402ServerRecipient": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", + "x402ServerTransactionVersions": [ + 0, + 1 + ] }, "intent": "x402-exact", "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-24efe57db3", - "X402TX-10b3fe2ef3" + "X402TX-dc7b0f3305", + "X402TX-4c2fd60e66" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", - "quote": "The sponsor MUST reject a message whose version is outside the set it accepts, before inspecting any instruction, with unsupported_transaction_version.", + "quote": "A legacy or version-0 transaction MUST NOT exceed 1232 serialized bytes; a version-1 transaction MUST NOT exceed 4096 serialized bytes.", "section": "1.5 Transaction Versions (MUST)" }, "tier": "offline" }, { - "bugType": "auth-bypass", - "description": "A sponsor configured with [0] explicitly receives a version-1 transaction.", + "bugType": "wire", + "description": "The same 1300-character Memo in a version-0 static layout: over 1232 bytes, rejected whatever else the sponsor accepts. Pair: x402-verify-v1-over-1232-accept. Mutation: memo #0 replaced with 1300 hex characters.", "expect": { "outcome": "reject", - "rejectCode": "unsupported-version", - "rejectReason": "unsupported_transaction_version" + "rejectCode": "invalid-payload", + "rejectReason": "a version-0 transaction over 1232 bytes" }, - "id": "x402-verify-v1-explicit-v0-sponsor-reject", + "id": "x402-verify-v0-over-1232-reject", "input": { "rpcFixtures": { "mints": { @@ -1288,7 +1851,7 @@ }, "recentBlockhash": "11111111111111111111111111111111" }, - "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiJ9fSwicGF5bG9hZCI6eyJ0cmFuc2FjdGlvbiI6ImdRSUJBdzhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlIL1Jja09GcWd4MXRrKzNqTllDK2gyWkg5Ni9kckU4V08xd0xxeURYcDloanFTbXhqNHB4U0NyNzFVSHNUTHNYNWxVZDJycjYrZTVKQ0h1cHBGRWJTTEFYUy8xbFc2VnVHUTZ4QWYyMjFicTRtT1hTUVhSQWo1eDJqM2xNbzRjcGJhNFQrVkFXWmtLYnFJd2pjWlloVnJaV0taUjRVVnlZajkvclRrOXV3RSt3RlNsTmFtU2toQmswazZIRmcyamg4ZkRXMTNieVN1NEhrSDZoQVFRVkVqUWJkOXVIWFphR1QyY3ZoUnM3cmVhd2N0SVh0WDFzM2tUcU05WVYrL3dDcE8wUXNzNUVoVi9FNmt6MEJOQ2d0QXl0Zi9zMEJvdHZ4dDNrR0NOOEFMcWNCQUFBQUFBQUFBRUFOQXdBQUFBQUVCUVFLQUFRQUlBQURCZ0lCRE9nREFBQUFBQUFBQm5nME1ESjJaWEpwWm5sMk1XVjRjR3d3TURBd01EQXdNREF3TURBd01EQXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT0NuRUZxNjFvR0ppWFhiWEZhSW9PTzR6S01RY09rY051Ukd0cTA2dDUyZVVJdzFQaW9wb0lIaEdRTVZkM0FVZC9EeEc2WEVZQnUrUWhPaUxac1c0QUE9In19", + "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNNaUV1QlpUallKVERVQytuTHhqNjlBUTZjaDR5YjFpbXZQTmJ5TSs3aHFWT0lIZXFWSWVXcjhzUEYxaEx0RmZGZnhoMWJsYzJUYVF2c2crcFNFUXNMZ0FJQkJBajlGeVE0V3FESFcyVDdlTTFnTDZIWmtmM3I5MnNUeFk3WEF1cklOZW4yR09wS2JHUGluRklLdnZWUWV4TXV4Zm1WUjNhdXZyNTdra0llNm1rVVJ0SXNCZEwvV1ZicFc0WkRyRUIvYmJWdXJpWTVkSkJkRUNQbkhhUGVVeWpoeWx0cmhQNVVCWm1RcHVvakNOeGxpRld0bFlwbEhoUlhKaVAzK3RPVDI3QVQ3QU1HUm0vbElSY3kvK3l0dW5MRG0rZThqT1c3eGZjU2F5eERtenBBQUFBQUJVcFRXcGtwSVFaTkpPaHhZTm80Zkh3MXRkMjhrcnVCNUIrb1FFRUZSSTBHM2ZiaDEyV2hrOW5MNFViTzYzbXNITFNGN1Y5Yk41RTZqUFdGZnY4QXFUdEVMTE9SSVZmeE9wTTlBVFFvTFFNclgvN05BYUxiOGJkNUJnamZBQzZuQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVCQUFGQWtBTkF3QUVBQWtEQVFBQUFBQUFBQUFHQkFNSEFnRUtET2dEQUFBQUFBQUFCZ1VBbEFvd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpBQT09In19", "x402ServerAmount": "1000", "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "x402ServerFeePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", @@ -1361,30 +1924,33 @@ "x402ServerNetwork": "devnet", "x402ServerRecipient": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", "x402ServerTransactionVersions": [ - 0 + 0, + 1 ] }, "intent": "x402-exact", "mode": "verify-transaction", - "provenance": "generated", + "provenance": "authored", "requirements": [ - "X402TX-24efe57db3" + "X402TX-dc7b0f3305" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", - "quote": "The sponsor MUST reject a message whose version is outside the set it accepts, before inspecting any instruction, with unsupported_transaction_version.", + "quote": "A legacy or version-0 transaction MUST NOT exceed 1232 serialized bytes; a version-1 transaction MUST NOT exceed 4096 serialized bytes.", "section": "1.5 Transaction Versions (MUST)" }, "tier": "offline" }, { "bugType": "wire", - "description": "A sponsor accepting [0, 1] still accepts the version-0 static layout, with extra.transactionVersions [0, 1] echoed in accepted.", + "description": "Version-1 static layout with a 4000-character Memo: over the 4096-byte version-1 limit. Pair: x402-verify-v1-over-1232-accept. Mutation: memo #0 replaced with 4000 hex characters.", "expect": { - "outcome": "accept" + "outcome": "reject", + "rejectCode": "invalid-payload", + "rejectReason": "a version-1 transaction over 4096 bytes" }, - "id": "x402-verify-v0-with-v1-sponsor-accept", + "id": "x402-verify-v1-over-4096-reject", "input": { "rpcFixtures": { "mints": { @@ -1395,7 +1961,7 @@ }, "recentBlockhash": "11111111111111111111111111111111" }, - "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQxVGtXVTByUnl0dzQ4bDI1NHltdGVwSjVPbGlzOE40cmRhN3V5WExCMGIveURRQ3NSUXFzemVvUU5NY2IwN1pzOTR5bi91V0VVRjhwcjRpQW9kTzhBZ0FJQkJBajlGeVE0V3FESFcyVDdlTTFnTDZIWmtmM3I5MnNUeFk3WEF1cklOZW4yR09wS2JHUGluRklLdnZWUWV4TXV4Zm1WUjNhdXZyNTdra0llNm1rVVJ0SXNCZEwvV1ZicFc0WkRyRUIvYmJWdXJpWTVkSkJkRUNQbkhhUGVVeWpoeWx0cmhQNVVCWm1RcHVvakNOeGxpRld0bFlwbEhoUlhKaVAzK3RPVDI3QVQ3QU1HUm0vbElSY3kvK3l0dW5MRG0rZThqT1c3eGZjU2F5eERtenBBQUFBQUJVcFRXcGtwSVFaTkpPaHhZTm80Zkh3MXRkMjhrcnVCNUIrb1FFRUZSSTBHM2ZiaDEyV2hrOW5MNFViTzYzbXNITFNGN1Y5Yk41RTZqUFdGZnY4QXFUdEVMTE9SSVZmeE9wTTlBVFFvTFFNclgvN05BYUxiOGJkNUJnamZBQzZuQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVCQUFGQWtBTkF3QUVBQWtEQVFBQUFBQUFBQUFHQkFNSEFnRUtET2dEQUFBQUFBQUFCZ1VBSUhnME1ESjJaWEpwWm5sMk1IZHBkR2d3TURBd01EQXdNREF3TURBd01EQXdBQT09In19", + "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXc4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUVBTkF3QUFBQUFFQlFRS0FBUUFvQThEQmdJQkRPZ0RBQUFBQUFBQUJqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1lBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBNWJMdW81T2t6Zy9MS2pwejBMeDluZ3JkV0lyZWliVFlPSnA2MkV0UmQ2T05aYmFmVUtDek1RM0NkMmZNcGFsWUJ2SXpMTmxvZ3F3WHVDdEtWemkyQUE9PSJ9fQ==", "x402ServerAmount": "1000", "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "x402ServerFeePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", @@ -1474,26 +2040,26 @@ }, "intent": "x402-exact", "mode": "verify-transaction", - "provenance": "generated", + "provenance": "authored", "requirements": [ - "X402TX-24efe57db3", - "X402TX-10b3fe2ef3" + "X402TX-dc7b0f3305" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", - "quote": "The sponsor MUST reject a message whose version is outside the set it accepts, before inspecting any instruction, with unsupported_transaction_version.", + "quote": "A legacy or version-0 transaction MUST NOT exceed 1232 serialized bytes; a version-1 transaction MUST NOT exceed 4096 serialized bytes.", "section": "1.5 Transaction Versions (MUST)" }, "tier": "offline" }, { - "bugType": "wire", - "description": "Version-1 static layout whose Memo nonce is 1300 hex characters: about 1.6 KB serialized, over version 0's 1232 bytes but within version 1's 4096. Accepted. Mutation: memo #0 replaced with 1300 hex characters.", + "bugType": "settlement", + "description": "Version-1 static layout preceded by a SetComputeUnitLimit instruction: the runtime ignores it under version 1, so a sponsor bounding it bounds nothing. Pair: x402-verify-v1-accept. Mutation: ComputeBudget instruction with data [2, 64, 13, 3, 0] added.", "expect": { - "outcome": "accept" + "outcome": "reject", + "rejectCode": "invalid-payload" }, - "id": "x402-verify-v1-over-1232-accept", + "id": "x402-verify-v1-compute-budget-instruction-reject", "input": { "rpcFixtures": { "mints": { @@ -1504,7 +2070,7 @@ }, "recentBlockhash": "11111111111111111111111111111111" }, - "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXc4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUVBTkF3QUFBQUFFQlFRS0FBUUFGQVVEQmdJQkRPZ0RBQUFBQUFBQUJqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBb0dVMDVHSWZyb2tET2tvd1FaRzYxOWgzYjZsZmdibEJlNEFVV2htelRaTVlEbXIxazNIQk9CT2swZkQvYk5VT09PRWd1Q3hNcERwN2wxOElFR2hNREE9PSJ9fQ==", + "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQkE4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNSS9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0RCa1p2NVNFWE12L3NyYnB5dzV2bnZJemx1OFgzRW1zc1E1czZRQUFBQUFWS1UxcVpLU0VHVFNUb2NXRGFPSHg4TmJYZHZKSzdnZVFmcUVCQkJVU05CdDMyNGRkbG9aUFp5K0ZHenV0NXJCeTBoZTFmV3plUk9vejFoWDcvQUtrN1JDeXprU0ZYOFRxVFBRRTBLQzBESzEvK3pRR2kyL0czZVFZSTN3QXVwd0VBQUFBQUFBQUFRQTBEQUFBQUFBUUVBQVVBQmdRS0FBVUFJQUFDUUEwREFBTUhBZ0VNNkFNQUFBQUFBQUFHZURRd01uWmxjbWxtZVhZeFkyOXRjREF3TURBd01EQXdNREF3TURBd01EQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFpY1hLSkJhQXorcW94VFhpQ01pREdxZEpUZk1JakxCelZrMVY0VEZMM0VDTmxDNVQ5N3QrNkVVUkRldU9uQmVXcUI3TDJBSzU1eVNKcU9CK0x6dmhEUT09In19", "x402ServerAmount": "1000", "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "x402ServerFeePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", @@ -1585,26 +2151,26 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-dc7b0f3305", - "X402TX-d188782061" + "X402TX-915632f040", + "X402TX-4cd70365fd", + "X402TX-f9bcc1a14a" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", - "quote": "A legacy or version-0 transaction MUST NOT exceed 1232 serialized bytes; a version-1 transaction MUST NOT exceed 4096 serialized bytes.", - "section": "1.5 Transaction Versions (MUST)" + "quote": "A version-1 transaction that contains a Compute Budget instruction MUST be rejected (an x402 sponsor rule; the runtime treats such instructions as no-ops).", + "section": "2.2.1 Compute Budget Controls (SHOULD)" }, "tier": "offline" }, { - "bugType": "wire", - "description": "The same 1300-character Memo in a version-0 static layout: over 1232 bytes, rejected whatever else the sponsor accepts. Pair: x402-verify-v1-over-1232-accept. Mutation: memo #0 replaced with 1300 hex characters.", + "bugType": "settlement", + "description": "Version-1 header without computeUnitLimit (budgeted zero compute units; it cannot execute after the sponsor pays the fee). Pair: x402-verify-v1-accept. Mutation: version-1 header computeUnitLimit removed.", "expect": { "outcome": "reject", - "rejectCode": "invalid-payload", - "rejectReason": "a version-0 transaction over 1232 bytes" + "rejectCode": "invalid-payload" }, - "id": "x402-verify-v0-over-1232-reject", + "id": "x402-verify-v1-missing-compute-unit-limit-reject", "input": { "rpcFixtures": { "mints": { @@ -1615,7 +2181,7 @@ }, "recentBlockhash": "11111111111111111111111111111111" }, - "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNNaUV1QlpUallKVERVQytuTHhqNjlBUTZjaDR5YjFpbXZQTmJ5TSs3aHFWT0lIZXFWSWVXcjhzUEYxaEx0RmZGZnhoMWJsYzJUYVF2c2crcFNFUXNMZ0FJQkJBajlGeVE0V3FESFcyVDdlTTFnTDZIWmtmM3I5MnNUeFk3WEF1cklOZW4yR09wS2JHUGluRklLdnZWUWV4TXV4Zm1WUjNhdXZyNTdra0llNm1rVVJ0SXNCZEwvV1ZicFc0WkRyRUIvYmJWdXJpWTVkSkJkRUNQbkhhUGVVeWpoeWx0cmhQNVVCWm1RcHVvakNOeGxpRld0bFlwbEhoUlhKaVAzK3RPVDI3QVQ3QU1HUm0vbElSY3kvK3l0dW5MRG0rZThqT1c3eGZjU2F5eERtenBBQUFBQUJVcFRXcGtwSVFaTkpPaHhZTm80Zkh3MXRkMjhrcnVCNUIrb1FFRUZSSTBHM2ZiaDEyV2hrOW5MNFViTzYzbXNITFNGN1Y5Yk41RTZqUFdGZnY4QXFUdEVMTE9SSVZmeE9wTTlBVFFvTFFNclgvN05BYUxiOGJkNUJnamZBQzZuQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVCQUFGQWtBTkF3QUVBQWtEQVFBQUFBQUFBQUFHQkFNSEFnRUtET2dEQUFBQUFBQUFCZ1VBbEFvd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpBQT09In19", + "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXdzQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUFBQUFBUUZCQW9BQkFBZ0FBTUdBZ0VNNkFNQUFBQUFBQUFHZURRd01uWmxjbWxtZVhZeGJXbHpjekF3TURBd01EQXdNREF3TURBd01EQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE4WHJ6UmNqTjlzSkx5WGVBR09KVVIvTTc2azJTVjNTNzRKUzVMRitJRmUralhLSzJZN0FDSC90SngxbVlwaUVodU04UTd2WXVmWmxEWkg5TUdZajZEUT09In19", "x402ServerAmount": "1000", "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "x402ServerFeePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", @@ -1694,27 +2260,27 @@ }, "intent": "x402-exact", "mode": "verify-transaction", - "provenance": "authored", + "provenance": "generated", "requirements": [ - "X402TX-dc7b0f3305" + "X402TX-997feeb51d", + "X402TX-f9bcc1a14a" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", - "quote": "A legacy or version-0 transaction MUST NOT exceed 1232 serialized bytes; a version-1 transaction MUST NOT exceed 4096 serialized bytes.", - "section": "1.5 Transaction Versions (MUST)" + "quote": "In a version-1 transaction the same caps apply to the message config values instead (§1.5): computeUnitLimit (bit 2) MUST be set and MUST NOT exceed the configured maximum, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy", + "section": "2.2.1 Compute Budget Controls (SHOULD)" }, "tier": "offline" }, { - "bugType": "wire", - "description": "Version-1 static layout with a 4000-character Memo: over the 4096-byte version-1 limit. Pair: x402-verify-v1-over-1232-accept. Mutation: memo #0 replaced with 4000 hex characters.", + "bugType": "settlement", + "description": "Version-1 header without loadedAccountsDataSizeLimit (budgeted zero bytes; it fails at load time after the sponsor pays the fee). Pair: x402-verify-v1-accept. Mutation: version-1 header loadedAccountsDataSizeLimit removed.", "expect": { "outcome": "reject", - "rejectCode": "invalid-payload", - "rejectReason": "a version-1 transaction over 4096 bytes" + "rejectCode": "invalid-payload" }, - "id": "x402-verify-v1-over-4096-reject", + "id": "x402-verify-v1-missing-loaded-data-limit-reject", "input": { "rpcFixtures": { "mints": { @@ -1725,7 +2291,7 @@ }, "recentBlockhash": "11111111111111111111111111111111" }, - "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXc4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUVBTkF3QUFBQUFFQlFRS0FBUUFvQThEQmdJQkRPZ0RBQUFBQUFBQUJqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1l3TVRJek5EVTJOemc1WVdKalpHVm1NREV5TXpRMU5qYzRPV0ZpWTJSbFpqQXhNak0wTlRZM09EbGhZbU5rWldZd01USXpORFUyTnpnNVlXSmpaR1ZtTURFeU16UTFOamM0T1dGaVkyUmxaakF4TWpNME5UWTNPRGxoWW1Oa1pXWXdNVEl6TkRVMk56ZzVZV0pqWkdWbU1ERXlNelExTmpjNE9XRmlZMlJsWmpBeE1qTTBOVFkzT0RsaFltTmtaV1lBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBNWJMdW81T2t6Zy9MS2pwejBMeDluZ3JkV0lyZWliVFlPSnA2MkV0UmQ2T05aYmFmVUtDek1RM0NkMmZNcGFsWUJ2SXpMTmxvZ3F3WHVDdEtWemkyQUE9PSJ9fQ==", + "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXdjQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUVBTkF3QUZCQW9BQkFBZ0FBTUdBZ0VNNkFNQUFBQUFBQUFHZURRd01uWmxjbWxtZVhZeGJXbHpjekF3TURBd01EQXdNREF3TURBd01EQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFoNTJZenN1MFJwamhaSWJQUG1sUGV0OFVBa3NEY0JNUWs3d2pOZ2EvU3padUVjdjFnQkxOM25HS3hBTGVZU3pkSVliUXZ5OC9ucHFRNDI2Z1ZlRmJCdz09In19", "x402ServerAmount": "1000", "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "x402ServerFeePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", @@ -1806,24 +2372,24 @@ "mode": "verify-transaction", "provenance": "authored", "requirements": [ - "X402TX-dc7b0f3305" + "X402TX-997feeb51d", + "X402TX-f9bcc1a14a" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", - "quote": "A legacy or version-0 transaction MUST NOT exceed 1232 serialized bytes; a version-1 transaction MUST NOT exceed 4096 serialized bytes.", - "section": "1.5 Transaction Versions (MUST)" + "quote": "In a version-1 transaction the same caps apply to the message config values instead (§1.5): computeUnitLimit (bit 2) MUST be set and MUST NOT exceed the configured maximum, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy", + "section": "2.2.1 Compute Budget Controls (SHOULD)" }, "tier": "offline" }, { "bugType": "settlement", - "description": "Version-1 static layout preceded by a SetComputeUnitLimit instruction: the runtime ignores it under version 1, so a sponsor bounding it bounds nothing. Pair: x402-verify-v1-accept. Mutation: ComputeBudget instruction with data [2, 64, 13, 3, 0] added.", + "description": "Version-1 header loadedAccountsDataSizeLimit 4194304 (4 MiB), what the TypeScript, Go and Python x402 clients request: the spec requires the limit to be set, not to be the runtime maximum, so a sponsor that demands 64 MiB refuses every reference client. Pair: x402-verify-v1-missing-loaded-data-limit-reject. Mutation: version-1 header loadedAccountsDataSizeLimit set to 4194304.", "expect": { - "outcome": "reject", - "rejectCode": "invalid-payload" + "outcome": "accept" }, - "id": "x402-verify-v1-compute-budget-instruction-reject", + "id": "x402-verify-v1-loaded-data-limit-4mib-accept", "input": { "rpcFixtures": { "mints": { @@ -1834,7 +2400,7 @@ }, "recentBlockhash": "11111111111111111111111111111111" }, - "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQkE4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNSS9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0RCa1p2NVNFWE12L3NyYnB5dzV2bnZJemx1OFgzRW1zc1E1czZRQUFBQUFWS1UxcVpLU0VHVFNUb2NXRGFPSHg4TmJYZHZKSzdnZVFmcUVCQkJVU05CdDMyNGRkbG9aUFp5K0ZHenV0NXJCeTBoZTFmV3plUk9vejFoWDcvQUtrN1JDeXprU0ZYOFRxVFBRRTBLQzBESzEvK3pRR2kyL0czZVFZSTN3QXVwd0VBQUFBQUFBQUFRQTBEQUFBQUFBUUVBQVVBQmdRS0FBVUFJQUFDUUEwREFBTUhBZ0VNNkFNQUFBQUFBQUFHZURRd01uWmxjbWxtZVhZeFkyOXRjREF3TURBd01EQXdNREF3TURBd01EQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFpY1hLSkJhQXorcW94VFhpQ01pREdxZEpUZk1JakxCelZrMVY0VEZMM0VDTmxDNVQ5N3QrNkVVUkRldU9uQmVXcUI3TDJBSzU1eVNKcU9CK0x6dmhEUT09In19", + "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXc4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUVBTkF3QUFBRUFBQlFRS0FBUUFJQUFEQmdJQkRPZ0RBQUFBQUFBQUJuZzBNREoyWlhKcFpubDJNV3h2WVdRd01EQXdNREF3TURBd01EQXdNREF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU9SQ29lQ2o0R0FCSjZNR0xYN2daVGhpQlp0OElQRS9Ib3BPQkZqYUdFY2s2eVBIQ29EcjZVd0ZsMll4cEsyN1lzbkhWc0t4bDVmU2I5bTVNUm50SWdBPSJ9fQ==", "x402ServerAmount": "1000", "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "x402ServerFeePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", @@ -1915,25 +2481,24 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-936b492daa", - "X402TX-644919eb3b" + "X402TX-997feeb51d", + "X402TX-f9bcc1a14a" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", - "quote": "A version-1 transaction that contains a Compute Budget instruction MUST be rejected.", + "quote": "In a version-1 transaction the same caps apply to the message config values instead (§1.5): computeUnitLimit (bit 2) MUST be set and MUST NOT exceed the configured maximum, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy", "section": "2.2.1 Compute Budget Controls (SHOULD)" }, "tier": "offline" }, { "bugType": "settlement", - "description": "Version-1 header without computeUnitLimit (budgeted zero compute units; it cannot execute after the sponsor pays the fee). Pair: x402-verify-v1-accept. Mutation: version-1 header computeUnitLimit removed.", + "description": "Version-1 header loadedAccountsDataSizeLimit 32768 (32 KiB), set but small: accepted at verification. A budget too small to load the payment's programs fails at simulation, which this offline vector does not run. Mutation: version-1 header loadedAccountsDataSizeLimit set to 32768.", "expect": { - "outcome": "reject", - "rejectCode": "invalid-payload" + "outcome": "accept" }, - "id": "x402-verify-v1-missing-compute-unit-limit-reject", + "id": "x402-verify-v1-loaded-data-limit-small-accept", "input": { "rpcFixtures": { "mints": { @@ -1944,7 +2509,7 @@ }, "recentBlockhash": "11111111111111111111111111111111" }, - "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXdzQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUFBQUFBUUZCQW9BQkFBZ0FBTUdBZ0VNNkFNQUFBQUFBQUFHZURRd01uWmxjbWxtZVhZeGJXbHpjekF3TURBd01EQXdNREF3TURBd01EQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE4WHJ6UmNqTjlzSkx5WGVBR09KVVIvTTc2azJTVjNTNzRKUzVMRitJRmUralhLSzJZN0FDSC90SngxbVlwaUVodU04UTd2WXVmWmxEWkg5TUdZajZEUT09In19", + "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXc4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUVBTkF3QUFnQUFBQlFRS0FBUUFJQUFEQmdJQkRPZ0RBQUFBQUFBQUJuZzBNREoyWlhKcFpubDJNV3h2WVdRd01EQXdNREF3TURBd01EQXdNREF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVBLTmIvcWJvcFdzQnBETTNrTUV4TGVKK0hobGJBSk9yd1Q5dll4UTlJRkduZ1E5b0xzZlBGZkpCcjIxd1NNb1QrTTV5REx2MjFCeFAyOENObmVkOVE4PSJ9fQ==", "x402ServerAmount": "1000", "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "x402ServerFeePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", @@ -2025,25 +2590,24 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-eb681e1701", - "X402TX-644919eb3b" + "X402TX-997feeb51d" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", - "quote": "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed the configured maximum, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= maxPriorityFeeMicroLamports computeUnitLimit.", + "quote": "In a version-1 transaction the same caps apply to the message config values instead (§1.5): computeUnitLimit (bit 2) MUST be set and MUST NOT exceed the configured maximum, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy", "section": "2.2.1 Compute Budget Controls (SHOULD)" }, "tier": "offline" }, { "bugType": "settlement", - "description": "Version-1 header without loadedAccountsDataSizeLimit (budgeted zero bytes; it fails at load time after the sponsor pays the fee). Pair: x402-verify-v1-accept. Mutation: version-1 header loadedAccountsDataSizeLimit removed.", + "description": "Version-1 header requesting a 64 KiB heap (TransactionConfigMask bit 4), the header form of RequestHeapFrame that a sponsor refuses on version 0 (x402-exact-verify-compute-heap-frame-reject). Pair: x402-verify-v1-accept. Mutation: version-1 header heapSize set to 65536.", "expect": { "outcome": "reject", "rejectCode": "invalid-payload" }, - "id": "x402-verify-v1-missing-loaded-data-limit-reject", + "id": "x402-verify-v1-heap-size-reject", "input": { "rpcFixtures": { "mints": { @@ -2054,7 +2618,7 @@ }, "recentBlockhash": "11111111111111111111111111111111" }, - "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXdjQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUVBTkF3QUZCQW9BQkFBZ0FBTUdBZ0VNNkFNQUFBQUFBQUFHZURRd01uWmxjbWxtZVhZeGJXbHpjekF3TURBd01EQXdNREF3TURBd01EQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFoNTJZenN1MFJwamhaSWJQUG1sUGV0OFVBa3NEY0JNUWs3d2pOZ2EvU3padUVjdjFnQkxOM25HS3hBTGVZU3pkSVliUXZ5OC9ucHFRNDI2Z1ZlRmJCdz09In19", + "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXg4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUVBTkF3QUFBQUFFQUFBQkFBVUVDZ0FFQUNBQUF3WUNBUXpvQXdBQUFBQUFBQVo0TkRBeWRtVnlhV1o1ZGpGb1pXRndNREF3TURBd01EQXdNREF3TURBd01BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ1ZtdFZjSWswVC9kTmR6cE0vQUltaDJWUGVoQVVmbko1OHhpVVllRUl6Rmd0RGZsZnFsSzJOaVdESWczUTA0STZ2RjlmNTQzUWlKWU5PVFRBUXRub0oifX0=", "x402ServerAmount": "1000", "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "x402ServerFeePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", @@ -2133,22 +2697,21 @@ }, "intent": "x402-exact", "mode": "verify-transaction", - "provenance": "authored", + "provenance": "generated", "requirements": [ - "X402TX-eb681e1701", - "X402TX-644919eb3b" + "X402TX-997feeb51d" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", - "quote": "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed the configured maximum, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= maxPriorityFeeMicroLamports computeUnitLimit.", + "quote": "Only SetComputeUnitLimit (discriminator 2) and SetComputeUnitPrice (discriminator 3) SHOULD be accepted; other ComputeBudget instruction types expand execution surface without being necessary for payment verification and SHOULD be rejected.", "section": "2.2.1 Compute Budget Controls (SHOULD)" }, "tier": "offline" }, { "bugType": "settlement", - "description": "Version-1 header computeUnitLimit at the configured maximum (200000): accepted (the base layout already sits at the cap; this pins it explicitly next to its over-cap pair). Mutation: version-1 header computeUnitLimit set to 200000.", + "description": "Version-1 header computeUnitLimit at the reference default maximum (400000, scheme_exact_svm.md §2.2.1): accepted, pinned next to its over-cap pair. Mutation: version-1 header computeUnitLimit set to 400000.", "expect": { "outcome": "accept" }, @@ -2163,7 +2726,7 @@ }, "recentBlockhash": "11111111111111111111111111111111" }, - "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXc4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUVBTkF3QUFBQUFFQlFRS0FBUUFJQUFEQmdJQkRPZ0RBQUFBQUFBQUJuZzBNREoyWlhKcFpubDJNV052YlhBd01EQXdNREF3TURBd01EQXdNREF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUo0YVpzdnVqbXNkSzZveU5nYk5pcXkvM0R3WGFzYnE3a2RJNWt5cVQ4VUtpVXV2Zkt5aHVnUUM2S203SlJKenZicnZUY3BQUWVGTVI0clpOUnBUVkE4PSJ9fQ==", + "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXc4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUlBYUJnQUFBQUFFQlFRS0FBUUFJQUFEQmdJQkRPZ0RBQUFBQUFBQUJuZzBNREoyWlhKcFpubDJNV052YlhBd01EQXdNREF3TURBd01EQXdNREF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUljTGJvTVlIbDU3RXMwRXNqZGh0NE16Z3QvOW1iaTVuNkY0cHluR20xU2pJbEl1ZHRFQVRaWDM3Szlmbi9uY0JZU2hFMG5pTjRFa3ByWDBsRjVsMlFrPSJ9fQ==", "x402ServerAmount": "1000", "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "x402ServerFeePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", @@ -2244,19 +2807,19 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-eb681e1701" + "X402TX-997feeb51d" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", - "quote": "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed the configured maximum, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= maxPriorityFeeMicroLamports computeUnitLimit.", + "quote": "In a version-1 transaction the same caps apply to the message config values instead (§1.5): computeUnitLimit (bit 2) MUST be set and MUST NOT exceed the configured maximum, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy", "section": "2.2.1 Compute Budget Controls (SHOULD)" }, "tier": "offline" }, { "bugType": "settlement", - "description": "Version-1 header computeUnitLimit 200001, one unit over the configured maximum. Mutation: version-1 header computeUnitLimit set to 200001.", + "description": "Version-1 header computeUnitLimit 400001, one unit over the reference default maximum (scheme_exact_svm.md §2.2.1: 400,000). Mutation: version-1 header computeUnitLimit set to 400001.", "expect": { "outcome": "reject", "rejectCode": "compute-limit-over-cap" @@ -2272,7 +2835,7 @@ }, "recentBlockhash": "11111111111111111111111111111111" }, - "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXc4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUVFTkF3QUFBQUFFQlFRS0FBUUFJQUFEQmdJQkRPZ0RBQUFBQUFBQUJuZzBNREoyWlhKcFpubDJNV052YlhBd01EQXdNREF3TURBd01EQXdNREF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUhiYkFXVExNVmNOc3NvelRYSFNDZ0ltcmYxblk0Vi9nTStGdEhNd0ZreGU5Nm4rWVhkd0pwZFI3NmlwQTliWTcxSWFsTHB1UGg2OU0xd3V0VHVyWUFrPSJ9fQ==", + "x402PaymentHeader": "eyJ4NDAyVmVyc2lvbiI6MiwiYWNjZXB0ZWQiOnsic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoic29sYW5hOkV0V1RSQUJaYVlxNmlNZmVZS291UnUxNjZWVTJ4cWExIiwiYW1vdW50IjoiMTAwMCIsImFzc2V0IjoiNHpNTUM5c3J0NVJpNVgxNEdBZ1hoYUhpaTNHblBBRUVSWVBKZ1pKRG5jRFUiLCJwYXlUbyI6IkNYaHJGWkpMS3Fqem1QM3NqWUxjRjRkVGVYV0tDeTllMlNYWFoyWW82TVBZIiwibWF4VGltZW91dFNlY29uZHMiOjMwMCwiZXh0cmEiOnsiZmVlUGF5ZXIiOiJKMnhjY1J0dUc0M2RyRVNMWXpuSGhMaFFrTFRkZmVwY0tZYmlROUJzSlZhZiIsInRyYW5zYWN0aW9uVmVyc2lvbnMiOlswLDFdfX0sInBheWxvYWQiOnsidHJhbnNhY3Rpb24iOiJnUUlCQXc4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJSC9SY2tPRnFneDF0ayszak5ZQytoMlpIOTYvZHJFOFdPMXdMcXlEWHA5aGpxU214ajRweFNDcjcxVUhzVExzWDVsVWQycnI2K2U1SkNIdXBwRkViU0xBWFMvMWxXNlZ1R1E2eEFmMjIxYnE0bU9YU1FYUkFqNXgyajNsTW80Y3BiYTRUK1ZBV1prS2JxSXdqY1pZaFZyWldLWlI0VVZ5WWo5L3JUazl1d0Urd0ZTbE5hbVNraEJrMGs2SEZnMmpoOGZEVzEzYnlTdTRIa0g2aEFRUVZFalFiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3BPMFFzczVFaFYvRTZrejBCTkNndEF5dGYvczBCb3R2eHQza0dDTjhBTHFjQkFBQUFBQUFBQUlFYUJnQUFBQUFFQlFRS0FBUUFJQUFEQmdJQkRPZ0RBQUFBQUFBQUJuZzBNREoyWlhKcFpubDJNV052YlhBd01EQXdNREF3TURBd01EQXdNREF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUtQMEZFcHpNYlBVQW55NEJmVi9zRFcxWHhqaE1TcHpKSFovZ0RCcWo2clorZXVZSUhETHRtNEM3d2M0VCtwTHNJcDBSQUV3STRlM3paVGZac0RKb3drPSJ9fQ==", "x402ServerAmount": "1000", "x402ServerCurrency": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "x402ServerFeePayer": "J2xccRtuG43drESLYznHhLhQkLTdfepcKYbiQ9BsJVaf", @@ -2353,12 +2916,12 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-eb681e1701" + "X402TX-997feeb51d" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", - "quote": "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed the configured maximum, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= maxPriorityFeeMicroLamports computeUnitLimit.", + "quote": "In a version-1 transaction the same caps apply to the message config values instead (§1.5): computeUnitLimit (bit 2) MUST be set and MUST NOT exceed the configured maximum, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy", "section": "2.2.1 Compute Budget Controls (SHOULD)" }, "tier": "offline" @@ -2461,13 +3024,13 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-2ad7a3f326", - "X402TX-eb681e1701" + "X402TX-655bb4a79a", + "X402TX-997feeb51d" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", - "quote": "The legacy/version-0 Compute Budget price and the version-1 total priority fee MUST each be no greater than 5 lamports/CU on this path, using the normalization in §1.5 for version 1.", + "quote": "The legacy/version-0 Compute Budget price and the version-1 total priority fee MUST each be no greater than maxPriorityFeeMicroLamports (default 5 lamports/CU) on this path, using the normalization in §1.5 for version 1.", "section": "3.1 Path 1 — Static Layout Verification (standard wallets)" }, "tier": "offline" @@ -2571,13 +3134,14 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-2ad7a3f326", - "X402TX-eb681e1701" + "X402TX-655bb4a79a", + "X402TX-997feeb51d", + "X402TX-74fb884aa9" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", - "quote": "The legacy/version-0 Compute Budget price and the version-1 total priority fee MUST each be no greater than 5 lamports/CU on this path, using the normalization in §1.5 for version 1.", + "quote": "The legacy/version-0 Compute Budget price and the version-1 total priority fee MUST each be no greater than maxPriorityFeeMicroLamports (default 5 lamports/CU) on this path, using the normalization in §1.5 for version 1.", "section": "3.1 Path 1 — Static Layout Verification (standard wallets)" }, "tier": "offline" @@ -2681,12 +3245,12 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-d188782061" + "X402TX-4c2fd60e66" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/exact/scheme_exact_svm.md", - "quote": "A version-1 transaction MUST contain 1 to 5 instructions in this order:", + "quote": "For a single-payee charge, a version-1 transaction MUST contain 1 to 5 instructions in this order:", "section": "3.1 Path 1 — Static Layout Verification (standard wallets)" }, "tier": "offline" @@ -3024,6 +3588,12 @@ "bugType": "settlement", "description": "Version-1 TransferChecked declaring 9 decimals for a 6-decimal mint. The transaction is the version-1 static layout (budget in the header, no ComputeBudget instructions), so the rule is checked independently of the message version. Mutation: transfer #0 TransferChecked decimals set to 9.", "expect": { + "alsoConformant": [ + { + "outcome": "accept" + } + ], + "alsoConformantReason": "§1.4 matches a transfer by mint, destination ATA and amount (“correct mint, correct destination ATA, amount >= required”) and the scheme never names the TransferChecked decimals; the token program fails a TransferChecked whose decimals differ from the mint's, which the sponsor's simulation catches (§2.2.3, not run by offline vectors), so a static verifier that leaves it to simulation is conformant.", "outcome": "reject", "rejectCode": "decimals-mismatch" }, diff --git a/harness/vectors/x402-upto-build.json b/harness/vectors/x402-upto-build.json index 9aeb1227a..0bfe6a707 100644 --- a/harness/vectors/x402-upto-build.json +++ b/harness/vectors/x402-upto-build.json @@ -1216,126 +1216,6 @@ }, "tier": "offline" }, - { - "bugType": "wire", - "description": "extra.recentBlockhash is not a live blockhash on the client's cluster (its RPC's latest is another). The blockhash alone binds the signed open to a cluster, so an open over it would escrow maxAmount on whichever cluster knows that hash rather than the offer's network: the client refuses the challenge before signing. Pair: x402-upto-build-accept. The client builds and signs the channel open from the challenge hints (no live RPC); the judge runs the Rust upto verifier on the SDK's header and compares the open with the kit's own build modulo the salt.", - "expect": { - "outcome": "reject", - "rejectCode": "invalid-challenge", - "rejectReason": "recentBlockhash unknown to the client's cluster" - }, - "id": "x402-upto-build-foreign-blockhash-reject", - "input": { - "nowSeconds": 1800000000, - "rpcFixtures": { - "mints": { - "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU": { - "decimals": 6, - "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" - } - }, - "recentBlockhash": "9zrUHnA1nCByPksy3aL8tQ47vqdaG2vnFs4HrxgcZj4F", - "slot": 400000000 - }, - "signerSecretKey": [ - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 234, - 74, - 108, - 99, - 226, - 156, - 82, - 10, - 190, - 245, - 80, - 123, - 19, - 46, - 197, - 249, - 149, - 71, - 118, - 174, - 190, - 190, - 123, - 146, - 66, - 30, - 234, - 105, - 20, - 70, - 210, - 44 - ], - "x402Offer": { - "amount": "1000000", - "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", - "extra": { - "feePayer": "7v54NWdBtkjuAFJrLGsS2SXnuk8nKam81mZJeeYxVFi9", - "receiverAuthorizer": "AoVsGaj8MSJ6xwKxfFxo9iZWH3enC8RRTXKH2fx2F8os", - "recentBlockhash": "11111111111111111111111111111111", - "recentSlot": "400000000", - "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", - "withdrawDelay": 900 - }, - "maxTimeoutSeconds": 300, - "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", - "payTo": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", - "scheme": "upto" - }, - "x402UptoExpiresAt": 1800000300, - "x402UptoRequestNonce": "request-7" - }, - "intent": "x402-upto", - "mode": "build-transaction", - "provenance": "generated", - "requirements": [ - "X402-eace5aece9" - ], - "role": "client", - "spec": { - "doc": "x402/specs/schemes/upto/scheme_upto_svm.md", - "quote": "The client builds an open transaction against the canonical payment-channels program, deposits maxAmount, sets payee and rent_payer to extra.feePayer, sets authorized_signer to extra.receiverAuthorizer, encodes grace_period = extra.withdrawDelay, and signs as channel payer.", - "section": "Phase 1 - Setup" - }, - "tier": "offline" - }, { "bugType": "wire", "description": "extra.withdrawDelay 0 is outside the scheme: the client refuses the challenge instead of opening a channel with no escape-hatch delay. The client builds and signs the channel open from the challenge hints (no live RPC); the judge runs the Rust upto verifier on the SDK's header and compares the open with the kit's own build modulo the salt.", diff --git a/harness/vectors/x402-upto-open-policy.json b/harness/vectors/x402-upto-open-policy.json index 782abb0de..29212ccec 100644 --- a/harness/vectors/x402-upto-open-policy.json +++ b/harness/vectors/x402-upto-open-policy.json @@ -700,12 +700,12 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402-c1174b72d8" + "X402-4de59a1f27" ], "role": "server", "spec": { "doc": "x402/specs/schemes/upto/scheme_upto_svm.md", - "quote": "The message MAY be legacy or version 0, but it MUST NOT contain Address Lookup Table lookups.", + "quote": "The message version MUST be one advertised in extra.transactionVersions (0 when the field is absent; see [Transaction versions](#transaction-versions)), and the message MUST NOT contain Address Lookup Table lookups.", "section": "Message and signer rules" }, "tier": "offline" @@ -1413,12 +1413,12 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402-c1174b72d8" + "X402-4de59a1f27" ], "role": "server", "spec": { "doc": "x402/specs/schemes/upto/scheme_upto_svm.md", - "quote": "The message MAY be legacy or version 0, but it MUST NOT contain Address Lookup Table lookups.", + "quote": "The message version MUST be one advertised in extra.transactionVersions (0 when the field is absent; see [Transaction versions](#transaction-versions)), and the message MUST NOT contain Address Lookup Table lookups.", "section": "Message and signer rules" }, "tier": "offline" @@ -4824,6 +4824,12 @@ "bugType": "auth-bypass", "description": "SetComputeUnitLimit 400000 and SetComputeUnitPrice 5000000: each at its absolute ceiling, but the sponsor would pay a 2000000 lamport priority fee. The sponsor bounds the fee it pays as limit times price (RULINGS S6): rejected as compute-price-over-cap. Pair: x402-upto-verify-compute-at-caps-accept. Verify is the read-only preflight of the deposit settle (Phase 3): every static check before co-signing, at the vector's clock (nowSeconds).", "expect": { + "alsoConformant": [ + { + "outcome": "accept" + } + ], + "alsoConformantReason": "the upto and batch-settlement schemes cap the compute unit limit at 400,000 and the unit price at 5,000,000 micro-lamports (or a version-1 priorityFee at 5 lamports per unit) and this transaction is within them; the 2,000 lamport cap on the total fee is pay-kit's stricter local policy, which the schemes allow but do not require (upto: “A sponsor MAY apply a stricter local policy for compute-unit limit, compute-unit price, and required-signature count”; batch-settlement: “A sponsor MAY apply stricter local compute-unit, priority-fee, or required-signature caps”), so a sponsor without it accepts (RULINGS S6).", "outcome": "reject", "rejectCode": "compute-price-over-cap" }, @@ -5004,6 +5010,12 @@ "bugType": "auth-bypass", "description": "SetComputeUnitPrice 5001 with no SetComputeUnitLimit: the runtime budgets 200000 units for each of the open and the memo, so the sponsor would pay 2001 lamports, one over its cap (RULINGS S6). A verifier that bounds only declared limits accepts it: rejected as compute-price-over-cap. Pair: x402-upto-verify-implicit-limit-at-fee-cap-accept. Verify is the read-only preflight of the deposit settle (Phase 3): every static check before co-signing, at the vector's clock (nowSeconds).", "expect": { + "alsoConformant": [ + { + "outcome": "accept" + } + ], + "alsoConformantReason": "the upto and batch-settlement schemes cap the compute unit limit at 400,000 and the unit price at 5,000,000 micro-lamports (or a version-1 priorityFee at 5 lamports per unit) and this transaction is within them; the 2,000 lamport cap on the total fee is pay-kit's stricter local policy, which the schemes allow but do not require (upto: “A sponsor MAY apply a stricter local policy for compute-unit limit, compute-unit price, and required-signature count”; batch-settlement: “A sponsor MAY apply stricter local compute-unit, priority-fee, or required-signature caps”), so a sponsor without it accepts (RULINGS S6).", "outcome": "reject", "rejectCode": "compute-price-over-cap" }, @@ -5709,7 +5721,7 @@ "role": "server", "spec": { "doc": "x402/specs/schemes/upto/scheme_upto_svm.md", - "quote": "An optional Compute Budget prefix containing at most one SetComputeUnitLimit instruction and at most one SetComputeUnitPrice instruction.", + "quote": "In a legacy or version-0 transaction, an optional Compute Budget prefix containing at most one SetComputeUnitLimit instruction and at most one SetComputeUnitPrice instruction.", "section": "Top-level instruction layout" }, "tier": "offline" @@ -5887,7 +5899,7 @@ "role": "server", "spec": { "doc": "x402/specs/schemes/upto/scheme_upto_svm.md", - "quote": "An optional Compute Budget prefix containing at most one SetComputeUnitLimit instruction and at most one SetComputeUnitPrice instruction.", + "quote": "In a legacy or version-0 transaction, an optional Compute Budget prefix containing at most one SetComputeUnitLimit instruction and at most one SetComputeUnitPrice instruction.", "section": "Top-level instruction layout" }, "tier": "offline" diff --git a/harness/vectors/x402-upto-txv1.json b/harness/vectors/x402-upto-txv1.json index df96311cc..71f34595c 100644 --- a/harness/vectors/x402-upto-txv1.json +++ b/harness/vectors/x402-upto-txv1.json @@ -238,7 +238,7 @@ "provenance": "generated", "requirements": [ "X402TX-61c735c7a9", - "X402TX-644919eb3b", + "X402TX-f9bcc1a14a", "X402TX-d444d01b9e" ], "role": "client", @@ -843,6 +843,9 @@ ], "x402ServerRecipient": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", "x402ServerTokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "x402ServerTransactionVersions": [ + 0 + ], "x402ServerWithdrawDelay": 900 }, "intent": "x402-upto", @@ -1022,6 +1025,9 @@ ], "x402ServerRecipient": "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY", "x402ServerTokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "x402ServerTransactionVersions": [ + 0 + ], "x402ServerWithdrawDelay": 900 }, "intent": "x402-upto", @@ -1210,13 +1216,13 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-936b492daa", + "X402TX-915632f040", "X402TX-125d312b26" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/upto/scheme_upto_svm.md", - "quote": "A version-1 transaction that contains a Compute Budget instruction MUST be rejected.", + "quote": "A version-1 transaction that contains a Compute Budget instruction MUST be rejected (an x402 sponsor rule; the runtime treats such instructions as no-ops).", "section": "Top-level instruction layout" }, "tier": "offline" @@ -1393,12 +1399,12 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-0f874a9c63" + "X402TX-703c03cfb5" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/upto/scheme_upto_svm.md", - "quote": "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed 400000, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= 5000000 computeUnitLimit.", + "quote": "computeUnitLimit (bit 2) MUST be set and MUST NOT exceed 400000, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy priorityFee * 1000000 <= 5000000 * computeUnitLimit, evaluated without overflow.", "section": "Top-level instruction layout" }, "tier": "offline" @@ -1575,12 +1581,12 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-0f874a9c63" + "X402TX-703c03cfb5" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/upto/scheme_upto_svm.md", - "quote": "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed 400000, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= 5000000 computeUnitLimit.", + "quote": "computeUnitLimit (bit 2) MUST be set and MUST NOT exceed 400000, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy priorityFee * 1000000 <= 5000000 * computeUnitLimit, evaluated without overflow.", "section": "Top-level instruction layout" }, "tier": "offline" @@ -1756,12 +1762,12 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-0f874a9c63" + "X402TX-703c03cfb5" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/upto/scheme_upto_svm.md", - "quote": "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed 400000, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= 5000000 computeUnitLimit.", + "quote": "computeUnitLimit (bit 2) MUST be set and MUST NOT exceed 400000, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy priorityFee * 1000000 <= 5000000 * computeUnitLimit, evaluated without overflow.", "section": "Top-level instruction layout" }, "tier": "offline" @@ -1770,6 +1776,12 @@ "bugType": "auth-bypass", "description": "A version-1 open at 200000 units with priorityFee 2001 lamports: far under 5000000 micro-lamports per unit, but one lamport over the cap the sponsor puts on the total fee it pays (RULINGS S6): rejected as compute-price-over-cap. Verify is the read-only preflight of the deposit settle (Phase 3): every static check before co-signing, at the vector's clock (nowSeconds).", "expect": { + "alsoConformant": [ + { + "outcome": "accept" + } + ], + "alsoConformantReason": "the upto and batch-settlement schemes cap the compute unit limit at 400,000 and the unit price at 5,000,000 micro-lamports (or a version-1 priorityFee at 5 lamports per unit) and this transaction is within them; the 2,000 lamport cap on the total fee is pay-kit's stricter local policy, which the schemes allow but do not require (upto: “A sponsor MAY apply a stricter local policy for compute-unit limit, compute-unit price, and required-signature count”; batch-settlement: “A sponsor MAY apply stricter local compute-unit, priority-fee, or required-signature caps”), so a sponsor without it accepts (RULINGS S6).", "outcome": "reject", "rejectCode": "compute-price-over-cap" }, @@ -1938,12 +1950,12 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-0f874a9c63" + "X402TX-703c03cfb5" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/upto/scheme_upto_svm.md", - "quote": "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed 400000, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= 5000000 computeUnitLimit.", + "quote": "computeUnitLimit (bit 2) MUST be set and MUST NOT exceed 400000, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy priorityFee * 1000000 <= 5000000 * computeUnitLimit, evaluated without overflow.", "section": "Top-level instruction layout" }, "tier": "offline" @@ -2120,13 +2132,13 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-0f874a9c63", - "X402TX-644919eb3b" + "X402TX-703c03cfb5", + "X402TX-f9bcc1a14a" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/upto/scheme_upto_svm.md", - "quote": "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed 400000, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= 5000000 computeUnitLimit.", + "quote": "computeUnitLimit (bit 2) MUST be set and MUST NOT exceed 400000, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy priorityFee * 1000000 <= 5000000 * computeUnitLimit, evaluated without overflow.", "section": "Top-level instruction layout" }, "tier": "offline" @@ -2303,13 +2315,13 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-0f874a9c63", - "X402TX-644919eb3b" + "X402TX-703c03cfb5", + "X402TX-f9bcc1a14a" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/upto/scheme_upto_svm.md", - "quote": "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed 400000, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= 5000000 computeUnitLimit.", + "quote": "computeUnitLimit (bit 2) MUST be set and MUST NOT exceed 400000, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy priorityFee * 1000000 <= 5000000 * computeUnitLimit, evaluated without overflow.", "section": "Top-level instruction layout" }, "tier": "offline" @@ -2485,12 +2497,12 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402TX-0f874a9c63" + "X402TX-703c03cfb5" ], "role": "server", "spec": { "doc": "x402-txv1/specs/schemes/upto/scheme_upto_svm.md", - "quote": "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed 400000, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= 5000000 computeUnitLimit.", + "quote": "computeUnitLimit (bit 2) MUST be set and MUST NOT exceed 400000, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy priorityFee * 1000000 <= 5000000 * computeUnitLimit, evaluated without overflow.", "section": "Top-level instruction layout" }, "tier": "offline" diff --git a/harness/vectors/x402-verify-mutations.json b/harness/vectors/x402-verify-mutations.json index ea22fd640..52dddc0e8 100644 --- a/harness/vectors/x402-verify-mutations.json +++ b/harness/vectors/x402-verify-mutations.json @@ -859,6 +859,13 @@ "bugType": "settlement", "description": "The transfer pays one base unit more than the route amount; §1.4 tolerates overpayment. See RULINGS S5: default verifiers accept overpayment. Mutation: transfer #0 pays 1 base units more than required.", "expect": { + "alsoConformant": [ + { + "outcome": "reject", + "rejectCode": "amount-mismatch" + } + ], + "alsoConformantReason": "§1.4 tolerates overpayment, but §3.1 also reads “Fee payer isolation, destination ATA derivation, and exact amount match are enforced on both layouts” and §2.3 lets a sponsor's policy refuse a scheme-valid transaction (“A transaction MAY be valid under the `exact` scheme while being rejected by a sponsor's policy.”), so a sponsor that requires the exact amount is conformant too (RULINGS S5).", "outcome": "accept", "x402EnvelopeShape": { "hasAccepted": true, diff --git a/harness/vectors/x402-verify-policy.json b/harness/vectors/x402-verify-policy.json index 6d0f839a0..40c597669 100644 --- a/harness/vectors/x402-verify-policy.json +++ b/harness/vectors/x402-verify-policy.json @@ -104,7 +104,7 @@ "provenance": "generated", "requirements": [ "X402-a1cf65b0f0", - "X402-a8bd75d71b" + "X402-05c2aacafc" ], "role": "server", "spec": { @@ -209,12 +209,12 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402-a8bd75d71b" + "X402-05c2aacafc" ], "role": "server", "spec": { "doc": "x402/specs/schemes/exact/scheme_exact_svm.md", - "quote": "The decompiled transaction MUST contain 3 to 7 instructions in this order:", + "quote": "For a single-payee charge (no extra.splits and no ATA creation), a legacy or version-0 transaction MUST contain 3 to 7 instructions in this order:", "section": "3.1 Path 1 — Static Layout Verification (standard wallets)" }, "tier": "offline" @@ -314,12 +314,12 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402-a8bd75d71b" + "X402-05c2aacafc" ], "role": "server", "spec": { "doc": "x402/specs/schemes/exact/scheme_exact_svm.md", - "quote": "The decompiled transaction MUST contain 3 to 7 instructions in this order:", + "quote": "For a single-payee charge (no extra.splits and no ATA creation), a legacy or version-0 transaction MUST contain 3 to 7 instructions in this order:", "section": "3.1 Path 1 — Static Layout Verification (standard wallets)" }, "tier": "offline" @@ -419,12 +419,12 @@ "mode": "verify-transaction", "provenance": "generated", "requirements": [ - "X402-a8bd75d71b" + "X402-05c2aacafc" ], "role": "server", "spec": { "doc": "x402/specs/schemes/exact/scheme_exact_svm.md", - "quote": "The decompiled transaction MUST contain 3 to 7 instructions in this order:", + "quote": "For a single-payee charge (no extra.splits and no ATA creation), a legacy or version-0 transaction MUST contain 3 to 7 instructions in this order:", "section": "3.1 Path 1 — Static Layout Verification (standard wallets)" }, "tier": "offline" @@ -753,6 +753,12 @@ "bugType": "settlement", "description": "The static layout's 200,000 compute unit limit paired with a 5,000,000 micro-lamport unit price: each is within its own cap, but the sponsor would pay a 1,000,000 lamport priority fee. The sponsor bounds the fee it pays as limit times price (RULINGS S6). Differs from x402-exact-v2-verify-accept only in the price. Mutation: compute unit price set to 5000000 micro-lamports.", "expect": { + "alsoConformant": [ + { + "outcome": "accept" + } + ], + "alsoConformantReason": "scheme_exact_svm.md §2.2.1 bounds the compute unit limit and the unit price separately (reference defaults 400,000 units and 5,000,000 micro-lamports per unit) and this transaction is within both; the 2,000 lamport cap on their product is pay-kit's stricter sponsor policy (§2.3: “Sponsors MAY introduce stricter limits but MUST NOT relax the §2.1 MUSTs.”), so a sponsor without it accepts (RULINGS S6).", "outcome": "reject", "rejectCode": "compute-price-over-cap" }, diff --git a/playground/app/package.json b/playground/app/package.json index c91cb4dc9..e2850de7b 100644 --- a/playground/app/package.json +++ b/playground/app/package.json @@ -14,8 +14,8 @@ }, "dependencies": { "@noble/hashes": "1.8.0", - "@solana-program/token": "^0.11.0", - "@solana/kit": "^6.5.0", + "@solana-program/token": "^0.18.0", + "@solana/kit": "^8.5.0", "@solana/mpp": "link:../../typescript/packages/mpp", "@solana/pay-kit": "link:../../typescript/packages/pay-kit", "highlight.js": "^11.11.1", diff --git a/playground/pnpm-lock.yaml b/playground/pnpm-lock.yaml index df3a28487..e62be3cca 100644 --- a/playground/pnpm-lock.yaml +++ b/playground/pnpm-lock.yaml @@ -38,11 +38,11 @@ importers: specifier: 1.8.0 version: 1.8.0 '@solana-program/token': - specifier: ^0.11.0 - version: 0.11.0(@solana/kit@6.10.0(typescript@5.9.3)) + specifier: ^0.18.0 + version: 0.18.0(@solana/kit@8.5.0(typescript@5.9.3)) '@solana/kit': - specifier: ^6.5.0 - version: 6.10.0(typescript@5.9.3) + specifier: ^8.5.0 + version: 8.5.0(typescript@5.9.3) '@solana/mpp': specifier: link:../../typescript/packages/mpp version: link:../../typescript/packages/mpp @@ -674,18 +674,18 @@ packages: '@scure/bip39@1.6.0': resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} - '@solana-program/system@0.12.2': - resolution: {integrity: sha512-MaBeOxlvTruQhA7UYkOb3hVTEHPPagOtd+PvTm6a8rGgvEAP0kD4BbC37NceOaR4ABNqdaCmD5OMVRKgrE6KAg==} + '@solana-program/system@0.16.0': + resolution: {integrity: sha512-/RG6q2E2vG/XpdOt8Jj/kbQktPlL5JyJuNGAeN9wDcxKDKQtrGTJpDrJgQUxiEy23fsPNXQbLN8XeCtYoMof3Q==} peerDependencies: - '@solana/kit': ^6.4.0 + '@solana/kit': ^8.5.0 - '@solana-program/token@0.11.0': - resolution: {integrity: sha512-/lB72Pcmkn5kjUfP1Vd8F86HBlhN9RN4hJYgUG5csc23w9LCdYom2CiRdGsK25KkR9UFf6ndCCAMh83hMo+ftw==} + '@solana-program/token@0.18.0': + resolution: {integrity: sha512-YNN13I4BxBnGPGk0NzP/LLQMCmJVdunbtgqjl7/Gfp1fDXQrKXh9df8xu+2ayNdvjGJYC4c9D5vZpVetHdyJaQ==} peerDependencies: - '@solana/kit': ^6.1.0 + '@solana/kit': ^8.5.0 - '@solana/accounts@6.10.0': - resolution: {integrity: sha512-+FxfDOrnifoPlBkF+fr8eeQdgM6xtIgAg9xKMu3WnIz60oZd4Xnry6+ff6t+ePPoZZp397FSg9ZJet68VCWm5Q==} + '@solana/accounts@8.5.0': + resolution: {integrity: sha512-vwwXYCobg1oG4kFeUEsGiNORjPujI2ff3yKLp6lCa7QBIlKaD7kZ2QRI3PZFYcNrMJ6HYNwNeZXR7ixg02pWdA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -693,8 +693,8 @@ packages: typescript: optional: true - '@solana/addresses@6.10.0': - resolution: {integrity: sha512-vEoCGBTxG0HCERAn84KXkrJjl+pDaNzOpZ0qbgcPS98fYxP5yzbKB8SNOY2bzrbkRUmmw5Q3hqTRERemUN2Gcw==} + '@solana/addresses@8.5.0': + resolution: {integrity: sha512-LwTrDbDSJBng9y0vwiKqb/kSS9daspTGrSYoZPafeMWpAlpmutdD1KXPDHVTa4Xz00hcAfOJXYxRXX5VAoiOag==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -702,8 +702,8 @@ packages: typescript: optional: true - '@solana/assertions@6.10.0': - resolution: {integrity: sha512-lKSAdVo+P/6Lp4vs6shstXmFOpvxrABwn4o1462tb7sKkNapk6o9pPFVPGw4DUgPS3WqWRs1j2tmpuVjhQRntg==} + '@solana/assertions@8.5.0': + resolution: {integrity: sha512-EZDY5rJIV8Mv9xYJ7P+jvE5pihG7pmKZ6pTqbunba/4uZSQN4Klw0FX54LDDklfDvhzmAdXN0nYAnjovTGAPEg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -711,8 +711,8 @@ packages: typescript: optional: true - '@solana/codecs-core@6.10.0': - resolution: {integrity: sha512-nfAl9OMGo4HanIMxGsQoVB7BxMoqBCYEUxl8oEAZZ09pDxnaXQZkTRXEwPPccag37XfW1ciPd1vWPKwB2b0HHQ==} + '@solana/codecs-core@8.5.0': + resolution: {integrity: sha512-ou38qNrf9XOzCWsu/I4sTzRmnrKqhblwMVvpXwXPKAAUZwkSAKQXonwgZFY68I5HK6nkfq1NLWfZFmTEIZYLiw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -720,8 +720,8 @@ packages: typescript: optional: true - '@solana/codecs-data-structures@6.10.0': - resolution: {integrity: sha512-CNasJW3bq5u+632Zt5aJ8rOjAjv2HyenpV8o9kAIqdmV4CBpjCCoBnKn8LkuR/sbeREZxJYfhKTXO/9ruAkw7A==} + '@solana/codecs-data-structures@8.5.0': + resolution: {integrity: sha512-CnnNriyltkgxZAKgAJoVRsRnrtdW4KCX37BUoIsquCM+AgSvhSbxaZNz0iaHjGOX7o1Z4s6+j7nAUgad0N/w5A==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -729,8 +729,8 @@ packages: typescript: optional: true - '@solana/codecs-numbers@6.10.0': - resolution: {integrity: sha512-CcM+wX4zOiA9zkh8A7t1787A0Ehgmu5+6Z2tKoHew6cNw/dkaUTPa8JnNHbvfsLC8dfHC1BhAEJl86sKmRsfkQ==} + '@solana/codecs-numbers@8.5.0': + resolution: {integrity: sha512-6Vtf52rHzjf98ykejn9bNGMaQ2k1f4UMIa+BGMbBy4mIRQ5ggdI5oCAb3sZPfJcel2JQHwDlsLHCYdpqC+n6Mg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -738,8 +738,8 @@ packages: typescript: optional: true - '@solana/codecs-strings@6.10.0': - resolution: {integrity: sha512-zlaqkg7K6F6IN4V/Ec8TWkTn054gxv7ZLagvGkuEyAdPQ6BzzsehOm2TqCuyXgJJTCGPLY1bEk6yH9NxANe0kA==} + '@solana/codecs-strings@8.5.0': + resolution: {integrity: sha512-9lCSCUVkbPLb1o9PLDsaOatdVgrUqqWMrAqJvZPyyuvrC5++wPuKRIGq+5iU3lICY+AwWxrzVyiwdu4xaZVCiw==} engines: {node: '>=20.18.0'} peerDependencies: fastestsmallesttextencoderdecoder: ^1.0.22 @@ -750,8 +750,8 @@ packages: typescript: optional: true - '@solana/codecs@6.10.0': - resolution: {integrity: sha512-lLVuxod4ChWp9i7OvpgIykYG8Q9OGPVXKnHM9VlzDDLylsx7Y1FoQL00sHa7PqFkJVmkBufaA6dcGbQ7FU+lAQ==} + '@solana/codecs@8.5.0': + resolution: {integrity: sha512-wALOoEuL7HAaahZnrhxCwYz10p23hku/LPNfXjlvwgjVYJL08PH3uyWDFO8e9zhcNLOaR13IREE9z8zPUhJjDQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -759,8 +759,8 @@ packages: typescript: optional: true - '@solana/errors@6.10.0': - resolution: {integrity: sha512-KBLAxCtAXr357JNhCyIDQXWbuSj5vN6w+28FSfcYY6OOSiphmXLAV3V58jgV0C6iNbIzFJFi6yatFyDTdeJsNg==} + '@solana/errors@8.5.0': + resolution: {integrity: sha512-y/XTiwAZsm2kHoEDJ3ac3NUq/0E4uCbOnBe2m5mmBXF3TGmF562tDKgN5pQ+thiRABvi7b2LqwTBCg4kAdtgRg==} engines: {node: '>=20.18.0'} hasBin: true peerDependencies: @@ -769,8 +769,8 @@ packages: typescript: optional: true - '@solana/fast-stable-stringify@6.10.0': - resolution: {integrity: sha512-iCNed27wk6PKSS3QUtHovRfMWF/jbVWogs2vB4tukKUCsqG4rDfDInIwZ6ur/nY6XTrgi2gMMdZq9GAUlWsbfw==} + '@solana/fast-stable-stringify@8.5.0': + resolution: {integrity: sha512-CTIoOwJ0NScrB8KTzr/V4PJrNHrBAz1zvamM0opgDPQZGzLrBhca1e4eQcGmF6o7Dv3Ve0HdvDJx0B2uG6YxVA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -778,8 +778,8 @@ packages: typescript: optional: true - '@solana/fixed-points@6.10.0': - resolution: {integrity: sha512-ZkKL0alXH3L7/wMiVG8YUuG8qBKunlM810+YBD7nUPRhifiGsX1zwADViHLYNqLr/jUk0mTYFUcKznTpB/K+Gg==} + '@solana/fixed-points@8.5.0': + resolution: {integrity: sha512-hkB7dUAD/oxXeNOvdMXVqfKZAvOJ1o50gBwzh8yLP1ihdSxVgssb36Vg7806C5HzmIxmTKZclJJokG0cRUXVSw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -787,8 +787,8 @@ packages: typescript: optional: true - '@solana/functional@6.10.0': - resolution: {integrity: sha512-P8cevu4mAqHTXC37h1TVoOh8zhWB2tlOI/R9vWjYPpcLwcyWf8p2qq4LEGHl5kY+1C+4PNX39HsmCocXOPCDkQ==} + '@solana/functional@8.5.0': + resolution: {integrity: sha512-+8pgF1rVW78FfT0d+ceADFLKpSh/8/o9Ldx5tEkI6paiv0QeClL1rlU5nFs5tjoFkf+92x8PpiLEEGkm0CifOQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -796,8 +796,8 @@ packages: typescript: optional: true - '@solana/instruction-plans@6.10.0': - resolution: {integrity: sha512-YG7mo4zykzdc6ZTV0BuN6pveK9qeBySzlYYerq578A4eQu3xcypMAYRGAvhMZtWTanjjmD6CKtM0M7kVp0TNxg==} + '@solana/instruction-plans@8.5.0': + resolution: {integrity: sha512-cES8TzRGuJ5cdVn3hr6GskwwG68rLd8R0FqmzB9NeU/nzPnW/50nRrg36DYX1Nh+OwuU/ehg6zkNNu1Vo72lKQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -805,8 +805,8 @@ packages: typescript: optional: true - '@solana/instructions@6.10.0': - resolution: {integrity: sha512-0TToYF+8LXQ3ofPMx+yF6yaM9l4YJvcAPMy0qV5JsrBUFlWXBSANRuudKBQLHMvb+a3OiUTq5X7omuorKMBB3A==} + '@solana/instructions@8.5.0': + resolution: {integrity: sha512-LSMOQRicz8OalMM2DT60PtAaPjvkHPhIvmPEI8KpyWOuNRwABJBRAfn5ypcdSa69VVj4IdOY10tDWZzjN4dviA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -814,8 +814,8 @@ packages: typescript: optional: true - '@solana/keys@6.10.0': - resolution: {integrity: sha512-26IRfdm/hTUCmM7MeEeX0ULSbCM6OzkZTkfkrPircqmRM7xyNqP4hq7u0P7wjb9dl7NfgyG6K7cdvUxrj2e3mA==} + '@solana/keys@8.5.0': + resolution: {integrity: sha512-mq6amguPYLklpAOC9A+boXQhpcHGjcn4QN40J0l1TvUkfWyFJ4HBbNb35fyWldqqDUV5ujOpaPZmmVvWJBK2Kw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -823,8 +823,8 @@ packages: typescript: optional: true - '@solana/kit@6.10.0': - resolution: {integrity: sha512-/WnnQp3uARh2JCFSfAakejTAqwmXVuMVTcRn5r2yDwY2yzZ4R6mt/Cl59VPimVLNSoTyN/KsEwhv9omr3ERazQ==} + '@solana/kit@8.5.0': + resolution: {integrity: sha512-bMnXXADeyZFe3XyqzPhlQAIsmPYRiojaRO4JQxwGOmMwiQ5f13ZQodmsOqnt8W/n40P7r/+/pDqWuqG0TUv+yA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -832,8 +832,8 @@ packages: typescript: optional: true - '@solana/nominal-types@6.10.0': - resolution: {integrity: sha512-9ykyBBvnkInH7fCacjJi7zu2PJyd+OCt+VTjIISv070fHzKIMFqZqJJ/dJ0SRH2aHwfB3n86iVsmtBtuxi4KKA==} + '@solana/nominal-types@8.5.0': + resolution: {integrity: sha512-OfTZ+w/C59Zkp51RJ3dzn2GXUojf9p/PMmSrOpxrj+hci3bdh4e6XDGY+mvP8HGPH+m0nfKWTBCygEslfoX6bg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -841,8 +841,8 @@ packages: typescript: optional: true - '@solana/offchain-messages@6.10.0': - resolution: {integrity: sha512-RiEgAueeMkFMC1suOXBIcmCZgtXRxy24yk0DldPB37bB4zwOF1SAaRjNRPjIkGK8RhCYrEpPosnzLyavw9ueRg==} + '@solana/offchain-messages@8.5.0': + resolution: {integrity: sha512-C7qBBD1Gfbdv99uoQnuc8XZYwttTQJOYEG2v6z7q3mAL03PN7zdItAlBa+M2tpeRKjTJObRYnUUJDfiIyyGD/Q==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -850,8 +850,8 @@ packages: typescript: optional: true - '@solana/options@6.10.0': - resolution: {integrity: sha512-RO9UT3UYD8/Cu2uM6ZXbKvLeMnVD42+g9JRds7Pfs4AhiOyg4R4TJrQUAppTgavPTO3PBRlWtWOC05ZH/yAIbg==} + '@solana/options@8.5.0': + resolution: {integrity: sha512-Ron9FrWDkwxlmuI6D+NmrZZRngC1MUncglgyN77ThAoxDE1gGMOB88mQvEILeeqONeTA1rDg1uBvbewQcILp+w==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -859,8 +859,8 @@ packages: typescript: optional: true - '@solana/plugin-core@6.10.0': - resolution: {integrity: sha512-JE70YTQOfFACVFGvoJon4Scc/eHUWjMu8Ovo35CcV2kHTAHYMCd4UkBd2gmlhK0vRMMomsQi1ZLPlAlTq0OoUQ==} + '@solana/plugin-core@8.5.0': + resolution: {integrity: sha512-1zmh+UC47yxsZHleDpH4AEVkm9yXIATkWm8v33DJuXaqX3TQXMXuxP39cXAyObIQEpCG8DK8lyAeFTUrIFcDmA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -868,8 +868,8 @@ packages: typescript: optional: true - '@solana/plugin-interfaces@6.10.0': - resolution: {integrity: sha512-vr0/l9wcM4orwGr8cjkFWaJ9A4HvzuAv00jMFNMg0Spd0GZqnwnpW+D/fXa1lIJnTRaF3EeEjLh4VjKU037T0Q==} + '@solana/plugin-interfaces@8.5.0': + resolution: {integrity: sha512-+s/+cCuzk23/a1ViTIugvXFYHN0txxmvqfuL4qx81NlmGawqEYws6xD+L02wNzJ5rbJeAaBhw2pUFStMfG4vYg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -877,8 +877,8 @@ packages: typescript: optional: true - '@solana/program-client-core@6.10.0': - resolution: {integrity: sha512-4PPbTLdC1ylHIuvhOFDP8RnSkXPCFjNFWGslzc+UFKnoR4ajzBcByX94jmaruDMk5ncxgj7tr9pzJTvfGHIaMA==} + '@solana/program-client-core@8.5.0': + resolution: {integrity: sha512-HJcnbuvQRcWOV3nTUjzgmQRIs0Of1973UU8uOvSEEW7rxycQwNxJ7fVgxQ5sYOCbT+7rlqqTkDeczvB7I4OwoA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -886,8 +886,8 @@ packages: typescript: optional: true - '@solana/programs@6.10.0': - resolution: {integrity: sha512-qn/HeLP5KGUJXVub3fyGe69/rWaLX4jzwm6V/1pNxJDbdF+MBdgn18hP6F+VmhfdNmwK0lue3J/1HQ1UTMuQeQ==} + '@solana/programs@8.5.0': + resolution: {integrity: sha512-8PC2E/d5rwCRw1tFwQlpG65YDN56bYmPiBl99QqCP2RzhNdFJ/52xgFumL2G0uLfD3xsuFaWuOIGNxkyfXYm/Q==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -895,8 +895,8 @@ packages: typescript: optional: true - '@solana/promises@6.10.0': - resolution: {integrity: sha512-oJSIn+VBBMWDo8oqw7RV3tI6Jih+Ieup6FcQLYLDUriaeo7+8l1Zdezl8zh7SIfeU4lOfAbRg6mR0huaS/Lltg==} + '@solana/promises@8.5.0': + resolution: {integrity: sha512-qWJbU6RGuZVrtvsGZ+2F46jccaIZDX4czYRRhS3m38cCdE+wKMbqGvWND50xP7D9egOxYKHMqJAJbLQH4gspvQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -904,8 +904,8 @@ packages: typescript: optional: true - '@solana/rpc-api@6.10.0': - resolution: {integrity: sha512-RjPIVsAb/85P1ptoO3WpC0x7QG6gG/e4q/3lo6gbSznUZOcoM+8sSBnCX7BwP1ZkCDS6NK/ClXLnhhhYZx+OGg==} + '@solana/rpc-api@8.5.0': + resolution: {integrity: sha512-qlRZ2yC8WEWNg3VX8UEqlZOitKZaeE6KWbn3A/ybtJAYz+mvr3RMDhnQ89RDqIuxPuAFZNV21BRJv3yB9xR44Q==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -913,8 +913,8 @@ packages: typescript: optional: true - '@solana/rpc-parsed-types@6.10.0': - resolution: {integrity: sha512-5275mvSV1mxhwvrMVa+K7BU/nAetpHfcb+8Ql9rtA8RRf6DyiimFQFZUukE4Ez6XJihEpCHNy98yhkgai9wytQ==} + '@solana/rpc-parsed-types@8.5.0': + resolution: {integrity: sha512-ktygZ019trgAyjr8y1GN1x4x6wJYw2Ola6UogAfJT5LoNs6kV3k84yCNAlGv34xRPqCVxlWo4nsIWJf8yWQQ2w==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -922,8 +922,8 @@ packages: typescript: optional: true - '@solana/rpc-spec-types@6.10.0': - resolution: {integrity: sha512-NDZrKyZrJk4HaMFhTE/lAiMB824cWAodKqDHyKi0UteHU9pyRmil3BN1jt7e+j08mwMWwfklSgyrTaq52g6DIQ==} + '@solana/rpc-spec-types@8.5.0': + resolution: {integrity: sha512-YUTMKWWlHCGBmA1wxhIilbxJlad5vEsvc8dDO9VWr7GVkQUlipEU79iGaKk4xQ6Oo1mZWxpGz5mAJUqGraTK4A==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -931,8 +931,8 @@ packages: typescript: optional: true - '@solana/rpc-spec@6.10.0': - resolution: {integrity: sha512-yQdbWw5mZEWrwsunHR9NHkuhMXIB9sPOObwm18D53v5tAJnxTB0IcHvO647XqFDLTK/yQ4AdDtlYD1vsY07AMQ==} + '@solana/rpc-spec@8.5.0': + resolution: {integrity: sha512-0oET5yc880zFGqBMJE2UB7sxW8sIs4hmsP4bmkR2y4ipm1aScC5U+Rd8GaIrupBOVOFj+RXIorC7kQycN/9nhw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -940,8 +940,8 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions-api@6.10.0': - resolution: {integrity: sha512-CRPQoTtT1cOwOQUsqS7jgo7wYdAj7jB5ab/UmMPWVpecf2FNMhWhgvxP2s82M7VkDGTGl13qaQ0WySmi7Egrlg==} + '@solana/rpc-subscriptions-api@8.5.0': + resolution: {integrity: sha512-PJaAyqZkpG8vuzdxmdWMwp1JS5pyZ6PuL8OMhx6nCt3phkseqIs1NmAf8pQc/RZjIV3hJMMVCwSDG1DE8DY64w==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -949,8 +949,8 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions-channel-websocket@6.10.0': - resolution: {integrity: sha512-KkqP1186HELPlJftA88SNAT2znR8knCVzsUipXVzY4zfW8sN3LOa0ePMzh9VZ/V+J+raTt55laR87ovAO0n+zw==} + '@solana/rpc-subscriptions-channel-websocket@8.5.0': + resolution: {integrity: sha512-sRYYwBFg31z77zfKpJBcAO9MaUWa+bO1PlBcDiToa4luXGuR3dC8TSpi1Yip4T4NCONNzK3yhyeI6sHhGHc8Qw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -958,8 +958,8 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions-spec@6.10.0': - resolution: {integrity: sha512-nWMwGaG4ulzeX2sskY5TywXF3cwEd8FDmUpLe2JBWxE8XDAOGOKcsYPYFcBgb8ee9KqfPT2PTNdcz9jOhJf34w==} + '@solana/rpc-subscriptions-spec@8.5.0': + resolution: {integrity: sha512-YdCPLHOcQWz8JhMaT/E+YC56nFDJ6D+XOTr6qRWHGe/1PIYGQDVvaFzI7+tF0b6tuv49GoMbpGdkiTX2v6KeUw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -967,8 +967,8 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions@6.10.0': - resolution: {integrity: sha512-6mfuHp/K7unFKCOTCCBC9ziEGnxe2tyJ74EbR51QUnBeCUdYD7Hhdpxic1WRSJ3UeNW/mG4OzFM6z8Wi64Eh9Q==} + '@solana/rpc-subscriptions@8.5.0': + resolution: {integrity: sha512-8hdWSDKKtMK3kRrR8TExwFo/bWHxVTu4zJ/JkePTQgNtm95kX25/hy+9JHKRtSsNUfXXYM60sQVE18cGgMU7dA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -976,8 +976,8 @@ packages: typescript: optional: true - '@solana/rpc-transformers@6.10.0': - resolution: {integrity: sha512-2nFUrVTiE720pJOY4XKx3HuYmishw0of/4oScu76YGm6O8wsmvFvPNAkrEinmieWXQkfpBfRvLZmpl8PaAy+ug==} + '@solana/rpc-transformers@8.5.0': + resolution: {integrity: sha512-JYq+EyfzJ1ksZubU9VHynQY1Z3k1tosdxG6KE4Cua/rFuXPosSn7o5h9FLLbSB5cTVcnj0lGNrBaVYW4AVK4iA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -985,8 +985,8 @@ packages: typescript: optional: true - '@solana/rpc-transport-http@6.10.0': - resolution: {integrity: sha512-JrdNuYi0nBbD3X8JUtgX1dQJwIwz/WJvmigDdELysXfGB2bTJpfjqGDLhCLOz2sRl66FASIEqgG/LVa2C9VXcA==} + '@solana/rpc-transport-http@8.5.0': + resolution: {integrity: sha512-xfIFZa+oxXLgA6BXaE2bXjiy2yZM1qO1URzzF0lmTekJM/okS8EZAQwEicWpYkvfdHJZ2x/oagD3AOSBBCWrsw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -994,8 +994,8 @@ packages: typescript: optional: true - '@solana/rpc-types@6.10.0': - resolution: {integrity: sha512-zaSecTfCPvz/vcoAmKD6XoRstGHTr1EKJBD8T9UcpEFFB6CtF6DxerDB+wrzkamuT6msmnR2DWXMrYOGDAsgIg==} + '@solana/rpc-types@8.5.0': + resolution: {integrity: sha512-L050pZqQ8gaFABF26NAYoatyZZeJo52AKvQQ3i58LRtUc6wcrpCF+4x4U/EDER2YVAc6Qx1xWvGnAomGhI6vzw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1003,8 +1003,8 @@ packages: typescript: optional: true - '@solana/rpc@6.10.0': - resolution: {integrity: sha512-EwxsqoD+NXV+m+iobnWNtATD93gTgaNsOiQOzYB1/2e+8S6fl6obdNPB55yfXgtl4jt6GV6/ae4xuPhLv76vvg==} + '@solana/rpc@8.5.0': + resolution: {integrity: sha512-7CQFNOMhXrY/LT0qdsi3h0chy4A/Ao93pyBLqFQqxzlub0st8dC5wl+MDXhkxaBos/DZOu1V4EleWv6qbLMlow==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1012,8 +1012,8 @@ packages: typescript: optional: true - '@solana/signers@6.10.0': - resolution: {integrity: sha512-+vtCc+mT1FpGxrA5oL2aaMxSHiMJ2hH5PcDIfjo2XJkHz2klZiCZyT5F9+zpltc9vdi1QTElQq59Sfplmtd33A==} + '@solana/signers@8.5.0': + resolution: {integrity: sha512-F9VvFsG9Av+Sbs4mQpuVlszb6msujxnqKQqa4TsRT24GOqKOFr4Xvs7HqgVJV/BPIDnz7u0omUhUILesHJDfkQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1021,8 +1021,8 @@ packages: typescript: optional: true - '@solana/subscribable@6.10.0': - resolution: {integrity: sha512-VsR6XMwkiDBkZJUcoGkEOhf397pOV75gKCL9Bx8bpi2T3Bbs0CxUpMn4yaUgAnRba3eXmjbXMNCXjttfa6sKbw==} + '@solana/subscribable@8.5.0': + resolution: {integrity: sha512-v1/hL/l4kubwYVuaMNmtQcmTgDuKG6e9Hjv9fCxkYCdDIUERgmm9DX/So1386+6rkQBVRC7wTSH86Jq+RIqNGQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1030,8 +1030,8 @@ packages: typescript: optional: true - '@solana/sysvars@6.10.0': - resolution: {integrity: sha512-cG13p1+onxz+20iWjwWQr1Z1jQwPm0fnjoW75fqZq7p4rVCie3L2sXvaJsYPjWKrUvpOzOIEHnqZGkG05rCpjg==} + '@solana/sysvars@8.5.0': + resolution: {integrity: sha512-vidKFEOAujEVizDUHFCmmIpHsS3Zu/fXJKcDUtbUn+bwD9Z1fRiper8rZW3Qdtgu1GmrH3O8MoyL2Nrp7k6QNw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1039,8 +1039,8 @@ packages: typescript: optional: true - '@solana/transaction-confirmation@6.10.0': - resolution: {integrity: sha512-ULvtg65qfenh4T/GYcIlKSUv5EqDcng9UN0dxbHU4kuZdR2e0B8HN2xDC4WhcFQVeFJSbTZmaYFkeTY/Y4gfGQ==} + '@solana/transaction-confirmation@8.5.0': + resolution: {integrity: sha512-dUVHhyaJ9tt535ZJfgPAdKo6zycCAn1mqKKP/FYvCz/4FiAKnyvqj8rxd66yvvuJVhkpjbcPDDagm/P8JEYUug==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1048,8 +1048,8 @@ packages: typescript: optional: true - '@solana/transaction-messages@6.10.0': - resolution: {integrity: sha512-s7v8G3BTxGlKYIj3eWCG0g1296v+1LBt16mVnlRH5FuyaJ5AdhlhtRho5HUDpdwE8EXun+y1c48V6uhcZ8wdbQ==} + '@solana/transaction-introspection@8.5.0': + resolution: {integrity: sha512-VPYVLcpieu5YwwC1wmh3zZ/KHWmqJWPS7iMPVpf90L79/1Dvkg+YYQHnVeN4VQdb7VFnfpTqUnSQpfERDk0Sag==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1057,8 +1057,17 @@ packages: typescript: optional: true - '@solana/transactions@6.10.0': - resolution: {integrity: sha512-VADSqP9OTYmhrox4pcgDd4+RjVmednXSE0+8Y7SPK4PN1pK5Az2RJ0nSsy0xcTnaOr8mF/crwFktqPrRQwSbQA==} + '@solana/transaction-messages@8.5.0': + resolution: {integrity: sha512-8SHxirU5K0kFmOwwD6XTGI5LWP/bLvLBDbemT4xDOaL+6xkLzlTMtzlgKb/Td5UtqyYOoew0FBVLJzJx/QApOw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transactions@8.5.0': + resolution: {integrity: sha512-IGRWI38rq5b94gy93wn/gVSQBuwNPSUv3GnWkd6R6Tc7jLbfRlYbYHJNHH5o28Fmlr+nlEn4bgu3BiqMWxuLmg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -1716,8 +1725,8 @@ packages: undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} - undici-types@8.5.0: - resolution: {integrity: sha512-+FxhD+5RUdCZHlVPt+pd0DaYYHBPsgoHovxhMnFq9R1SOejHGE4ma0swzuRoKhOisEzsjFWdFedyD0JQmftrHg==} + undici-types@8.12.3: + resolution: {integrity: sha512-EXE4ydL3S76dFb27UFjNVZHTyv/TLdATj/KUe29ptdcg6qXL48J2tZ3126E5kICj5jn781OR+XlVH1N6Mz8jbA==} unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -1813,6 +1822,18 @@ packages: utf-8-validate: optional: true + ws@8.22.0: + resolution: {integrity: sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -2236,170 +2257,172 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 - '@solana-program/system@0.12.2(@solana/kit@6.10.0(typescript@5.9.3))': + '@solana-program/system@0.16.0(@solana/kit@8.5.0(typescript@5.9.3))': dependencies: - '@solana/kit': 6.10.0(typescript@5.9.3) + '@solana/kit': 8.5.0(typescript@5.9.3) - '@solana-program/token@0.11.0(@solana/kit@6.10.0(typescript@5.9.3))': + '@solana-program/token@0.18.0(@solana/kit@8.5.0(typescript@5.9.3))': dependencies: - '@solana-program/system': 0.12.2(@solana/kit@6.10.0(typescript@5.9.3)) - '@solana/kit': 6.10.0(typescript@5.9.3) + '@solana-program/system': 0.16.0(@solana/kit@8.5.0(typescript@5.9.3)) + '@solana/kit': 8.5.0(typescript@5.9.3) - '@solana/accounts@6.10.0(typescript@5.9.3)': + '@solana/accounts@8.5.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.10.0(typescript@5.9.3) - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-strings': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/rpc-spec': 6.10.0(typescript@5.9.3) - '@solana/rpc-types': 6.10.0(typescript@5.9.3) + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/addresses@6.10.0(typescript@5.9.3)': + '@solana/addresses@8.5.0(typescript@5.9.3)': dependencies: - '@solana/assertions': 6.10.0(typescript@5.9.3) - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-strings': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/nominal-types': 6.10.0(typescript@5.9.3) + '@solana/assertions': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/assertions@6.10.0(typescript@5.9.3)': + '@solana/assertions@8.5.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/codecs-core@6.10.0(typescript@5.9.3)': + '@solana/codecs-core@8.5.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/codecs-data-structures@6.10.0(typescript@5.9.3)': + '@solana/codecs-data-structures@8.5.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/codecs-numbers@6.10.0(typescript@5.9.3)': + '@solana/codecs-numbers@8.5.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/codecs-strings@6.10.0(typescript@5.9.3)': + '@solana/codecs-strings@8.5.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/codecs@6.10.0(typescript@5.9.3)': + '@solana/codecs@8.5.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) - '@solana/codecs-strings': 6.10.0(typescript@5.9.3) - '@solana/fixed-points': 6.10.0(typescript@5.9.3) - '@solana/options': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-data-structures': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/fixed-points': 8.5.0(typescript@5.9.3) + '@solana/options': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/errors@6.10.0(typescript@5.9.3)': + '@solana/errors@8.5.0(typescript@5.9.3)': dependencies: chalk: 5.6.2 commander: 15.0.0 optionalDependencies: typescript: 5.9.3 - '@solana/fast-stable-stringify@6.10.0(typescript@5.9.3)': + '@solana/fast-stable-stringify@8.5.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 - '@solana/fixed-points@6.10.0(typescript@5.9.3)': + '@solana/fixed-points@8.5.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/functional@6.10.0(typescript@5.9.3)': + '@solana/functional@8.5.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 - '@solana/instruction-plans@6.10.0(typescript@5.9.3)': + '@solana/instruction-plans@8.5.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/instructions': 6.10.0(typescript@5.9.3) - '@solana/keys': 6.10.0(typescript@5.9.3) - '@solana/promises': 6.10.0(typescript@5.9.3) - '@solana/transaction-messages': 6.10.0(typescript@5.9.3) - '@solana/transactions': 6.10.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/instructions': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/promises': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/instructions@6.10.0(typescript@5.9.3)': + '@solana/instructions@8.5.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/keys@6.10.0(typescript@5.9.3)': + '@solana/keys@8.5.0(typescript@5.9.3)': dependencies: - '@solana/assertions': 6.10.0(typescript@5.9.3) - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-strings': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/nominal-types': 6.10.0(typescript@5.9.3) - '@solana/promises': 6.10.0(typescript@5.9.3) + '@solana/assertions': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) + '@solana/promises': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/kit@6.10.0(typescript@5.9.3)': - dependencies: - '@solana/accounts': 6.10.0(typescript@5.9.3) - '@solana/addresses': 6.10.0(typescript@5.9.3) - '@solana/codecs': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/functional': 6.10.0(typescript@5.9.3) - '@solana/instruction-plans': 6.10.0(typescript@5.9.3) - '@solana/instructions': 6.10.0(typescript@5.9.3) - '@solana/keys': 6.10.0(typescript@5.9.3) - '@solana/offchain-messages': 6.10.0(typescript@5.9.3) - '@solana/plugin-core': 6.10.0(typescript@5.9.3) - '@solana/plugin-interfaces': 6.10.0(typescript@5.9.3) - '@solana/program-client-core': 6.10.0(typescript@5.9.3) - '@solana/programs': 6.10.0(typescript@5.9.3) - '@solana/rpc': 6.10.0(typescript@5.9.3) - '@solana/rpc-api': 6.10.0(typescript@5.9.3) - '@solana/rpc-parsed-types': 6.10.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) - '@solana/rpc-subscriptions': 6.10.0(typescript@5.9.3) - '@solana/rpc-types': 6.10.0(typescript@5.9.3) - '@solana/signers': 6.10.0(typescript@5.9.3) - '@solana/subscribable': 6.10.0(typescript@5.9.3) - '@solana/sysvars': 6.10.0(typescript@5.9.3) - '@solana/transaction-confirmation': 6.10.0(typescript@5.9.3) - '@solana/transaction-messages': 6.10.0(typescript@5.9.3) - '@solana/transactions': 6.10.0(typescript@5.9.3) + '@solana/kit@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 8.5.0(typescript@5.9.3) + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/functional': 8.5.0(typescript@5.9.3) + '@solana/instruction-plans': 8.5.0(typescript@5.9.3) + '@solana/instructions': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/offchain-messages': 8.5.0(typescript@5.9.3) + '@solana/plugin-core': 8.5.0(typescript@5.9.3) + '@solana/plugin-interfaces': 8.5.0(typescript@5.9.3) + '@solana/program-client-core': 8.5.0(typescript@5.9.3) + '@solana/programs': 8.5.0(typescript@5.9.3) + '@solana/promises': 8.5.0(typescript@5.9.3) + '@solana/rpc': 8.5.0(typescript@5.9.3) + '@solana/rpc-api': 8.5.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/signers': 8.5.0(typescript@5.9.3) + '@solana/subscribable': 8.5.0(typescript@5.9.3) + '@solana/sysvars': 8.5.0(typescript@5.9.3) + '@solana/transaction-confirmation': 8.5.0(typescript@5.9.3) + '@solana/transaction-introspection': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -2407,167 +2430,171 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate - '@solana/nominal-types@6.10.0(typescript@5.9.3)': + '@solana/nominal-types@8.5.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 - '@solana/offchain-messages@6.10.0(typescript@5.9.3)': + '@solana/offchain-messages@8.5.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.10.0(typescript@5.9.3) - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) - '@solana/codecs-strings': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/keys': 6.10.0(typescript@5.9.3) - '@solana/nominal-types': 6.10.0(typescript@5.9.3) + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-data-structures': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/options@6.10.0(typescript@5.9.3)': + '@solana/options@8.5.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) - '@solana/codecs-strings': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-data-structures': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/plugin-core@6.10.0(typescript@5.9.3)': + '@solana/plugin-core@8.5.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 - '@solana/plugin-interfaces@6.10.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.10.0(typescript@5.9.3) - '@solana/instruction-plans': 6.10.0(typescript@5.9.3) - '@solana/keys': 6.10.0(typescript@5.9.3) - '@solana/rpc-spec': 6.10.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.10.0(typescript@5.9.3) - '@solana/rpc-types': 6.10.0(typescript@5.9.3) - '@solana/signers': 6.10.0(typescript@5.9.3) + '@solana/plugin-interfaces@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 8.5.0(typescript@5.9.3) + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/instruction-plans': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/signers': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/program-client-core@6.10.0(typescript@5.9.3)': - dependencies: - '@solana/accounts': 6.10.0(typescript@5.9.3) - '@solana/addresses': 6.10.0(typescript@5.9.3) - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/instruction-plans': 6.10.0(typescript@5.9.3) - '@solana/instructions': 6.10.0(typescript@5.9.3) - '@solana/plugin-interfaces': 6.10.0(typescript@5.9.3) - '@solana/rpc-api': 6.10.0(typescript@5.9.3) - '@solana/signers': 6.10.0(typescript@5.9.3) + '@solana/program-client-core@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 8.5.0(typescript@5.9.3) + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/instruction-plans': 8.5.0(typescript@5.9.3) + '@solana/instructions': 8.5.0(typescript@5.9.3) + '@solana/plugin-interfaces': 8.5.0(typescript@5.9.3) + '@solana/rpc-api': 8.5.0(typescript@5.9.3) + '@solana/signers': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/programs@6.10.0(typescript@5.9.3)': + '@solana/programs@8.5.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/promises@6.10.0(typescript@5.9.3)': + '@solana/promises@8.5.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 - '@solana/rpc-api@6.10.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.10.0(typescript@5.9.3) - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-strings': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/keys': 6.10.0(typescript@5.9.3) - '@solana/rpc-parsed-types': 6.10.0(typescript@5.9.3) - '@solana/rpc-spec': 6.10.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.10.0(typescript@5.9.3) - '@solana/rpc-types': 6.10.0(typescript@5.9.3) - '@solana/transaction-messages': 6.10.0(typescript@5.9.3) - '@solana/transactions': 6.10.0(typescript@5.9.3) + '@solana/rpc-api@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-transformers': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-parsed-types@6.10.0(typescript@5.9.3)': + '@solana/rpc-parsed-types@8.5.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 - '@solana/rpc-spec-types@6.10.0(typescript@5.9.3)': + '@solana/rpc-spec-types@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/rpc-spec@6.10.0(typescript@5.9.3)': + '@solana/rpc-spec@8.5.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) - '@solana/subscribable': 6.10.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec-types': 8.5.0(typescript@5.9.3) + '@solana/subscribable': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/rpc-subscriptions-api@6.10.0(typescript@5.9.3)': + '@solana/rpc-subscriptions-api@8.5.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.10.0(typescript@5.9.3) - '@solana/keys': 6.10.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.10.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.10.0(typescript@5.9.3) - '@solana/rpc-types': 6.10.0(typescript@5.9.3) - '@solana/transaction-messages': 6.10.0(typescript@5.9.3) - '@solana/transactions': 6.10.0(typescript@5.9.3) + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-transformers': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-subscriptions-channel-websocket@6.10.0(typescript@5.9.3)': + '@solana/rpc-subscriptions-channel-websocket@8.5.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/functional': 6.10.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.10.0(typescript@5.9.3) - '@solana/subscribable': 6.10.0(typescript@5.9.3) - ws: 8.21.0 + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/functional': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 8.5.0(typescript@5.9.3) + '@solana/subscribable': 8.5.0(typescript@5.9.3) + ws: 8.22.0 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - bufferutil - utf-8-validate - '@solana/rpc-subscriptions-spec@6.10.0(typescript@5.9.3)': + '@solana/rpc-subscriptions-spec@8.5.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/promises': 6.10.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) - '@solana/subscribable': 6.10.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/promises': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec-types': 8.5.0(typescript@5.9.3) + '@solana/subscribable': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/rpc-subscriptions@6.10.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/fast-stable-stringify': 6.10.0(typescript@5.9.3) - '@solana/functional': 6.10.0(typescript@5.9.3) - '@solana/promises': 6.10.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) - '@solana/rpc-subscriptions-api': 6.10.0(typescript@5.9.3) - '@solana/rpc-subscriptions-channel-websocket': 6.10.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.10.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.10.0(typescript@5.9.3) - '@solana/rpc-types': 6.10.0(typescript@5.9.3) - '@solana/subscribable': 6.10.0(typescript@5.9.3) + '@solana/rpc-subscriptions@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 8.5.0(typescript@5.9.3) + '@solana/functional': 8.5.0(typescript@5.9.3) + '@solana/promises': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions-api': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions-channel-websocket': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-transformers': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/subscribable': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -2575,105 +2602,105 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate - '@solana/rpc-transformers@6.10.0(typescript@5.9.3)': + '@solana/rpc-transformers@8.5.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/functional': 6.10.0(typescript@5.9.3) - '@solana/nominal-types': 6.10.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) - '@solana/rpc-types': 6.10.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/functional': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-transport-http@6.10.0(typescript@5.9.3)': + '@solana/rpc-transport-http@8.5.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/rpc-spec': 6.10.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) - undici-types: 8.5.0 + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec-types': 8.5.0(typescript@5.9.3) + undici-types: 8.12.3 optionalDependencies: typescript: 5.9.3 - '@solana/rpc-types@6.10.0(typescript@5.9.3)': + '@solana/rpc-types@8.5.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.10.0(typescript@5.9.3) - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) - '@solana/codecs-strings': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/fixed-points': 6.10.0(typescript@5.9.3) - '@solana/nominal-types': 6.10.0(typescript@5.9.3) + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/fixed-points': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc@6.10.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/fast-stable-stringify': 6.10.0(typescript@5.9.3) - '@solana/functional': 6.10.0(typescript@5.9.3) - '@solana/rpc-api': 6.10.0(typescript@5.9.3) - '@solana/rpc-spec': 6.10.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.10.0(typescript@5.9.3) - '@solana/rpc-transport-http': 6.10.0(typescript@5.9.3) - '@solana/rpc-types': 6.10.0(typescript@5.9.3) + '@solana/rpc@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 8.5.0(typescript@5.9.3) + '@solana/functional': 8.5.0(typescript@5.9.3) + '@solana/rpc-api': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec': 8.5.0(typescript@5.9.3) + '@solana/rpc-spec-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-transformers': 8.5.0(typescript@5.9.3) + '@solana/rpc-transport-http': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/signers@6.10.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.10.0(typescript@5.9.3) - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/instructions': 6.10.0(typescript@5.9.3) - '@solana/keys': 6.10.0(typescript@5.9.3) - '@solana/nominal-types': 6.10.0(typescript@5.9.3) - '@solana/offchain-messages': 6.10.0(typescript@5.9.3) - '@solana/transaction-messages': 6.10.0(typescript@5.9.3) - '@solana/transactions': 6.10.0(typescript@5.9.3) + '@solana/signers@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/instructions': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) + '@solana/offchain-messages': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/subscribable@6.10.0(typescript@5.9.3)': + '@solana/subscribable@8.5.0(typescript@5.9.3)': dependencies: - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/promises': 6.10.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/promises': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/sysvars@6.10.0(typescript@5.9.3)': + '@solana/sysvars@8.5.0(typescript@5.9.3)': dependencies: - '@solana/accounts': 6.10.0(typescript@5.9.3) - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/rpc-types': 6.10.0(typescript@5.9.3) + '@solana/accounts': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-data-structures': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/transaction-confirmation@6.10.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.10.0(typescript@5.9.3) - '@solana/codecs-strings': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/keys': 6.10.0(typescript@5.9.3) - '@solana/promises': 6.10.0(typescript@5.9.3) - '@solana/rpc': 6.10.0(typescript@5.9.3) - '@solana/rpc-subscriptions': 6.10.0(typescript@5.9.3) - '@solana/rpc-types': 6.10.0(typescript@5.9.3) - '@solana/transaction-messages': 6.10.0(typescript@5.9.3) - '@solana/transactions': 6.10.0(typescript@5.9.3) + '@solana/transaction-confirmation@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/promises': 8.5.0(typescript@5.9.3) + '@solana/rpc': 8.5.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -2681,36 +2708,51 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate - '@solana/transaction-messages@6.10.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.10.0(typescript@5.9.3) - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/functional': 6.10.0(typescript@5.9.3) - '@solana/instructions': 6.10.0(typescript@5.9.3) - '@solana/nominal-types': 6.10.0(typescript@5.9.3) - '@solana/rpc-types': 6.10.0(typescript@5.9.3) + '@solana/transaction-introspection@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/instructions': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) + '@solana/transactions': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/transactions@6.10.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.10.0(typescript@5.9.3) - '@solana/codecs-core': 6.10.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) - '@solana/codecs-strings': 6.10.0(typescript@5.9.3) - '@solana/errors': 6.10.0(typescript@5.9.3) - '@solana/functional': 6.10.0(typescript@5.9.3) - '@solana/instructions': 6.10.0(typescript@5.9.3) - '@solana/keys': 6.10.0(typescript@5.9.3) - '@solana/nominal-types': 6.10.0(typescript@5.9.3) - '@solana/rpc-types': 6.10.0(typescript@5.9.3) - '@solana/transaction-messages': 6.10.0(typescript@5.9.3) + '@solana/transaction-messages@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-data-structures': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/functional': 8.5.0(typescript@5.9.3) + '@solana/instructions': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@8.5.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 8.5.0(typescript@5.9.3) + '@solana/codecs-core': 8.5.0(typescript@5.9.3) + '@solana/codecs-data-structures': 8.5.0(typescript@5.9.3) + '@solana/codecs-numbers': 8.5.0(typescript@5.9.3) + '@solana/codecs-strings': 8.5.0(typescript@5.9.3) + '@solana/errors': 8.5.0(typescript@5.9.3) + '@solana/functional': 8.5.0(typescript@5.9.3) + '@solana/instructions': 8.5.0(typescript@5.9.3) + '@solana/keys': 8.5.0(typescript@5.9.3) + '@solana/nominal-types': 8.5.0(typescript@5.9.3) + '@solana/rpc-types': 8.5.0(typescript@5.9.3) + '@solana/transaction-messages': 8.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -3632,7 +3674,7 @@ snapshots: undici-types@7.24.6: optional: true - undici-types@8.5.0: {} + undici-types@8.12.3: {} unified@11.0.5: dependencies: @@ -3722,6 +3764,8 @@ snapshots: ws@8.21.0: {} + ws@8.22.0: {} + y18n@5.0.8: {} yallist@3.1.1: {} diff --git a/playground/test-results/.last-run.json b/playground/test-results/.last-run.json new file mode 100644 index 000000000..cbcc1fbac --- /dev/null +++ b/playground/test-results/.last-run.json @@ -0,0 +1,4 @@ +{ + "status": "passed", + "failedTests": [] +} \ No newline at end of file diff --git a/rust/crates/conformance/src/case.rs b/rust/crates/conformance/src/case.rs index 703aa1ee0..8f974a827 100644 --- a/rust/crates/conformance/src/case.rs +++ b/rust/crates/conformance/src/case.rs @@ -620,6 +620,27 @@ pub enum Expect { }, } +/// A verdict the pinned specs also allow beside a case's primary `expect`. +/// +/// The primary verdict is the Rust kit's (or the authored one); when the spec +/// text leaves the choice to the implementation (a sponsor's stricter local +/// policy, a check the spec does not order, a rule it states for another +/// instruction only), the vector lists the other conformant verdicts in +/// `expect.alsoConformant` and the judge passes a result that matches any of +/// them. Every use carries the reason, quoting the spec. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Alternative { + Accept, + Reject(RejectCode), +} + +/// The alternatives and the reason they are conformant. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct AlsoConformant { + pub verdicts: Vec, + pub reason: String, +} + /// Where the expected value comes from. #[derive(Debug, Clone, PartialEq, Eq)] pub enum Provenance { @@ -761,6 +782,35 @@ pub struct Case { pub input: Input, pub expect: Expect, pub provenance: Provenance, + /// Other verdicts the specs allow (`expect.alsoConformant`). + pub also_conformant: Option, +} + +impl Case { + /// Record verdicts the specs also allow beside the primary one, with the + /// reason (quote the spec). Panics on an empty list, a reason shorter + /// than a sentence, or an alternative equal to the primary verdict. + pub fn also_conformant(mut self, verdicts: &[Alternative], reason: &str) -> Self { + let primary = match &self.expect { + Expect::Reject { code, .. } => Alternative::Reject(*code), + Expect::Accept(_) | Expect::AcceptAuthored(_) => Alternative::Accept, + }; + assert!( + !verdicts.is_empty() && reason.trim().len() >= 24, + "{}: also_conformant needs verdicts and a reason", + self.id + ); + assert!( + !verdicts.contains(&primary), + "{}: an alternative repeats the primary verdict", + self.id + ); + self.also_conformant = Some(AlsoConformant { + verdicts: verdicts.to_vec(), + reason: reason.to_string(), + }); + self + } } /// Fluent constructor so registry entries stay readable. Every field without @@ -800,6 +850,7 @@ impl CaseBuilder { input, expect, provenance: Provenance::Generated, + also_conformant: None, }, } } @@ -819,6 +870,12 @@ impl CaseBuilder { self } + /// See [`Case::also_conformant`]. + pub fn also_conformant(mut self, verdicts: &[Alternative], reason: &str) -> Self { + self.case = self.case.also_conformant(verdicts, reason); + self + } + pub fn build(self) -> Case { self.case } diff --git a/rust/crates/conformance/src/cases/mod.rs b/rust/crates/conformance/src/cases/mod.rs index 1c3ce133c..6f1037b08 100644 --- a/rust/crates/conformance/src/cases/mod.rs +++ b/rust/crates/conformance/src/cases/mod.rs @@ -22,6 +22,15 @@ pub mod x402_policy; pub mod x402_tx_versions; pub mod x402_upto; +/// Why an accept is also conformant where pay-kit's sponsors refuse a +/// priority fee above 2,000 lamports (limit times price, RULINGS S6): the +/// x402 schemes bound each factor and leave a tighter total to the sponsor. +pub const SPONSOR_FEE_PRODUCT_POLICY: &str = "scheme_exact_svm.md §2.2.1 bounds the compute unit limit and the unit price separately (reference defaults 400,000 units and 5,000,000 micro-lamports per unit) and this transaction is within both; the 2,000 lamport cap on their product is pay-kit's stricter sponsor policy (§2.3: “Sponsors MAY introduce stricter limits but MUST NOT relax the §2.1 MUSTs.”), so a sponsor without it accepts (RULINGS S6)."; + +/// As [`SPONSOR_FEE_PRODUCT_POLICY`], for the payment-channel transactions an +/// upto or batch-settlement sponsor co-signs. +pub const CHANNEL_FEE_PRODUCT_POLICY: &str = "the upto and batch-settlement schemes cap the compute unit limit at 400,000 and the unit price at 5,000,000 micro-lamports (or a version-1 priorityFee at 5 lamports per unit) and this transaction is within them; the 2,000 lamport cap on the total fee is pay-kit's stricter local policy, which the schemes allow but do not require (upto: “A sponsor MAY apply a stricter local policy for compute-unit limit, compute-unit price, and required-signature count”; batch-settlement: “A sponsor MAY apply stricter local compute-unit, priority-fee, or required-signature caps”), so a sponsor without it accepts (RULINGS S6)."; + /// `registry! { name => case_expr; ... }`: one constructor fn per case, the /// module's `cases()`, and a positive-control `#[test]` per case that also /// asserts the fn name equals the case id (dashes as underscores). diff --git a/rust/crates/conformance/src/cases/x402_batch.rs b/rust/crates/conformance/src/cases/x402_batch.rs index 6d9c70715..6e01c8e4a 100644 --- a/rust/crates/conformance/src/cases/x402_batch.rs +++ b/rust/crates/conformance/src/cases/x402_batch.rs @@ -77,7 +77,9 @@ const NO_GRANT: &str = "X402-f882f2074a"; const OPT_IN: &str = "X402-84916fe051"; const TOKEN_PROGRAM_OWNER: &str = "X402-23747f44c3"; const TOKEN_PROGRAM_VERIFY: &str = "X402-1230bb35a3"; -const CLAIMS_ONE_TO_FOUR: &str = "X402-7f4ee54a73"; +const CLAIMS_CAPACITY: &str = "X402-76654742e7"; +const SETTLE_CAPACITY: &str = "X402-c2ca42b7a4"; +const SERVER_COPIES_CAPACITY: &str = "X402-8f57677e36"; const SEAL_CLOSE_AUTH: &str = "X402-45c411d301"; const COMMITMENT_ID: &str = "X402-5ebca343d1"; const STATIC_VALIDATE: &str = "X402-4ea8d1b0d9"; @@ -111,9 +113,9 @@ const TX_FACILITATOR_REJECTS: &str = "X402TX-5267172b18"; const TX_CLIENT_INTERSECT: &str = "X402TX-61c735c7a9"; const TX_CLIENT_EMPTY: &str = "X402TX-2909c4b4ec"; const TX_SIZE: &str = "X402TX-dc7b0f3305"; -const TX_V1_BUDGET: &str = "X402TX-644919eb3b"; -const TX_V1_CAPS: &str = "X402TX-0f874a9c63"; -const TX_V1_NO_CB: &str = "X402TX-936b492daa"; +const TX_V1_BUDGET: &str = "X402TX-f9bcc1a14a"; +const TX_V1_CAPS: &str = "X402TX-703c03cfb5"; +const TX_V1_NO_CB: &str = "X402TX-915632f040"; const TX_SERVER_COPIES: &str = "X402TX-f39a33ff74"; // ── spec references ── @@ -156,8 +158,12 @@ fn variants_spec() -> SpecRef { fn refund_voucher_spec() -> SpecRef { s("4.3 Client PaymentPayload Variants", "| `voucher` | `BatchVoucher` | REQUIRED in client mode. The server's accepted cumulative amount (`expiresAt` MUST be `0`).") } +fn settle_spec() -> SpecRef { + s("4.5 Facilitator Interface", "`channels[]` MUST contain at least one entry and at most `extra.maxSettleChannels` entries, or four when the facilitator advertises no `maxSettleChannels`.") +} + fn claims_spec() -> SpecRef { - s("4.5 Facilitator Interface", "`claims[]` MUST contain between one and four entries so the instruction pairs fit in a legacy Solana transaction without address lookup tables.") + s("4.5 Facilitator Interface", "`claims[]` MUST contain at least one entry and at most `extra.maxClaimChannels` entries, or four when the facilitator advertises no `maxClaimChannels`, so the instruction pairs fit in one transaction without address lookup tables.") } fn wire_spec() -> SpecRef { s( @@ -315,6 +321,15 @@ fn verify_input( input } +/// Mark a verify vector whose verdict rests on the resource server's own +/// record alone (`batchServerChannel`: the charged or accepted cumulative, +/// a close-pending mark), which a stateless facilitator never sees +/// (RULINGS B1): `batchVerdictFromStore: true`. +fn from_store(mut input: Value) -> Value { + input["batchVerdictFromStore"] = json!(true); + input +} + fn voucher_payload(config: &Value, voucher: Value) -> Value { json!({ "type": "voucher", "channelConfig": config, "voucher": voucher }) } @@ -847,6 +862,17 @@ fn v1_route() -> Route { } } +/// A facilitator configured to accept version 0 only, stated explicitly: +/// the scheme gives its own accepted set no default (“The facilitator +/// enforces its own accepted set; it does not read +/// `PaymentRequirements.extra.transactionVersions`.”). +fn v0_only_route() -> Route { + Route { + tx_versions: Some(vec![0]), + ..Route::default() + } +} + fn v1_top_up(config: solana_message::v1::TransactionConfig, prefix: Vec) -> String { let mut ixs = prefix; ixs.push(fx::top_up_ix(&cfg(), TOP_UP_AMOUNT_ADDED)); @@ -1088,35 +1114,53 @@ crate::registry! { rej(RejectCode::InvalidPayload), ).build(); batch_wire_redemption_claim_frozen => wire_case( - "batch-wire-redemption-claim-frozen", claims_spec(), &[CLAIMS_ONE_TO_FOUR], + "batch-wire-redemption-claim-frozen", claims_spec(), &[CLAIMS_CAPACITY], "claim payload with two entries, each channelId + full channelConfig + the latest BatchVoucher.", wire("redemption", json!({ "type": "claim", "claims": [claim_entry(&cfg(), 5_000), claim_entry(&with(with(cfg(), "salt", json!("43")), "openSlot", json!(341_000_050)), 7_000)] })), json_pin(), ).build(); batch_wire_redemption_claim_empty_reject => wire_case( - "batch-wire-redemption-claim-empty-reject", claims_spec(), &[CLAIMS_ONE_TO_FOUR], + "batch-wire-redemption-claim-empty-reject", claims_spec(), &[CLAIMS_CAPACITY], "claims: [] is below the one-entry minimum.", wire("redemption", json!({ "type": "claim", "claims": [] })), rej(RejectCode::InvalidPayload), ).authored(None).build(); - batch_wire_redemption_claim_five_entries_reject => wire_case( - "batch-wire-redemption-claim-five-entries-reject", claims_spec(), &[CLAIMS_ONE_TO_FOUR], - "Five claims exceed the four entries one legacy transaction can carry.", - wire("redemption", json!({ "type": "claim", "claims": (0..5).map(|i| claim_entry(&with(cfg(), "salt", json!((100 + i).to_string())), 1_000)).collect::>() })), + batch_wire_redemption_claim_eighteen_entries => wire_case( + "batch-wire-redemption-claim-eighteen-entries", claims_spec(), &[CLAIMS_CAPACITY], + "Eighteen claims, the version-1 capacity (extra.maxClaimChannels 18): the payload parses. More than four is no longer a wire error; a facilitator that builds version 0 rejects it against its own capacity.", + wire("redemption", json!({ "type": "claim", "claims": (0..18).map(|i| claim_entry(&with(cfg(), "salt", json!((100 + i).to_string())), 1_000)).collect::>() })), + json_pin(), + ).build(); + batch_wire_redemption_claim_nineteen_entries_reject => wire_case( + "batch-wire-redemption-claim-nineteen-entries-reject", claims_spec(), &[CLAIMS_CAPACITY], + "Nineteen claims exceed what fits one version-1 transaction, so no facilitator can advertise that capacity: the payload is malformed for every facilitator.", + wire("redemption", json!({ "type": "claim", "claims": (0..19).map(|i| claim_entry(&with(cfg(), "salt", json!((100 + i).to_string())), 1_000)).collect::>() })), rej(RejectCode::InvalidPayload), ).authored(None).build(); batch_wire_redemption_claim_entry_without_config_reject => wire_case( - "batch-wire-redemption-claim-entry-without-config-reject", s("4.5 Facilitator Interface", "| Claim | `claims[].channelConfig` | `ChannelConfig` | Full channel configuration. |"), &[CLAIMS_ONE_TO_FOUR], + "batch-wire-redemption-claim-entry-without-config-reject", s("4.5 Facilitator Interface", "| Claim | `claims[].channelConfig` | `ChannelConfig` | Full channel configuration. |"), &[CLAIMS_CAPACITY], "A claim entry without its channelConfig cannot be derived or validated.", wire("redemption", json!({ "type": "claim", "claims": [without(claim_entry(&cfg(), 5_000), "channelConfig")] })), rej(RejectCode::InvalidPayload), ).build(); batch_wire_redemption_settle_frozen => wire_case( - "batch-wire-redemption-settle-frozen", s("4.5 Facilitator Interface", "`channels[]` MUST contain between one and four entries, the same transaction-size bound as `claims[]`."), &[CLAIMS_ONE_TO_FOUR], + "batch-wire-redemption-settle-frozen", settle_spec(), &[SETTLE_CAPACITY], "settle payload: channels[] of {channelId, channelConfig}.", wire("redemption", json!({ "type": "settle", "channels": [{ "channelId": channel(&cfg()), "channelConfig": cfg() }] })), json_pin(), ).build(); + batch_wire_redemption_settle_thirteen_channels => wire_case( + "batch-wire-redemption-settle-thirteen-channels", settle_spec(), &[SETTLE_CAPACITY], + "Thirteen settle channels, the version-1 capacity (extra.maxSettleChannels 13): the payload parses.", + wire("redemption", json!({ "type": "settle", "channels": (0..13).map(|i| { let c = with(cfg(), "salt", json!((200 + i).to_string())); json!({ "channelId": channel(&c), "channelConfig": c }) }).collect::>() })), + json_pin(), + ).build(); + batch_wire_redemption_settle_fourteen_channels_reject => wire_case( + "batch-wire-redemption-settle-fourteen-channels-reject", settle_spec(), &[SETTLE_CAPACITY], + "Fourteen settle channels exceed the largest capacity a facilitator may advertise (13): the payload is malformed for every facilitator.", + wire("redemption", json!({ "type": "settle", "channels": (0..14).map(|i| { let c = with(cfg(), "salt", json!((200 + i).to_string())); json!({ "channelId": channel(&c), "channelConfig": c }) }).collect::>() })), + rej(RejectCode::InvalidPayload), + ).authored(None).build(); batch_wire_redemption_seal_frozen => wire_case( "batch-wire-redemption-seal-frozen", s("4.5 Facilitator Interface", "| Seal | `closeAuthorization` | `CloseAuthorization` | REQUIRED (section 3)."), &[SEAL_CLOSE_AUTH], "seal payload: the tag beside channelId, channelConfig, the latest voucher and closeAuthorization {validBefore, signature}.", @@ -1141,8 +1185,14 @@ crate::registry! { wire("requirements", v1_route().requirements()), json_pin(), ).build(); + batch_wire_requirements_redemption_capacity => wire_case( + "batch-wire-requirements-redemption-capacity", s("GET /supported", "The server MUST copy `feePayer`, `transactionVersions`, `maxClaimChannels`, `maxSettleChannels`, and `maxIdleSecs` into `PaymentRequirements.extra`"), &[SERVER_COPIES_CAPACITY], + "Requirements of a route whose facilitator builds redemptions as version 1 carry its capacity, extra.maxClaimChannels 18 and extra.maxSettleChannels 13, copied from /supported; the SDK's requirements type keeps both.", + wire("requirements", requirements_with(&[("transactionVersions", json!([0, 1])), ("maxClaimChannels", json!(18)), ("maxSettleChannels", json!(13))])), + json_pin(), + ).build(); batch_wire_requirements_unknown_transaction_version_reject => wire_case( - "batch-wire-requirements-unknown-transaction-version-reject", tx_versions_spec("Entries are the integers `0` and `1`, the Wallet Standard `supportedTransactionVersions` vocabulary."), &[TX_SERVER_COPIES], + "batch-wire-requirements-unknown-transaction-version-reject", tx_versions_spec("Entries MUST be the JSON integers `0` and `1` only."), &[TX_SERVER_COPIES], "extra.transactionVersions [0, 2]: 2 is not a transaction message version.", wire("requirements", requirements_with(&[("transactionVersions", json!([0, 2]))])), rej(RejectCode::InvalidPayload), @@ -1320,19 +1370,19 @@ crate::registry! { batch_verify_voucher_one_below_reject => voucher_case( "batch-verify-voucher-one-below-reject", cumulative_spec(), BugType::Settlement, "Charged 3000, amount 1000: a voucher at 3999 underpays by one unit.", - voucher_input(&cfg(), honest_voucher(3_999), 3_000, 10_000, ChannelAccount::default()), + from_store(voucher_input(&cfg(), honest_voucher(3_999), 3_000, 10_000, ChannelAccount::default())), rej(RejectCode::CumulativeAmountMismatch), ).requirements(&[EVERY_PAID_REQUEST]).build(); batch_verify_voucher_one_above_reject => voucher_case( "batch-verify-voucher-one-above-reject", cumulative_spec(), BugType::Settlement, "A voucher at 4001: in client mode each fresh voucher advances the cumulative by exactly the amount, not at least it (a stateless facilitator floor would accept it; the server rule is equality, RULINGS B1).", - voucher_input(&cfg(), honest_voucher(4_001), 3_000, 10_000, ChannelAccount::default()), + from_store(voucher_input(&cfg(), honest_voucher(4_001), 3_000, 10_000, ChannelAccount::default())), rej(RejectCode::CumulativeAmountMismatch), ).requirements(&[EVERY_PAID_REQUEST]).build(); batch_verify_voucher_stale_reject => voucher_case( "batch-verify-voucher-stale-reject", cumulative_spec(), BugType::Replay, "A voucher at the already-charged 3000 (no stored voucher with that signature): stale, not a fresh authorization.", - voucher_input(&cfg(), honest_voucher(3_000), 3_000, 10_000, ChannelAccount::default()), + from_store(voucher_input(&cfg(), honest_voucher(3_000), 3_000, 10_000, ChannelAccount::default())), rej(RejectCode::CumulativeAmountMismatch), ).requirements(&[EVERY_PAID_REQUEST]).build(); batch_verify_voucher_at_deposit => voucher_case( @@ -1386,7 +1436,7 @@ crate::registry! { batch_verify_voucher_close_pending_in_store_reject => voucher_case( "batch-verify-voucher-close-pending-in-store-reject", s("4.5 Facilitator Interface", "For this unilateral path, the server MUST mark the channel close-pending and reject further paid requests."), BugType::Settlement, "The server already marked the channel close-pending (a sponsored request_close confirmed): further paid requests are refused.", - { let mut i = voucher_input(&cfg(), honest_voucher(4_000), 3_000, 10_000, ChannelAccount::default()); i["batchServerChannel"]["closeRequestedAt"] = json!(1_785_000_000_u64); i }, + { let mut i = voucher_input(&cfg(), honest_voucher(4_000), 3_000, 10_000, ChannelAccount::default()); i["batchServerChannel"]["closeRequestedAt"] = json!(1_785_000_000_u64); from_store(i) }, rej(RejectCode::ChannelClosing), ).requirements(&[CLOSE_PENDING, CLOSING]).build(); batch_verify_voucher_onchain_closed_account_reject => voucher_case( @@ -1460,13 +1510,23 @@ crate::registry! { "channelConfig omits receiverAuthorizer while the requirements advertise one: both MUST be present and equal.", voucher_input(&without(cfg(), "receiverAuthorizer"), honest_voucher(4_000), 3_000, 10_000, ChannelAccount::default()), rej(RejectCode::ReceiverAuthorizerMismatch), - ).requirements(&[RA_EQUAL, RA_BOTH_PRESENT]).build(); + ) + .also_conformant( + &[crate::case::Alternative::Reject(RejectCode::PayloadType)], + "channelConfig.receiverAuthorizer is a required field of the wire object (“| `receiverAuthorizer` | string | Required.”), so a verifier that validates the payload shape before comparing it with extra.receiverAuthorizer refuses it as invalid_batch_settlement_svm_payload_type; the spec does not order the two checks.", + ) + .requirements(&[RA_EQUAL, RA_BOTH_PRESENT]).build(); batch_verify_voucher_server_mode_config_reject => voucher_case( "batch-verify-voucher-server-mode-config-reject", s("4.2 Shared Wire Objects and Program Mapping", "Omitted or `\"client\"` selects client mode; `\"server\"` selects server mode and MUST equal `extra.voucherSigner`."), BugType::AuthBypass, "channelConfig.voucherSigner \"server\" on a client-mode route: the mode must equal extra.voucherSigner.", voucher_input(&with(cfg(), "voucherSigner", json!("server")), honest_voucher(4_000), 3_000, 10_000, ChannelAccount::default()), rej(RejectCode::ChannelState), - ).requirements(&["X402-22712c36e1"]).build(); + ) + .also_conformant( + &[crate::case::Alternative::Reject(RejectCode::PayloadType)], + "no reason code names a voucherSigner that differs from extra.voucherSigner; a server-mode channelConfig on a client-mode route is a payload the route's operation does not take (invalid_batch_settlement_svm_payload_type, “payload `type` is not valid for the current verify or settle operation”) as plausibly as a channel-state mismatch.", + ) + .requirements(&["X402-22712c36e1"]).build(); batch_verify_accepted_amount_mismatch_reject => voucher_case( "batch-verify-accepted-amount-mismatch-reject", accepted_spec(), BugType::Precedence, "accepted.amount \"500\" while the route charges 1000 (voucher otherwise valid at 4000).", @@ -1528,13 +1588,15 @@ crate::registry! { "SetComputeUnitLimit 400000 and SetComputeUnitPrice 5000000, each at its own cap: the sponsor would pay a 2000000 lamport priority fee, so it bounds the fee as limit times price (RULINGS S6). Pair: batch-verify-top-up-compute-budget-prefix.", top_up_tx(vec![fx::compute_ix(&fx::unit_limit(400_000)), fx::compute_ix(&fx::unit_price(5_000_000))], TOP_UP_AMOUNT_ADDED, memo()), rej(RejectCode::SetupTransaction), - ); + ) + .also_conformant(&[crate::case::Alternative::Accept], super::CHANNEL_FEE_PRODUCT_POLICY); batch_verify_top_up_implicit_limit_priority_fee_over_cap_reject => policy_case( "batch-verify-top-up-implicit-limit-priority-fee-over-cap-reject", policy_spec("A sponsor MAY apply stricter local compute-unit, priority-fee, or required-signature caps, but MUST NOT relax the absolute maxima above."), &[CB_PRICE], "SetComputeUnitPrice 5001 with no SetComputeUnitLimit: the runtime budgets 200000 units for each of the top_up and the memo, so the sponsor would pay 2001 lamports, one over its cap (RULINGS S6). A verifier that bounds only declared limits accepts it.", top_up_tx(vec![fx::compute_ix(&fx::unit_price(5_001))], TOP_UP_AMOUNT_ADDED, memo()), rej(RejectCode::SetupTransaction), - ); + ) + .also_conformant(&[crate::case::Alternative::Accept], super::CHANNEL_FEE_PRODUCT_POLICY); batch_verify_top_up_three_lighthouse => policy_case( "batch-verify-top-up-three-lighthouse", policy_spec("and at most three Lighthouse instructions"), &[LAYOUT, ALLOWLIST], "Paired accept: the memo followed by three Lighthouse assertions in the suffix.", @@ -1542,7 +1604,7 @@ crate::registry! { Expect::Accept(Pin::Outcome), ); batch_verify_top_up_legacy_message => policy_case( - "batch-verify-top-up-legacy-message", policy_spec("The message MAY be legacy or version `0`, but it MUST NOT contain Address Lookup Table lookups."), &[STATIC_VALIDATE], + "batch-verify-top-up-legacy-message", policy_spec("The message version MUST be one advertised in `extra.transactionVersions` (0 when the field is absent; see [Transaction versions](#transaction-versions)), and the message MUST NOT contain Address Lookup Table lookups."), &[STATIC_VALIDATE], "The canonical top_up compiled as a legacy (unversioned) message: accepted and policed like version 0.", fx::sponsored_legacy(vec![fx::top_up_ix(&cfg(), TOP_UP_AMOUNT_ADDED), fx::memo_ix(fx::MEMO)]), Expect::Accept(Pin::Outcome), @@ -1627,7 +1689,7 @@ crate::registry! { rej(RejectCode::SetupTransaction), ); batch_verify_top_up_duplicate_limit_reject => policy_case( - "batch-verify-top-up-duplicate-limit-reject", policy_spec("An optional Compute Budget prefix containing at most one `SetComputeUnitLimit` instruction"), &[LAYOUT], + "batch-verify-top-up-duplicate-limit-reject", policy_spec("In a legacy or version-0 transaction, an optional Compute Budget prefix containing at most one `SetComputeUnitLimit` instruction"), &[LAYOUT], "Two SetComputeUnitLimit instructions.", top_up_tx(vec![fx::compute_ix(&fx::unit_limit(200_000)), fx::compute_ix(&fx::unit_limit(200_000))], TOP_UP_AMOUNT_ADDED, memo()), rej(RejectCode::SetupTransaction), @@ -1669,10 +1731,14 @@ crate::registry! { rej(RejectCode::SetupTransaction), ); batch_verify_top_up_trailing_bytes_reject => policy_case( - "batch-verify-top-up-trailing-bytes-reject", s("Canonical open", "The facilitator MUST fully decode the instruction data, reject truncated data or trailing bytes"), &[FULL_DECODE], - "top_up data with one trailing byte (10 bytes instead of 9).", + "batch-verify-top-up-trailing-bytes-reject", top_up_spec(), &[TOP_UP_AMOUNT], + "top_up data with one trailing byte (10 bytes instead of 9). The Rust sponsor decodes the top_up as strictly as the open and refuses it; the spec states the trailing-bytes rule for the open only.", fx::sponsored(vec![{ let mut ix = fx::top_up_ix(&cfg(), TOP_UP_AMOUNT_ADDED); ix.data.push(0); ix }, fx::memo_ix(fx::MEMO)]), rej(RejectCode::SetupTransaction), + ) + .also_conformant( + &[crate::case::Alternative::Accept], + "“The facilitator MUST fully decode the instruction data, reject truncated data or trailing bytes” is stated under Canonical open only; Canonical top_up requires that “The facilitator MUST confirm the decoded amount equals `payload.deposit.amount`”, which a decoder that ignores the extra byte also confirms.", ); batch_verify_top_up_fee_payer_as_account_reject => policy_case( "batch-verify-top-up-fee-payer-as-account-reject", s("Canonical top_up", "In this form `extra.feePayer` authorizes only the bounded transaction fee and MUST NOT be an instruction account, authority, source, or delegate."), &[TOP_UP_FEE_PAYER, "X402-9ca40ae469"], @@ -1799,7 +1865,7 @@ crate::registry! { "batch-verify-refund-voucher-not-accepted-cumulative-reject", "batch-verify-refund.json", Mode::VerifyTransaction, Role::Server, BugType::Settlement, s("4.5 Facilitator Interface", "In client mode it MUST reject a voucher whose `maxClaimableAmount` differs from its accepted cumulative amount."), "The refund's voucher is at 2000 while the server accepted 3000: a payer cannot close at an older watermark.", - refund_input_with(refund_payload(Some(honest_voucher(2_000)), Some(request_close(memo()))), ChannelAccount::default()), + from_store(refund_input_with(refund_payload(Some(honest_voucher(2_000)), Some(request_close(memo()))), ChannelAccount::default())), rej(RejectCode::CloseState), ).requirements(&[REFUND_CUMULATIVE]).authored(None).build(); batch_verify_refund_with_amount_reject => case( @@ -1873,15 +1939,15 @@ crate::registry! { // ── transaction versions (x402-txv1) ── batch_txv1_top_up_v1_advertised => txv1_case( - "batch-txv1-top-up-v1-advertised", tx_versions_spec("A version-1 transaction carries its compute budget in the message `TransactionConfig`."), &[TX_ADVERTISED, TX_DEPOSIT_VERSION, TX_V1_BUDGET], + "batch-txv1-top-up-v1-advertised", tx_versions_spec("A version-1 transaction carries its compute budget in the message's `TransactionConfigMask` and the config values that follow it"), &[TX_ADVERTISED, TX_DEPOSIT_VERSION, TX_V1_BUDGET], "The route advertises transactionVersions [0, 1]: a version-1 top_up with computeUnitLimit, loadedAccountsDataSizeLimit and a priorityFee within the cap in its header, no ComputeBudget instruction, is accepted.", v1_input(&v1_route(), v1_top_up(fx::v1_budget(), vec![])), Expect::Accept(Pin::Outcome), ).build(); batch_txv1_top_up_v1_not_advertised_reject => txv1_case( "batch-txv1-top-up-v1-not-advertised-reject", tx_versions_spec("The facilitator MUST reject a message whose version is outside the set it accepts, before inspecting any instruction, with `unsupported_transaction_version`."), &[TX_FACILITATOR_REJECTS, TX_ADVERTISED], - "The same version-1 top_up on a route that accepts only version 0 (no transactionVersions advertised).", - v1_input(&route(), v1_top_up(fx::v1_budget(), vec![])), + "The same version-1 top_up to a facilitator configured to accept only version 0 (batchServer.transactionVersions [0]).", + v1_input(&v0_only_route(), v1_top_up(fx::v1_budget(), vec![])), rej(RejectCode::UnsupportedVersion), ).authored(None).build(); batch_txv1_top_up_v0_on_v1_route => txv1_case( @@ -1891,31 +1957,31 @@ crate::registry! { Expect::Accept(Pin::Outcome), ).build(); batch_txv1_top_up_v1_compute_budget_instruction_reject => txv1_case( - "batch-txv1-top-up-v1-compute-budget-instruction-reject", t("Top-level instruction layout", "A version-1 transaction that contains a Compute Budget instruction MUST be rejected."), &[TX_V1_NO_CB], + "batch-txv1-top-up-v1-compute-budget-instruction-reject", t("Top-level instruction layout", "A version-1 transaction that contains a Compute Budget instruction MUST be rejected (an x402 sponsor rule; the runtime treats such instructions as no-ops)."), &[TX_V1_NO_CB], "A version-1 top_up that also carries a SetComputeUnitLimit instruction.", v1_input(&v1_route(), v1_top_up(fx::v1_budget(), vec![fx::compute_ix(&fx::unit_limit(200_000))])), rej(RejectCode::SetupTransaction), ).build(); batch_txv1_top_up_v1_missing_unit_limit_reject => txv1_case( - "batch-txv1-top-up-v1-missing-unit-limit-reject", t("Top-level instruction layout", "`computeUnitLimit` MUST be present and MUST NOT exceed `400000`"), &[TX_V1_CAPS, TX_V1_BUDGET], + "batch-txv1-top-up-v1-missing-unit-limit-reject", t("Top-level instruction layout", "`computeUnitLimit` (bit 2) MUST be set and MUST NOT exceed `400000`"), &[TX_V1_CAPS, TX_V1_BUDGET], "A version-1 top_up whose header config omits computeUnitLimit (it would be budgeted zero).", v1_input(&v1_route(), v1_top_up(solana_message::v1::TransactionConfig::empty().with_loaded_accounts_data_size_limit(64 * 1024 * 1024), vec![])), rej(RejectCode::SetupTransaction), ).build(); batch_txv1_top_up_v1_missing_loaded_limit_reject => txv1_case( - "batch-txv1-top-up-v1-missing-loaded-limit-reject", t("Top-level instruction layout", "`loadedAccountsDataSizeLimit` MUST be present"), &[TX_V1_CAPS, TX_V1_BUDGET], + "batch-txv1-top-up-v1-missing-loaded-limit-reject", t("Top-level instruction layout", "`loadedAccountsDataSizeLimit` (bit 3) MUST be set"), &[TX_V1_CAPS, TX_V1_BUDGET], "A version-1 top_up whose header config omits loadedAccountsDataSizeLimit.", v1_input(&v1_route(), v1_top_up(solana_message::v1::TransactionConfig::empty().with_compute_unit_limit(200_000), vec![])), rej(RejectCode::SetupTransaction), ).build(); batch_txv1_top_up_v1_loaded_limit_below_max => txv1_case( - "batch-txv1-top-up-v1-loaded-limit-below-max", t("Top-level instruction layout", "`loadedAccountsDataSizeLimit` MUST be present"), &[TX_V1_CAPS, TX_V1_BUDGET], + "batch-txv1-top-up-v1-loaded-limit-below-max", t("Top-level instruction layout", "`loadedAccountsDataSizeLimit` (bit 3) MUST be set"), &[TX_V1_CAPS, TX_V1_BUDGET], "A version-1 top_up whose header sets loadedAccountsDataSizeLimit 32 MiB (present, below the runtime maximum): the spec requires the field, not a particular value, and a sponsor may only tighten caps it names.", v1_input(&v1_route(), v1_top_up(fx::v1_budget().with_loaded_accounts_data_size_limit(32 * 1024 * 1024), vec![])), Expect::AcceptAuthored(json!({})), ).authored(None).build(); batch_txv1_top_up_v1_unit_limit_over_cap_reject => txv1_case( - "batch-txv1-top-up-v1-unit-limit-over-cap-reject", t("Top-level instruction layout", "`computeUnitLimit` MUST be present and MUST NOT exceed `400000`"), &[TX_V1_CAPS], + "batch-txv1-top-up-v1-unit-limit-over-cap-reject", t("Top-level instruction layout", "`computeUnitLimit` (bit 2) MUST be set and MUST NOT exceed `400000`"), &[TX_V1_CAPS], "Header computeUnitLimit 400001.", v1_input(&v1_route(), v1_top_up(fx::v1_budget().with_compute_unit_limit(400_001), vec![])), rej(RejectCode::SetupTransaction), @@ -1937,7 +2003,9 @@ crate::registry! { "priorityFee 2001 lamports at computeUnitLimit 200000: far under the per-unit cap, but one lamport over the cap the sponsor puts on the total fee it pays (RULINGS S6).", v1_input(&v1_route(), v1_top_up(fx::v1_budget().with_priority_fee(2_001), vec![])), rej(RejectCode::SetupTransaction), - ).build(); + ) + .also_conformant(&[crate::case::Alternative::Accept], super::CHANNEL_FEE_PRODUCT_POLICY) + .build(); batch_txv1_top_up_v0_over_1232_bytes_reject => txv1_case( "batch-txv1-top-up-v0-over-1232-bytes-reject", tx_versions_spec("A legacy or version-0 transaction MUST NOT exceed 1232 serialized bytes; a version-1 transaction MUST NOT exceed 4096 serialized bytes."), &[TX_SIZE], "A version-0 top_up whose three 330-byte Lighthouse assertions push it past 1232 serialized bytes.", @@ -1958,8 +2026,12 @@ crate::registry! { ).build(); batch_txv1_refund_v1_not_advertised_reject => txv1_case( "batch-txv1-refund-v1-not-advertised-reject", t("4.3 Client PaymentPayload Variants", "Its message version MUST be one advertised in `extra.transactionVersions`."), &[TX_REFUND_VERSION, TX_FACILITATOR_REJECTS], - "A client-mode refund whose request_close is version 1 on a route that accepts only version 0.", - refund_input_with(refund_payload(Some(honest_voucher(3_000)), Some(fx::sponsored_v1(vec![fx::request_close_ix(&cfg()), fx::memo_ix(fx::MEMO)], fx::v1_budget()))), ChannelAccount::default()), + "A client-mode refund whose request_close is version 1, to a facilitator configured to accept only version 0 (batchServer.transactionVersions [0]).", + { + let mut input = refund_input_with(refund_payload(Some(honest_voucher(3_000)), Some(fx::sponsored_v1(vec![fx::request_close_ix(&cfg()), fx::memo_ix(fx::MEMO)], fx::v1_budget()))), ChannelAccount::default()); + input["batchServer"] = v0_only_route().server_json(); + input + }, rej(RejectCode::UnsupportedVersion), ).authored(None).build(); } diff --git a/rust/crates/conformance/src/cases/x402_exact.rs b/rust/crates/conformance/src/cases/x402_exact.rs index 3d36ca48d..140190eb7 100644 --- a/rust/crates/conformance/src/cases/x402_exact.rs +++ b/rust/crates/conformance/src/cases/x402_exact.rs @@ -549,6 +549,10 @@ crate::registry! { X402HeaderSpec { mutation: Some(Mutation::OverPay { transfer: 0, delta: 1 }), ..header(devnet_route()) }, Expect::Accept(Pin::Envelope(vec!["x402Version", "hasAccepted", "payloadHasTransaction"])), ) + .also_conformant( + &[crate::case::Alternative::Reject(RejectCode::AmountMismatch)], + "§1.4 tolerates overpayment, but §3.1 also reads “Fee payer isolation, destination ATA derivation, and exact amount match are enforced on both layouts” and §2.3 lets a sponsor's policy refuse a scheme-valid transaction (“A transaction MAY be valid under the `exact` scheme while being rejected by a sponsor's policy.”), so a sponsor that requires the exact amount is conformant too (RULINGS S5).", + ) .build(); x402_exact_verify_accepted_amount_lie_reject => verify_case( "x402-exact-verify-accepted-amount-lie-reject", diff --git a/rust/crates/conformance/src/cases/x402_policy.rs b/rust/crates/conformance/src/cases/x402_policy.rs index a616af580..fe64ba000 100644 --- a/rust/crates/conformance/src/cases/x402_policy.rs +++ b/rust/crates/conformance/src/cases/x402_policy.rs @@ -17,7 +17,7 @@ use crate::mutate::Mutation; const VERIFY: &str = "x402-verify-policy.json"; const BUILD: &str = "x402-build-policy.json"; -const STATIC_LAYOUT: &str = "X402-a8bd75d71b"; +const STATIC_LAYOUT: &str = "X402-05c2aacafc"; const LIGHTHOUSE_ALLOWED: &str = "X402-a1cf65b0f0"; const FUND_SAFETY: &str = "X402-985ecc1ea3"; const SIGNATURE_ONLY_FOR_FEES: &str = "X402-0ad718daab"; @@ -90,7 +90,7 @@ crate::registry! { x402_exact_verify_unknown_program_reject => reject_case( "x402-exact-verify-unknown-program-reject", BugType::Settlement, - layout_spec("The decompiled transaction MUST contain 3 to 7 instructions in this order:"), + layout_spec("For a single-payee charge (no extra.splits and no ATA creation), a legacy or version-0 transaction MUST contain 3 to 7 instructions in this order:"), &[STATIC_LAYOUT], "An instruction of a program that is neither Lighthouse nor Memo (the Stake program) in an optional position of the static layout.", mutated(devnet_route(), Mutation::AddProgramInstruction { program: STAKE_PROGRAM, data: &[0] }), @@ -98,7 +98,7 @@ crate::registry! { x402_exact_verify_compute_heap_frame_reject => reject_case( "x402-exact-verify-compute-heap-frame-reject", BugType::Settlement, - layout_spec("The decompiled transaction MUST contain 3 to 7 instructions in this order:"), + layout_spec("For a single-payee charge (no extra.splits and no ATA creation), a legacy or version-0 transaction MUST contain 3 to 7 instructions in this order:"), &[STATIC_LAYOUT], "Position 1 must be SetComputeUnitLimit (ComputeBudget discriminator 2); here it is RequestHeapFrame (discriminator 1). Only unit limit and unit price are accepted compute budget instructions.", mutated(devnet_route(), Mutation::SetComputeBudgetData { index: 0, data: REQUEST_HEAP_FRAME }), @@ -106,7 +106,7 @@ crate::registry! { x402_exact_verify_extra_compute_budget_reject => reject_case( "x402-exact-verify-extra-compute-budget-reject", BugType::Settlement, - layout_spec("The decompiled transaction MUST contain 3 to 7 instructions in this order:"), + layout_spec("For a single-payee charge (no extra.splits and no ATA creation), a legacy or version-0 transaction MUST contain 3 to 7 instructions in this order:"), &[STATIC_LAYOUT], "A third ComputeBudget instruction (RequestHeapFrame) ahead of the unit limit and price, so the transfer is no longer at position 3.", mutated(devnet_route(), Mutation::AddComputeBudget { data: REQUEST_HEAP_FRAME }), @@ -142,7 +142,8 @@ crate::registry! { &[SPONSORSHIP_ABUSE], "The static layout's 200,000 compute unit limit paired with a 5,000,000 micro-lamport unit price: each is within its own cap, but the sponsor would pay a 1,000,000 lamport priority fee. The sponsor bounds the fee it pays as limit times price (RULINGS S6). Differs from x402-exact-v2-verify-accept only in the price.", mutated(devnet_route(), Mutation::SetComputeUnitPrice { micro_lamports: 5_000_000 }), - ); + ) + .also_conformant(&[crate::case::Alternative::Accept], super::SPONSOR_FEE_PRODUCT_POLICY); // RULINGS SIG1: the client's signature verifies over this message // before the sponsor claims, co-signs or sends it. x402_exact_verify_forged_client_signature_reject => reject_case( diff --git a/rust/crates/conformance/src/cases/x402_tx_versions.rs b/rust/crates/conformance/src/cases/x402_tx_versions.rs index 95e5e22b5..419b347f1 100644 --- a/rust/crates/conformance/src/cases/x402_tx_versions.rs +++ b/rust/crates/conformance/src/cases/x402_tx_versions.rs @@ -30,16 +30,19 @@ const INTERSECT_HIGHEST: &str = "X402TX-61c735c7a9"; const EMPTY_FAILS: &str = "X402TX-2909c4b4ec"; const SPONSOR_SET: &str = "X402TX-24efe57db3"; const SIZE_LIMITS: &str = "X402TX-dc7b0f3305"; -const V1_BUDGET: &str = "X402TX-644919eb3b"; -const V1_CAPS: &str = "X402TX-eb681e1701"; -const V1_NO_BUDGET_IX: &str = "X402TX-936b492daa"; -const V1_LAYOUT: &str = "X402TX-d188782061"; -const FAST_PATH_PRICE: &str = "X402TX-2ad7a3f326"; +const V1_BUDGET: &str = "X402TX-f9bcc1a14a"; +const V1_CAPS: &str = "X402TX-997feeb51d"; +const V1_NO_BUDGET_IX: &str = "X402TX-915632f040"; +const V1_CLIENT_NO_BUDGET_IX: &str = "X402TX-4cd70365fd"; +const V1_FEE_PRECISION: &str = "X402TX-74fb884aa9"; +const V1_LAYOUT: &str = "X402TX-4c2fd60e66"; +const FAST_PATH_PRICE: &str = "X402TX-655bb4a79a"; const EXACTLY_ONE: &str = "X402TX-ee90546220"; const NOT_LESS: &str = "X402TX-516a2d7b57"; const FEE_PAYER_ISOLATION: &str = "X402TX-dd5384e0fe"; const SELF_SPEND: &str = "X402TX-bc031b7add"; const TRANSFER_MATCH: &str = "X402TX-f9c2b66234"; +const INVALID_ENTRY: &str = "X402TX-927d17b62e"; const BOTH: &[u8] = &[0, 1]; @@ -87,7 +90,7 @@ fn caps_spec() -> SpecRef { spec( SVM, "2.2.1 Compute Budget Controls (SHOULD)", - "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed the configured maximum, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= maxPriorityFeeMicroLamports computeUnitLimit.", + "In a version-1 transaction the same caps apply to the message config values instead (§1.5): computeUnitLimit (bit 2) MUST be set and MUST NOT exceed the configured maximum, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy", ) } @@ -95,7 +98,7 @@ fn layout_spec() -> SpecRef { spec( SVM, "3.1 Path 1 — Static Layout Verification (standard wallets)", - "A version-1 transaction MUST contain 1 to 5 instructions in this order:", + "For a single-payee charge, a version-1 transaction MUST contain 1 to 5 instructions in this order:", ) } @@ -294,6 +297,26 @@ crate::registry! { ) .authored(None) .build(); + x402_build_unknown_entry_reject => build( + "x402-build-unknown-entry-reject", + spec(SVM, "1.5 Transaction Versions (MUST)", "A client or server MUST treat a field containing any non-integer entry (a string, null, or \"legacy\") or any integer other than 0 or 1 as invalid and fail closed with unsupported_transaction_version."), + &[INVALID_ENTRY], + "extra.transactionVersions [2, 1, 0]: version 2 is not a defined entry, so the whole field is invalid and the client fails with unsupported_transaction_version instead of building version 1 from the entries it knows.", + build_with(v1_offer(json!([2, 1, 0])), json!({})), + reject(RejectCode::UnsupportedVersion, "unsupported_transaction_version: invalid entry 2"), + ) + .authored(None) + .build(); + x402_build_string_entry_reject => build( + "x402-build-string-entry-reject", + spec(SVM, "1.5 Transaction Versions (MUST)", "A client or server MUST treat a field containing any non-integer entry (a string, null, or \"legacy\") or any integer other than 0 or 1 as invalid and fail closed with unsupported_transaction_version."), + &[INVALID_ENTRY], + "extra.transactionVersions [\"1\", 0]: a stringified version is not a valid entry, so the client fails with unsupported_transaction_version rather than reading it as 1 or skipping it.", + build_with(v1_offer(json!(["1", 0])), json!({})), + reject(RejectCode::UnsupportedVersion, "unsupported_transaction_version: string entry"), + ) + .authored(None) + .build(); x402_build_legacy_only_reject => build( "x402-build-legacy-only-reject", spec(SVM, "1.5 Transaction Versions (MUST)", "They are never advertised in extra.transactionVersions and clients MUST NOT build them."), @@ -320,8 +343,8 @@ crate::registry! { BugType::AuthBypass, sponsor_spec(), &[SPONSOR_SET, PAYLOAD_VERSION], - "A sponsor with the default accepted set [0] receives the same valid version-1 transaction: rejected with unsupported_transaction_version before any instruction is inspected. Pair: x402-verify-v1-accept.", - layout(MessageFormat::V1, None, None), + "A sponsor whose accepted set is [0] receives the same valid version-1 transaction: rejected with unsupported_transaction_version before any instruction is inspected. The set is stated explicitly (input.x402ServerTransactionVersions): §1.5 gives the sponsor's own set no default. Pair: x402-verify-v1-accept.", + layout(MessageFormat::V1, Some(&[0]), None), reject(RejectCode::UnsupportedVersion, "unsupported_transaction_version"), ).build(); x402_verify_v1_explicit_v0_sponsor_reject => verify( @@ -378,8 +401,8 @@ crate::registry! { x402_verify_v1_compute_budget_instruction_reject => verify( "x402-verify-v1-compute-budget-instruction-reject", BugType::Settlement, - spec(SVM, "2.2.1 Compute Budget Controls (SHOULD)", "A version-1 transaction that contains a Compute Budget instruction MUST be rejected."), - &[V1_NO_BUDGET_IX, V1_BUDGET], + spec(SVM, "2.2.1 Compute Budget Controls (SHOULD)", "A version-1 transaction that contains a Compute Budget instruction MUST be rejected (an x402 sponsor rule; the runtime treats such instructions as no-ops)."), + &[V1_NO_BUDGET_IX, V1_CLIENT_NO_BUDGET_IX, V1_BUDGET], "Version-1 static layout preceded by a SetComputeUnitLimit instruction: the runtime ignores it under version 1, so a sponsor bounding it bounds nothing. Pair: x402-verify-v1-accept.", layout(MessageFormat::V1, Some(BOTH), Some(Mutation::AddComputeBudget { data: LIMIT_IX })), from_table(&Mutation::AddComputeBudget { data: LIMIT_IX }), @@ -404,13 +427,40 @@ crate::registry! { ) .authored(None) .build(); + x402_verify_v1_loaded_data_limit_4mib_accept => verify( + "x402-verify-v1-loaded-data-limit-4mib-accept", + BugType::Settlement, + caps_spec(), + &[V1_CAPS, V1_BUDGET], + "Version-1 header loadedAccountsDataSizeLimit 4194304 (4 MiB), what the TypeScript, Go and Python x402 clients request: the spec requires the limit to be set, not to be the runtime maximum, so a sponsor that demands 64 MiB refuses every reference client. Pair: x402-verify-v1-missing-loaded-data-limit-reject.", + layout(MessageFormat::V1, Some(BOTH), Some(Mutation::V1LoadedAccountsDataSizeLimit { bytes: 4 * 1024 * 1024 })), + Expect::Accept(Pin::Outcome), + ).build(); + x402_verify_v1_loaded_data_limit_small_accept => verify( + "x402-verify-v1-loaded-data-limit-small-accept", + BugType::Settlement, + caps_spec(), + &[V1_CAPS], + "Version-1 header loadedAccountsDataSizeLimit 32768 (32 KiB), set but small: accepted at verification. A budget too small to load the payment's programs fails at simulation, which this offline vector does not run.", + layout(MessageFormat::V1, Some(BOTH), Some(Mutation::V1LoadedAccountsDataSizeLimit { bytes: 32 * 1024 })), + Expect::Accept(Pin::Outcome), + ).build(); + x402_verify_v1_heap_size_reject => verify( + "x402-verify-v1-heap-size-reject", + BugType::Settlement, + spec(SVM, "2.2.1 Compute Budget Controls (SHOULD)", "Only SetComputeUnitLimit (discriminator 2) and SetComputeUnitPrice (discriminator 3) SHOULD be accepted; other ComputeBudget instruction types expand execution surface without being necessary for payment verification and SHOULD be rejected."), + &[V1_CAPS], + "Version-1 header requesting a 64 KiB heap (TransactionConfigMask bit 4), the header form of RequestHeapFrame that a sponsor refuses on version 0 (x402-exact-verify-compute-heap-frame-reject). Pair: x402-verify-v1-accept.", + layout(MessageFormat::V1, Some(BOTH), Some(Mutation::V1HeapSize { bytes: 64 * 1024 })), + from_table(&Mutation::V1HeapSize { bytes: 64 * 1024 }), + ).build(); x402_verify_v1_compute_limit_at_cap_accept => verify( "x402-verify-v1-compute-limit-at-cap-accept", BugType::Settlement, caps_spec(), &[V1_CAPS], - "Version-1 header computeUnitLimit at the configured maximum (200000): accepted (the base layout already sits at the cap; this pins it explicitly next to its over-cap pair).", - layout(MessageFormat::V1, Some(BOTH), Some(Mutation::V1ComputeUnitLimit { limit: 200_000 })), + "Version-1 header computeUnitLimit at the reference default maximum (400000, scheme_exact_svm.md §2.2.1): accepted, pinned next to its over-cap pair.", + layout(MessageFormat::V1, Some(BOTH), Some(Mutation::V1ComputeUnitLimit { limit: 400_000 })), Expect::Accept(Pin::Outcome), ).build(); x402_verify_v1_compute_limit_over_cap_reject => verify( @@ -418,14 +468,14 @@ crate::registry! { BugType::Settlement, caps_spec(), &[V1_CAPS], - "Version-1 header computeUnitLimit 200001, one unit over the configured maximum.", - layout(MessageFormat::V1, Some(BOTH), Some(Mutation::V1ComputeUnitLimit { limit: 200_001 })), - from_table(&Mutation::V1ComputeUnitLimit { limit: 200_001 }), + "Version-1 header computeUnitLimit 400001, one unit over the reference default maximum (scheme_exact_svm.md §2.2.1: 400,000).", + layout(MessageFormat::V1, Some(BOTH), Some(Mutation::V1ComputeUnitLimit { limit: 400_001 })), + from_table(&Mutation::V1ComputeUnitLimit { limit: 400_001 }), ).build(); x402_verify_v1_priority_fee_at_cap_accept => verify( "x402-verify-v1-priority-fee-at-cap-accept", BugType::Settlement, - spec(SVM, "3.1 Path 1 — Static Layout Verification (standard wallets)", "The legacy/version-0 Compute Budget price and the version-1 total priority fee MUST each be no greater than 5 lamports/CU on this path, using the normalization in §1.5 for version 1."), + spec(SVM, "3.1 Path 1 — Static Layout Verification (standard wallets)", "The legacy/version-0 Compute Budget price and the version-1 total priority fee MUST each be no greater than maxPriorityFeeMicroLamports (default 5 lamports/CU) on this path, using the normalization in §1.5 for version 1."), &[FAST_PATH_PRICE, V1_CAPS], "Version-1 priorityFee 1500 lamports over 300 units: exactly 5 lamports (5000000 micro-lamports) per unit, the fast-path cap, and under the 2000 lamport cap a sponsor may put on the total fee (scheme_exact_svm.md §2.2.1). Accepted (the cap is inclusive).", layout(MessageFormat::V1, Some(BOTH), Some(Mutation::V1Budget { limit: 300, lamports: 1_500 })), @@ -434,8 +484,8 @@ crate::registry! { x402_verify_v1_priority_fee_over_cap_reject => verify( "x402-verify-v1-priority-fee-over-cap-reject", BugType::Settlement, - spec(SVM, "3.1 Path 1 — Static Layout Verification (standard wallets)", "The legacy/version-0 Compute Budget price and the version-1 total priority fee MUST each be no greater than 5 lamports/CU on this path, using the normalization in §1.5 for version 1."), - &[FAST_PATH_PRICE, V1_CAPS], + spec(SVM, "3.1 Path 1 — Static Layout Verification (standard wallets)", "The legacy/version-0 Compute Budget price and the version-1 total priority fee MUST each be no greater than maxPriorityFeeMicroLamports (default 5 lamports/CU) on this path, using the normalization in §1.5 for version 1."), + &[FAST_PATH_PRICE, V1_CAPS, V1_FEE_PRECISION], "Version-1 priorityFee 1501 lamports over 300 units: one lamport above priorityFee * 1000000 <= 5000000 * 300, and still under a 2000 lamport cap on the total fee, so only the per-unit rule rejects it. A sponsor that compares the lamport total with the per-unit cap accepts it.", layout(MessageFormat::V1, Some(BOTH), Some(Mutation::V1Budget { limit: 300, lamports: 1_501 })), from_table(&Mutation::V1Budget { limit: 300, lamports: 1_501 }), @@ -478,7 +528,12 @@ crate::registry! { &[EXACTLY_ONE], "Version-1 TransferChecked declaring 9 decimals for a 6-decimal mint.", Mutation::SetDecimals { transfer: 0, decimals: 9 }, - ).build(); + ) + .also_conformant( + &[crate::case::Alternative::Accept], + "§1.4 matches a transfer by mint, destination ATA and amount (“correct mint, correct destination ATA, amount >= required”) and the scheme never names the TransferChecked decimals; the token program fails a TransferChecked whose decimals differ from the mint's, which the sponsor's simulation catches (§2.2.3, not run by offline vectors), so a static verifier that leaves it to simulation is conformant.", + ) + .build(); x402_verify_v1_fee_payer_authority_reject => v1_policy( "x402-verify-v1-fee-payer-authority-reject", spec(SVM, "2.1.1 Fee Payer Isolation (MUST)", "The fee payer / sponsor MUST NOT be the authority on any observed transfer (self-spend protection)."), diff --git a/rust/crates/conformance/src/cases/x402_upto.rs b/rust/crates/conformance/src/cases/x402_upto.rs index d831368f4..28909441f 100644 --- a/rust/crates/conformance/src/cases/x402_upto.rs +++ b/rust/crates/conformance/src/cases/x402_upto.rs @@ -54,7 +54,7 @@ const REDERIVE_PDA: &str = "X402-cf373442ff"; const OPEN_ENCODES: &str = "X402-d75fb10a6f"; const DEPOSIT_NO_VOUCHER: &str = "X402-f747c74e76"; const STATIC_INSPECT: &str = "X402-52c9f1e405"; -const NO_LOOKUP_TABLES: &str = "X402-c1174b72d8"; +const NO_LOOKUP_TABLES: &str = "X402-4de59a1f27"; const FEE_PAYER_EQ: &str = "X402-9d68660de5"; const SIGNER_SET: &str = "X402-9af8f33cd6"; const FROM_SIGNATURE: &str = "X402-bcbf7025e5"; @@ -85,11 +85,11 @@ const TV_CLIENT: &str = "X402TX-61c735c7a9"; const TV_CLIENT_EMPTY: &str = "X402TX-2909c4b4ec"; const TV_REJECT_FIRST: &str = "X402TX-5267172b18"; const TV_SIZE: &str = "X402TX-dc7b0f3305"; -const TV_V1_BUDGET: &str = "X402TX-644919eb3b"; +const TV_V1_BUDGET: &str = "X402TX-f9bcc1a14a"; const TV_MESSAGE: &str = "X402TX-4de59a1f27"; const TV_NO_PREFIX: &str = "X402TX-125d312b26"; -const TV_V1_CAPS: &str = "X402TX-0f874a9c63"; -const TV_V1_NO_CB: &str = "X402TX-936b492daa"; +const TV_V1_CAPS: &str = "X402TX-703c03cfb5"; +const TV_V1_NO_CB: &str = "X402TX-915632f040"; const TV_LEGACY: &str = "X402TX-77742f428c"; const TV_OPEN_VERSION: &str = "X402TX-d444d01b9e"; @@ -195,7 +195,7 @@ fn s_txv1_budget() -> SpecRef { spec( TXV1, "Top-level instruction layout", - "In a version-1 transaction the same caps apply to the message TransactionConfig instead: computeUnitLimit MUST be present and MUST NOT exceed 400000, loadedAccountsDataSizeLimit MUST be present, and priorityFee (total lamports) MUST satisfy priorityFee 1000000 <= 5000000 computeUnitLimit.", + "computeUnitLimit (bit 2) MUST be set and MUST NOT exceed 400000, loadedAccountsDataSizeLimit (bit 3) MUST be set, and priorityFee (bits 0 and 1, total lamports) MUST satisfy priorityFee * 1000000 <= 5000000 * computeUnitLimit, evaluated without overflow.", ) } @@ -219,6 +219,17 @@ fn v1_route() -> Route { } } +/// A sponsor configured to accept version 0 only, stated explicitly: the +/// scheme gives a facilitator's own accepted set no default (“The facilitator +/// enforces its own accepted set; it does not read +/// `PaymentRequirements.extra.transactionVersions`.”). +fn v0_only_route() -> Route { + Route { + versions: Some(vec![0]), + ..Route::default() + } +} + fn input_of(spec: &VerifySpec) -> Input { Input::Static( spec.input() @@ -525,7 +536,7 @@ crate::registry! { x402_upto_verify_legacy_message_accept => accept( "x402-upto-verify-legacy-message-accept", POLICY_FILE, - spec(SVM, "Message and signer rules", "The message MAY be legacy or version 0, but it MUST NOT contain Address Lookup Table lookups."), + spec(SVM, "Message and signer rules", "The message version MUST be one advertised in extra.transactionVersions (0 when the field is absent; see [Transaction versions](#transaction-versions)), and the message MUST NOT contain Address Lookup Table lookups."), &[NO_LOOKUP_TABLES], "The same open compiled as a legacy (unversioned) message is accepted and policed like version 0.", with(base(), Tamper::Form(Form::Legacy)), @@ -883,7 +894,7 @@ crate::registry! { x402_upto_verify_lookup_table_reject => reject( "x402-upto-verify-lookup-table-reject", POLICY_FILE, - spec(SVM, "Message and signer rules", "The message MAY be legacy or version 0, but it MUST NOT contain Address Lookup Table lookups."), + spec(SVM, "Message and signer rules", "The message version MUST be one advertised in extra.transactionVersions (0 when the field is absent; see [Transaction versions](#transaction-versions)), and the message MUST NOT contain Address Lookup Table lookups."), &[NO_LOOKUP_TABLES], BugType::AuthBypass, base(), @@ -1122,7 +1133,8 @@ crate::registry! { with(base(), Tamper::Prefix(vec![unit_limit_ix(400_000), unit_price_ix(5_000_000)])), Expect::Reject { code: RejectCode::ComputePriceOverCap, reason: None }, None, - ); + ) + .also_conformant(&[crate::case::Alternative::Accept], super::CHANNEL_FEE_PRODUCT_POLICY); x402_upto_verify_implicit_limit_priority_fee_over_cap_reject => verify_case( "x402-upto-verify-implicit-limit-priority-fee-over-cap-reject", POLICY_FILE, @@ -1133,7 +1145,8 @@ crate::registry! { with(base(), Tamper::Prefix(vec![unit_price_ix(5_001)])), Expect::Reject { code: RejectCode::ComputePriceOverCap, reason: None }, None, - ); + ) + .also_conformant(&[crate::case::Alternative::Accept], super::CHANNEL_FEE_PRODUCT_POLICY); x402_upto_verify_compute_limit_over_cap_reject => reject( "x402-upto-verify-compute-limit-over-cap-reject", POLICY_FILE, @@ -1159,7 +1172,7 @@ crate::registry! { x402_upto_verify_compute_duplicate_limit_reject => reject( "x402-upto-verify-compute-duplicate-limit-reject", POLICY_FILE, - spec(SVM, "Top-level instruction layout", "An optional Compute Budget prefix containing at most one SetComputeUnitLimit instruction and at most one SetComputeUnitPrice instruction."), + spec(SVM, "Top-level instruction layout", "In a legacy or version-0 transaction, an optional Compute Budget prefix containing at most one SetComputeUnitLimit instruction and at most one SetComputeUnitPrice instruction."), &[LAYOUT], BugType::Wire, base(), @@ -1170,7 +1183,7 @@ crate::registry! { x402_upto_verify_compute_duplicate_price_reject => reject( "x402-upto-verify-compute-duplicate-price-reject", POLICY_FILE, - spec(SVM, "Top-level instruction layout", "An optional Compute Budget prefix containing at most one SetComputeUnitLimit instruction and at most one SetComputeUnitPrice instruction."), + spec(SVM, "Top-level instruction layout", "In a legacy or version-0 transaction, an optional Compute Budget prefix containing at most one SetComputeUnitLimit instruction and at most one SetComputeUnitPrice instruction."), &[LAYOUT], BugType::Wire, base(), @@ -1572,20 +1585,6 @@ crate::registry! { Expect::AcceptAuthored(json!({"exactBytes": {"openMessageVersion": 0}})), None, ); - x402_upto_build_foreign_blockhash_reject => build_case( - "x402-upto-build-foreign-blockhash-reject", - BUILD_FILE, - spec(SVM, "Phase 1 - Setup", "The client builds an open transaction against the canonical payment-channels program, deposits maxAmount, sets payee and rent_payer to extra.feePayer, sets authorized_signer to extra.receiverAuthorizer, encodes grace_period = extra.withdrawDelay, and signs as channel payer."), - &[CLIENT_DERIVES], - "extra.recentBlockhash is not a live blockhash on the client's cluster (its RPC's latest is another). The blockhash alone binds the signed open to a cluster, so an open over it would escrow maxAmount on whichever cluster knows that hash rather than the offer's network: the client refuses the challenge before signing. Pair: x402-upto-build-accept.", - { - let mut input = build_input(Route::default().offer()); - input["rpcFixtures"]["recentBlockhash"] = json!(crate::realize::session::OTHER_BLOCKHASH); - input - }, - Expect::Reject { code: RejectCode::InvalidChallenge, reason: Some("recentBlockhash unknown to the client's cluster".into()) }, - None, - ); x402_upto_build_zero_withdraw_delay_reject => build_case( "x402-upto-build-zero-withdraw-delay-reject", BUILD_FILE, @@ -1682,7 +1681,7 @@ crate::registry! { s_txv1_reject(), &[TV_REJECT_FIRST, TV_MESSAGE], BugType::Wire, - base(), + VerifySpec::honest(v0_only_route()), Tamper::Form(Form::v1()), RejectCode::UnsupportedVersion, None, @@ -1693,7 +1692,7 @@ crate::registry! { s_txv1_reject(), &[TV_REJECT_FIRST], BugType::Wire, - with(base(), Tamper::Suffix(vec![memo_ix(NONCE_MEMO), solana_instruction::Instruction { program_id: keys::pubkey(keys::SPLIT_RECIPIENT_2), accounts: vec![], data: vec![1] }])), + with(VerifySpec::honest(v0_only_route()), Tamper::Suffix(vec![memo_ix(NONCE_MEMO), solana_instruction::Instruction { program_id: keys::pubkey(keys::SPLIT_RECIPIENT_2), accounts: vec![], data: vec![1] }])), Tamper::Form(Form::v1()), RejectCode::UnsupportedVersion, None, @@ -1701,7 +1700,7 @@ crate::registry! { x402_upto_verify_v1_compute_budget_instruction_reject => reject( "x402-upto-verify-v1-compute-budget-instruction-reject", TXV1_FILE, - spec(TXV1, "Top-level instruction layout", "A version-1 transaction that contains a Compute Budget instruction MUST be rejected."), + spec(TXV1, "Top-level instruction layout", "A version-1 transaction that contains a Compute Budget instruction MUST be rejected (an x402 sponsor rule; the runtime treats such instructions as no-ops)."), &[TV_V1_NO_CB, TV_NO_PREFIX], BugType::Wire, with(VerifySpec::honest(v1_route()), Tamper::Form(Form::v1())), @@ -1749,7 +1748,8 @@ crate::registry! { with(VerifySpec::honest(v1_route()), Tamper::Form(Form::V1 { unit_limit: Some(200_000), priority_fee_lamports: Some(2_001), loaded_accounts_data_size_limit: Some(64 * 1024 * 1024) })), Expect::Reject { code: RejectCode::ComputePriceOverCap, reason: None }, None, - ); + ) + .also_conformant(&[crate::case::Alternative::Accept], super::CHANNEL_FEE_PRODUCT_POLICY); x402_upto_verify_v1_missing_limit_reject => verify_case( "x402-upto-verify-v1-missing-limit-reject", TXV1_FILE, diff --git a/rust/crates/conformance/src/interop/adapters.rs b/rust/crates/conformance/src/interop/adapters.rs index f6b65d10d..cad745bd7 100644 --- a/rust/crates/conformance/src/interop/adapters.rs +++ b/rust/crates/conformance/src/interop/adapters.rs @@ -126,6 +126,18 @@ const RUST_UPTO_SERVER: Native = native( "../rust", "x402_harness_upto_server", ); +const RUST_BATCH_CLIENT: Native = native( + "rust-client-rust-x402-batch", + "rust", + "../rust", + "x402_harness_batch_client", +); +const RUST_BATCH_SERVER: Native = native( + "rust-server-rust-x402-batch", + "rust", + "../rust", + "x402_harness_batch_server", +); const GO_CLIENT: Native = native("go-client-go", "go", "go-client", "paykit-client"); const GO_SERVER: Native = native("go-server-go", "go", "go-server", "paykit-server"); const SWIFT_CLIENT: Native = native( @@ -189,6 +201,14 @@ const TS_EXACT_CLIENT: &[&str] = &[ "tsx", "src/fixtures/typescript/exact-client.ts", ]; +const TS_UPTO_SERVER: &[&str] = &[ + "pnpm", + "exec", + "node", + "--import", + "tsx", + "src/fixtures/typescript/upto-server.ts", +]; const TS_EXACT_SERVER: &[&str] = &[ "pnpm", "exec", @@ -264,7 +284,7 @@ const fn a( } } -use Intent::{Charge, Session, X402Exact, X402Upto}; +use Intent::{Charge, Session, X402Batch, X402Exact, X402Upto}; use Launch::{Native as N, Source as S}; use Role::{Client as C, Server as Sv}; @@ -371,8 +391,19 @@ pub const ADAPTERS: &[Adapter] = &[ ), // x402 upto servers. a("rust", "rust", Sv, X402Upto, "rust", N(RUST_UPTO_SERVER)), + a( + "typescript", + "typescript", + Sv, + X402Upto, + "typescript", + S(TS_UPTO_SERVER), + ), a("go", "go", Sv, X402Upto, "go-paykit", N(GO_SERVER)), a("python", "python", Sv, X402Upto, "python", S(PY_SERVER)), + // x402 batch-settlement: only the Rust SDK implements it. + a("rust", "rust", C, X402Batch, "rust", N(RUST_BATCH_CLIENT)), + a("rust", "rust", Sv, X402Batch, "rust", N(RUST_BATCH_SERVER)), // MPP session. a( "python", diff --git a/rust/crates/conformance/src/interop/chain.rs b/rust/crates/conformance/src/interop/chain.rs index cbcad9b67..fdb6bd2e9 100644 --- a/rust/crates/conformance/src/interop/chain.rs +++ b/rust/crates/conformance/src/interop/chain.rs @@ -230,6 +230,22 @@ impl Chain { // create it (draft-solana-charge-00 "SPL Tokens"). self.fund_token(&acc.pay_to.pubkey, mint, 1, program)?; self.fund_token(&acc.upto_pay_to.pubkey, mint, 1, program)?; + // batch-settlement: the sponsor holds the channel's zero-share + // payee seat, whose token account the settlement simulation reads. + // Its distribute also pays the protocol treasury's token account, + // which a deployed cluster already has. + if scenario.intent == super::claims::Intent::X402Batch { + self.fund_token(&acc.fee_payer.pubkey, mint, 0, program)?; + } + // Payment-channels `distribute` (batch and upto) also pays the + // protocol treasury's token account, which a deployed cluster + // already has; the upto readiness check refuses the open without it. + if matches!( + scenario.intent, + super::claims::Intent::X402Batch | super::claims::Intent::X402Upto + ) { + self.fund_token(PAYMENT_CHANNEL_TREASURY_OWNER, mint, 0, program)?; + } if scenario.pre_create_platform_ata { self.fund_token(&acc.platform.pubkey, mint, 0, program)?; } @@ -243,6 +259,24 @@ impl Chain { .map_err(|e| format!("{method}: {e}")) } + /// Confirmed signatures touching `address`, newest first. + pub fn signatures_for_address(&self, address: &str) -> Result, String> { + let v = self.send( + "getSignaturesForAddress", + json!([address, {"commitment": "confirmed"}]), + )?; + v.as_array() + .ok_or_else(|| format!("getSignaturesForAddress {address}: {v}"))? + .iter() + .map(|entry| { + entry["signature"] + .as_str() + .map(str::to_string) + .ok_or_else(|| format!("getSignaturesForAddress {address}: {entry}")) + }) + .collect() + } + /// Token balance of `owner`'s ATA; a missing account reads as zero. pub fn token_balance(&self, owner: &str, mint: &str, program: &str) -> Result { let ata = crate::keys::ata(owner, mint, program).to_string(); @@ -283,7 +317,8 @@ impl Chain { loop { let v = self.send( "getTransaction", - json!([signature, {"commitment": "confirmed", "encoding": "base64", "maxSupportedTransactionVersion": 0}]), + // Version 1 (SIMD-0385) settlements are read back too. + json!([signature, {"commitment": "confirmed", "encoding": "base64", "maxSupportedTransactionVersion": 1}]), ); match v { Ok(v) if !v.is_null() => return Ok(v), diff --git a/rust/crates/conformance/src/interop/claims.rs b/rust/crates/conformance/src/interop/claims.rs index 9e13ea4c7..ca76e89c3 100644 --- a/rust/crates/conformance/src/interop/claims.rs +++ b/rust/crates/conformance/src/interop/claims.rs @@ -9,14 +9,17 @@ pub enum Intent { Charge, X402Exact, X402Upto, + /// x402 `batch-settlement`: deposit, vouchers, then out-of-band redemption. + X402Batch, Session, } impl Intent { - pub const ALL: [Intent; 4] = [ + pub const ALL: [Intent; 5] = [ Intent::Charge, Intent::X402Exact, Intent::X402Upto, + Intent::X402Batch, Intent::Session, ]; @@ -26,6 +29,7 @@ impl Intent { Intent::Charge => "charge", Intent::X402Exact => "x402-exact", Intent::X402Upto => "x402-upto", + Intent::X402Batch => "x402-batch", Intent::Session => "session", } } @@ -33,7 +37,7 @@ impl Intent { pub fn protocol(self) -> &'static str { match self { Intent::Charge | Intent::Session => "mpp", - Intent::X402Exact | Intent::X402Upto => "x402", + Intent::X402Exact | Intent::X402Upto | Intent::X402Batch => "x402", } } @@ -42,6 +46,7 @@ impl Intent { Intent::Charge => "charge", Intent::X402Exact => "exact", Intent::X402Upto => "upto", + Intent::X402Batch => "batch-settlement", Intent::Session => "session", } } diff --git a/rust/crates/conformance/src/interop/runner.rs b/rust/crates/conformance/src/interop/runner.rs index 605d29f0b..a5ffb7fd6 100644 --- a/rust/crates/conformance/src/interop/runner.rs +++ b/rust/crates/conformance/src/interop/runner.rs @@ -218,16 +218,19 @@ pub fn environment(s: &Scenario, acc: &Accounts, rpc_url: &str) -> BTreeMap { + Intent::X402Exact | Intent::X402Upto | Intent::X402Batch => { set( "PAY_KIT_HARNESS_PROTOCOL", - if s.intent == Intent::X402Upto { - "x402-upto" - } else { - "x402" + match s.intent { + Intent::X402Upto => "x402-upto", + Intent::X402Batch => "x402-batch", + _ => "x402", } .into(), ); + if let Some(channels) = s.batch_channels { + set("X402_HARNESS_BATCH_CHANNELS", channels.to_string()); + } set("X402_HARNESS_AMOUNT", s.amount.into()); if let Some(actual) = s.actual_amount { set("X402_HARNESS_ACTUAL_AMOUNT", actual.into()); @@ -340,7 +343,35 @@ fn paid_once(s: &Scenario, before: &Balances, after: &Balances) -> Result<(), St fn settled(ctx: &Ctx<'_>, s: &Scenario, acc: &Accounts, signature: &str) -> Result<(), String> { let tx = ctx.chain.transaction(signature, SETTLEMENT_DEADLINE)?; let message = settle::decode(&tx)?; - settle::assert_shape(s, acc, &message) + if let Some(version) = s.settled_version { + if message.version() != version.to_string() { + return Err(format!( + "settled transaction is version {}, expected version {version}", + message.version() + )); + } + } + settle::assert_shape(s, acc, &message)?; + if let Some(version) = s.open_version { + let channel = message + .upto_channel(s.primary_delta()) + .ok_or("the settlement names no channel")? + .to_string(); + // The channel's first transaction is the client's open. + let open = ctx + .chain + .signatures_for_address(&channel)? + .pop() + .ok_or_else(|| format!("no transaction on channel {channel}"))?; + let open_version = + settle::decode(&ctx.chain.transaction(&open, SETTLEMENT_DEADLINE)?)?.version(); + if open_version != version.to_string() { + return Err(format!( + "channel open {open} is version {open_version}, expected version {version}" + )); + } + } + Ok(()) } fn assert_paid( @@ -374,6 +405,86 @@ fn assert_paid( Ok(()) } +/// `x402-batch`: every deposit open landed; the server redeemed every channel +/// with one claim and one distribute transaction while they fit one version-1 +/// transaction (18 claims, 13 distributes); each redemption transaction has +/// the scenario's message version; and `payTo` received every charge. +fn assert_batch_redeemed( + ctx: &Ctx<'_>, + s: &Scenario, + acc: &Accounts, + result: &ClientResult, + before: &Balances, +) -> Result<(), String> { + if result.status != 200 || !result.ok || result.body["paid"] != true { + return Err(format!( + "expected every payment and the redemption to succeed, got {} (ok={}): {}", + result.status, result.ok, result.body + )); + } + let signatures = |pointer: &str| -> Result, String> { + result + .body + .pointer(pointer) + .and_then(Value::as_array) + .ok_or_else(|| format!("the client reported no {pointer}"))? + .iter() + .map(|v| { + v.as_str() + .map(str::to_string) + .ok_or(format!("{pointer}: {v}")) + }) + .collect() + }; + let channels = usize::from( + s.batch_channels + .ok_or("x402-batch scenario without channels")?, + ); + let deposits = signatures("/deposits")?; + if deposits.len() != channels { + return Err(format!( + "{} deposits for {channels} channels", + deposits.len() + )); + } + for signature in &deposits { + settle::decode(&ctx.chain.transaction(signature, SETTLEMENT_DEADLINE)?)?; + } + for (pointer, capacity) in [ + ("/redemption/claims", BATCH_V1_CLAIM_CAPACITY), + ("/redemption/distributes", BATCH_V1_SETTLE_CAPACITY), + ] { + let redeemed = signatures(pointer)?; + let want = if s.settled_version == Some(1) && channels <= capacity { + 1 + } else { + redeemed.len().max(1) + }; + if redeemed.len() != want { + return Err(format!( + "{pointer}: {} transactions for {channels} channels, expected {want}", + redeemed.len() + )); + } + for signature in &redeemed { + let message = settle::decode(&ctx.chain.transaction(signature, SETTLEMENT_DEADLINE)?)?; + if let Some(version) = s.settled_version { + if message.version() != version.to_string() { + return Err(format!( + "{pointer}: {signature} is version {}, expected version {version}", + message.version() + )); + } + } + } + } + paid_once(s, before, &balances(ctx, s, acc)?) +} + +/// Channels one version-1 claim / distribute carries (scheme_batch_settlement_svm.md). +const BATCH_V1_CLAIM_CAPACITY: usize = 18; +const BATCH_V1_SETTLE_CAPACITY: usize = 13; + fn fault_context(case: &Case, acc: &Accounts) -> FaultContext { FaultContext { intent: case.scenario.intent, @@ -476,6 +587,9 @@ fn judge( .map_err(|e| format!("client adapter failed: {}", e.message)) }; match (s.kind, s.expect) { + (Kind::Standard, Expect::Paid { .. }) if s.intent == Intent::X402Batch => { + assert_batch_redeemed(ctx, s, acc, need_client()?, before) + } (Kind::Standard, Expect::Paid { onchain }) => { assert_paid(ctx, s, acc, need_client()?, before, onchain) } diff --git a/rust/crates/conformance/src/interop/scenarios.rs b/rust/crates/conformance/src/interop/scenarios.rs index 0b0d80e07..42465e348 100644 --- a/rust/crates/conformance/src/interop/scenarios.rs +++ b/rust/crates/conformance/src/interop/scenarios.rs @@ -266,6 +266,17 @@ pub struct Scenario { pub servers: Participants, pub pre_create_platform_ata: bool, pub compute_unit_limit: Option, + /// Message version the settled transaction must have, when the scenario + /// pins one (`None`: any accepted version). + pub settled_version: Option, + /// `x402-upto`: message version the client's channel `open` must have. + /// The judge finds the open as the oldest transaction on the settled + /// channel. + pub open_version: Option, + /// `x402-batch`: channels the client opens before the server redeems + /// them all at once. Each is paid by its deposit, and the first one by a + /// second voucher. + pub batch_channels: Option, } impl Scenario { @@ -281,6 +292,11 @@ impl Scenario { if let Some(actual) = self.actual_amount { return actual.parse().expect("actual amount"); } + if let Some(channels) = self.batch_channels { + // One request per deposit plus a second voucher on the first channel. + let per_request: u64 = self.amount.parse().expect("amount"); + return per_request * (u64::from(channels) + 1); + } let total: u64 = self.amount.parse().expect("amount"); total - self @@ -291,7 +307,7 @@ impl Scenario { } pub fn needs_payment_channels(&self) -> bool { - self.intent == Intent::X402Upto + matches!(self.intent, Intent::X402Upto | Intent::X402Batch) } } @@ -303,6 +319,7 @@ const EXACT_DOC: &str = "x402/specs/schemes/exact/scheme_exact.md"; const EXACT_SVM_DOC: &str = "x402/specs/schemes/exact/scheme_exact_svm.md"; const UPTO_DOC: &str = "x402/specs/schemes/upto/scheme_upto.md"; const UPTO_SVM_DOC: &str = "x402/specs/schemes/upto/scheme_upto_svm.md"; +const BATCH_SVM_DOC: &str = "x402/specs/schemes/batch-settlement/scheme_batch_settlement_svm.md"; const fn spec(doc: &'static str, section: &'static str, quote: &'static str) -> Spec { Spec { @@ -358,8 +375,31 @@ const BASE: Scenario = Scenario { servers: Participants::All, pre_create_platform_ata: false, compute_unit_limit: None, + settled_version: None, + open_version: None, + batch_channels: None, }; +const ONLY_RUST_BATCH: Participants = Participants::Only( + &["rust"], + "x402 batch-settlement is implemented only by the Rust SDK in pay-kit", +); + +const ONLY_RUST_V1_UPTO_CLIENT: Participants = Participants::Only( + &["rust"], + "only the Rust upto client builds a version-1 channel open; the Go, Python, Swift and Kotlin upto clients build version 0 only", +); + +const X402_V1_UPTO_SERVERS: Participants = Participants::Only( + &["rust", "typescript"], + "only the Rust and TypeScript upto servers advertise transactionVersions [0, 1] and accept a version-1 open; the Go and Python upto servers accept version 0 only", +); + +const X402_V1_SDKS: Participants = Participants::Only( + &["rust", "typescript"], + "only the Rust and TypeScript x402 adapters build version-1 transactions and advertise transactionVersions [0, 1]; the other SDKs build version 0 only (harness/expectations FINDINGS txv1-*)", +); + const ONLY_TS_CLIENT_COMPUTE: Participants = Participants::Only( &["typescript"], "only the TypeScript client adapter can inject a compute budget (MPP_HARNESS_COMPUTE_UNIT_LIMIT)", @@ -621,6 +661,17 @@ pub const SCENARIOS: &[Scenario] = &[ network: SOLANA_DEVNET, ..BASE }, + Scenario { + id: "x402-exact-v1", + intent: Intent::X402Exact, + description: "The sponsor advertises extra.transactionVersions [0, 1] and the client builds version 1 (SIMD-0385): the payment settles on chain as a version-1 transaction carrying its compute budget in the message config.", + spec: spec(EXACT_SVM_DOC, "1.5 Transaction Versions (MUST)", "The client MUST intersect the advertised versions (`[0]` when the field is absent) with the versions it and its signer support, then build the highest version in that intersection."), + network: SOLANA_DEVNET, + settled_version: Some(1), + clients: X402_V1_SDKS, + servers: X402_V1_SDKS, + ..BASE + }, Scenario { id: "x402-exact-network-mismatch", intent: Intent::X402Exact, @@ -703,6 +754,19 @@ pub const SCENARIOS: &[Scenario] = &[ expect: Expect::NoCredential, ..BASE }, + // ── x402 batch-settlement ── + Scenario { + id: "x402-batch-v1-redeem", + intent: Intent::X402Batch, + description: "The client opens five channels (each paid by its deposit) and pays a second voucher on the first; the server then redeems them all. More than four channels claimed in one transaction proves the version-1 capacity: one version-1 claim and one version-1 distribute, and payTo receives all six charges.", + spec: spec(BATCH_SVM_DOC, "Facilitator-built transactions and batching capacity", "The facilitator MAY build any message version the network supports."), + network: SOLANA_DEVNET, + settled_version: Some(1), + batch_channels: Some(5), + clients: ONLY_RUST_BATCH, + servers: ONLY_RUST_BATCH, + ..BASE + }, // ── x402 upto (harness/src/intents/x402-upto.ts) ── Scenario { id: "x402-upto-basic", @@ -717,6 +781,23 @@ pub const SCENARIOS: &[Scenario] = &[ settlement_header: "x-payment-settlement-signature", ..BASE }, + Scenario { + id: "x402-upto-v1", + intent: Intent::X402Upto, + description: "The server advertises transactionVersions [0, 1]: the client opens the channel with a version-1 transaction, the server's facilitator runs its open + settle + distribute readiness simulation and broadcasts the open, then settles the metered 50000 with a version-1 settle_and_seal and distribute.", + spec: spec(UPTO_SVM_DOC, "PaymentPayload", "Its message version MUST be one advertised in `extra.transactionVersions`"), + network: SOLANA_DEVNET, + price: "0.10", + amount: "100000", + actual_amount: Some("50000"), + resource_path: "/usage", + settlement_header: "x-payment-settlement-signature", + settled_version: Some(1), + open_version: Some(1), + clients: ONLY_RUST_V1_UPTO_CLIENT, + servers: X402_V1_UPTO_SERVERS, + ..BASE + }, Scenario { id: "x402-upto-zero-actual", intent: Intent::X402Upto, diff --git a/rust/crates/conformance/src/interop/settle.rs b/rust/crates/conformance/src/interop/settle.rs index d4ccc724b..ab44d1ca4 100644 --- a/rust/crates/conformance/src/interop/settle.rs +++ b/rust/crates/conformance/src/interop/settle.rs @@ -24,6 +24,23 @@ pub struct Message { } impl Message { + /// The message version: `"legacy"`, `"0"` or `"1"`. + pub fn version(&self) -> &'static str { + match self.msg { + VersionedMessage::Legacy(_) => "legacy", + VersionedMessage::V0(_) => "0", + VersionedMessage::V1(_) => "1", + } + } + + /// The channel an `x402-upto` settlement closes: account 1 (`channel`) of + /// its `settle_and_seal`, which follows the Ed25519 verify when the + /// metered amount is non-zero. + pub fn upto_channel(&self, actual: u64) -> Option<&str> { + let settle = self.instructions().get(usize::from(actual != 0))?; + settle.accounts.get(1).map(|index| self.account(*index)) + } + fn account(&self, index: u8) -> &str { self.keys .get(index as usize) @@ -279,17 +296,22 @@ fn upto_shape(c: &mut Checker<'_>, scenario: &Scenario, acc: &Accounts) { let m = c.m; let actual = scenario.primary_delta(); let ixs = m.instructions(); - let expected_len = if actual == 0 { 4 } else { 5 }; - if ixs.len() != expected_len { + let verify_len = usize::from(actual != 0); + // The payee and treasury ATA creates are optional: the spec has the + // facilitator confirm those accounts are usable before `open` (readiness + // step 8), so a facilitator may rely on them existing (the TypeScript + // one does) or create them idempotently (the Rust one does). + let with_creates = ixs.len() == verify_len + 4; + if !with_creates && ixs.len() != verify_len + 2 { c.problems.push(format!( - "x402-upto settlement has {} instructions, expected {expected_len}", - ixs.len() + "x402-upto settlement has {} instructions, expected {} or {}", + ixs.len(), + verify_len + 2, + verify_len + 4 )); return; } - let (settle, create_payee, create_treasury, distribute) = if actual == 0 { - (&ixs[0], &ixs[1], &ixs[2], &ixs[3]) - } else { + if actual != 0 { let verify = &ixs[0]; c.check(m.program(verify) == ED25519_PROGRAM, || { "first instruction is not an Ed25519 verify".into() @@ -312,7 +334,12 @@ fn upto_shape(c: &mut Checker<'_>, scenario: &Scenario, acc: &Accounts) { c.check(u64_le(&verify.data, 112 + 2 + 32) == Some(actual), || { format!("voucher cumulative amount != {actual}") }); - (&ixs[1], &ixs[2], &ixs[3], &ixs[4]) + } + let rest = &ixs[verify_len..]; + let (settle, creates, distribute) = if with_creates { + (&rest[0], Some((&rest[1], &rest[2])), &rest[3]) + } else { + (&rest[0], None, &rest[1]) }; c.check(m.program(settle) == PAYMENT_CHANNELS_PROGRAM, || { "settle_and_seal is not a payment-channels instruction".into() @@ -333,15 +360,18 @@ fn upto_shape(c: &mut Checker<'_>, scenario: &Scenario, acc: &Accounts) { let pay_to = acc.upto_pay_to.pubkey.as_str(); let recipient_ata = ata(pay_to, mint, program); let treasury_ata = ata(PAYMENT_CHANNEL_TREASURY_OWNER, mint, program); - for (ix, owner, ata_addr, what) in [ - (create_payee, pay_to, recipient_ata.as_str(), "payee"), - ( - create_treasury, - PAYMENT_CHANNEL_TREASURY_OWNER, - treasury_ata.as_str(), - "treasury", - ), - ] { + let creates = creates.map(|(create_payee, create_treasury)| { + [ + (create_payee, pay_to, recipient_ata.as_str(), "payee"), + ( + create_treasury, + PAYMENT_CHANNEL_TREASURY_OWNER, + treasury_ata.as_str(), + "treasury", + ), + ] + }); + for (ix, owner, ata_addr, what) in creates.into_iter().flatten() { let ok = m.program(ix) == ATA_PROGRAM && ix.data.first() == Some(&1) && c.ata_accounts_match(ix, ata_addr, owner, mint, program); diff --git a/rust/crates/conformance/src/main.rs b/rust/crates/conformance/src/main.rs index 1d1b5dd8b..684b28877 100644 --- a/rust/crates/conformance/src/main.rs +++ b/rust/crates/conformance/src/main.rs @@ -440,6 +440,22 @@ fn case_show(root: &Path, id: &str) -> ExitCode { .unwrap_or_default(), vector.file ); + if let Some(alternatives) = vector.expect()["alsoConformant"].as_array() { + let verdicts: Vec = alternatives + .iter() + .map(|alt| match alt["rejectCode"].as_str() { + Some(code) => format!("reject {code}"), + None => alt["outcome"].as_str().unwrap_or_default().to_string(), + }) + .collect(); + println!( + "also conformant: {} ({})\n", + verdicts.join(", "), + vector.expect()["alsoConformantReason"] + .as_str() + .unwrap_or_default() + ); + } if let Some(d) = vector.raw["description"].as_str() { println!("{d}\n"); } diff --git a/rust/crates/conformance/src/mutate.rs b/rust/crates/conformance/src/mutate.rs index dbcc8dfdf..b2e7574ac 100644 --- a/rust/crates/conformance/src/mutate.rs +++ b/rust/crates/conformance/src/mutate.rs @@ -165,6 +165,14 @@ pub enum Mutation { /// Version 1: remove the header `loadedAccountsDataSizeLimit` (budgeted /// zero bytes). V1DropLoadedAccountsDataSizeLimit, + /// Version 1: set the header `loadedAccountsDataSizeLimit`. Whether a + /// value below the runtime maximum is a reject depends on the suite's + /// rule, so `expected` is `None`: cases using it are authored. + V1LoadedAccountsDataSizeLimit { bytes: u32 }, + /// Version 1: set the header `heapSize` (a RequestHeapFrame in the + /// header). Sponsors refuse it as they refuse RequestHeapFrame on + /// version 0. + V1HeapSize { bytes: u32 }, /// Replace the n-th Memo instruction's text with `len` hex characters, /// to move the serialized size across a version's limit. Whether that is /// a reject depends on the format, so `expected` is `None`. @@ -235,6 +243,7 @@ impl Mutation { V1DropComputeUnitLimit | V1DropLoadedAccountsDataSizeLimit, Suite::Charge | Suite::X402Exact | Suite::Session, ) => Some(InvalidPayload), + (V1HeapSize { .. }, Suite::X402Exact) => Some(InvalidPayload), (AddLookupTable, Suite::Charge | Suite::X402Exact | Suite::Session) => { Some(InvalidPayload) } @@ -363,6 +372,12 @@ impl Mutation { Mutation::V1DropLoadedAccountsDataSizeLimit => { "version-1 header loadedAccountsDataSizeLimit removed".into() } + Mutation::V1LoadedAccountsDataSizeLimit { bytes } => { + format!("version-1 header loadedAccountsDataSizeLimit set to {bytes}") + } + Mutation::V1HeapSize { bytes } => { + format!("version-1 header heapSize set to {bytes}") + } Mutation::PadMemo { memo, len } => { format!("memo #{memo} replaced with {len} hex characters") } @@ -426,7 +441,9 @@ impl Mutation { | Mutation::V1PriorityFee { .. } | Mutation::V1Budget { .. } | Mutation::V1DropComputeUnitLimit - | Mutation::V1DropLoadedAccountsDataSizeLimit => { + | Mutation::V1DropLoadedAccountsDataSizeLimit + | Mutation::V1LoadedAccountsDataSizeLimit { .. } + | Mutation::V1HeapSize { .. } => { let mut config = v1_config(&tx.message) .ok_or_else(|| format!("{self:?} needs a version-1 message"))?; match self { @@ -439,6 +456,10 @@ impl Mutation { config.priority_fee = Some(*lamports); } Mutation::V1DropComputeUnitLimit => config.compute_unit_limit = None, + Mutation::V1LoadedAccountsDataSizeLimit { bytes } => { + config.loaded_accounts_data_size_limit = Some(*bytes) + } + Mutation::V1HeapSize { bytes } => config.heap_size = Some(*bytes), _ => config.loaded_accounts_data_size_limit = None, } let mut out = compile_as(MessageFormat::V1, &decompile(&tx.message)?, config)?; @@ -764,7 +785,9 @@ impl Mutation { | Mutation::V1PriorityFee { .. } | Mutation::V1Budget { .. } | Mutation::V1DropComputeUnitLimit - | Mutation::V1DropLoadedAccountsDataSizeLimit => { + | Mutation::V1DropLoadedAccountsDataSizeLimit + | Mutation::V1LoadedAccountsDataSizeLimit { .. } + | Mutation::V1HeapSize { .. } => { unreachable!("handled above") } } diff --git a/rust/crates/conformance/src/realize.rs b/rust/crates/conformance/src/realize.rs index d00e7ad8d..d2be85cb6 100644 --- a/rust/crates/conformance/src/realize.rs +++ b/rust/crates/conformance/src/realize.rs @@ -994,8 +994,27 @@ pub(crate) fn canonical_bytes(input: &Value) -> Result { // ── expectation ──────────────────────────────────────────────────────────── -/// Build the `expect` block, enforcing the case's contract with the kit. +/// Build the `expect` block, enforcing the case's contract with the kit, and +/// append the verdicts the specs also allow (`alsoConformant`). pub fn expectation(case: &Case, input: &Value, observed: &Observed) -> Result { + let mut expect = primary_expectation(case, input, observed)?; + if let Some(also) = &case.also_conformant { + expect["alsoConformant"] = also + .verdicts + .iter() + .map(|alt| match alt { + crate::case::Alternative::Accept => json!({ "outcome": "accept" }), + crate::case::Alternative::Reject(code) => { + json!({ "outcome": "reject", "rejectCode": code.as_str() }) + } + }) + .collect(); + expect["alsoConformantReason"] = json!(also.reason); + } + Ok(expect) +} + +fn primary_expectation(case: &Case, input: &Value, observed: &Observed) -> Result { match &case.provenance { Provenance::Generated => match (&case.expect, observed) { (Expect::Accept(pin), Observed::Accept(output)) => { diff --git a/rust/crates/conformance/src/realize/batch.rs b/rust/crates/conformance/src/realize/batch.rs index 271f6c785..fbe34543b 100644 --- a/rust/crates/conformance/src/realize/batch.rs +++ b/rust/crates/conformance/src/realize/batch.rs @@ -12,6 +12,12 @@ //! whose channel store holds `batchServerChannel`, verifies and reserves //! `x402PaymentHeader` against the chain state of `rpcFixtures`. A //! `batchCorrective` input is the client-side check of a corrective 402. +//! `batchVerdictFromStore: true` marks a vector whose verdict rests on the +//! store record alone (the charged or accepted cumulative, a close-pending +//! mark): a stateless facilitator never sees it (RULINGS B1), so a testee +//! whose only verify entry point is one reports `unsupported-mode`. +//! `batchServer.transactionVersions` is the facilitator's own accepted +//! set; a vector whose verdict depends on it states it. //! - **build-transaction**: the client builds the payload `batchClient` //! names against `batchClient.requirements`; the judge checks the build //! against the spec's structural rules and the Rust server's verifier. @@ -639,7 +645,30 @@ pub async fn judge_build(vector: &Vector, artifact: &str) -> Result<(), Failure> )); } } - if c.get("openSlot") + // Phase 1: "The client MAY use `extra.recentBlockhash` and + // `extra.recentSlot` ... If either hint is stale, the client MUST fetch a + // fresh value". The Rust kit takes the slot from its caller + // (`batchClient.openSlot`); an SDK that fetches the cluster slot or uses + // the hint is as conformant. Any slot the program's open-slot window + // accepts against the fixture cluster's slot is judged correct. + let cluster_slot = input["rpcFixtures"]["slot"] + .as_u64() + .filter(|_| operation == "deposit"); + if let Some(cluster) = cluster_slot { + let open = config.open_slot; + if open > cluster || cluster - open > pc::OPEN_SLOT_WINDOW { + return Err(fail_at( + "payload.channelConfig.openSlot", + Some(&json!(format!( + "a slot in [{}, {cluster}]", + cluster.saturating_sub(pc::OPEN_SLOT_WINDOW) + ))), + Some(&json!(open)), + "the channel must open at a slot inside the program's open-slot window of the cluster slot", + )); + } + } else if c + .get("openSlot") .and_then(Value::as_u64) .is_some_and(|slot| slot != config.open_slot) { diff --git a/rust/crates/conformance/src/realize/upto.rs b/rust/crates/conformance/src/realize/upto.rs index 3c3f21109..86324e84c 100644 --- a/rust/crates/conformance/src/realize/upto.rs +++ b/rust/crates/conformance/src/realize/upto.rs @@ -163,7 +163,9 @@ impl Route { if let Some(memo) = self.memo() { extra["memo"] = json!(memo); } - if let Some(versions) = &self.versions { + // What the server advertises: nothing for `[0]` (the kit's + // `advertised` rule), as for x402 exact. + if let Some(versions) = self.versions.as_ref().filter(|v| v.as_slice() != [0]) { extra["transactionVersions"] = json!(versions); } json!({ diff --git a/rust/crates/conformance/src/run/judge.rs b/rust/crates/conformance/src/run/judge.rs index ea0442206..eb801611d 100644 --- a/rust/crates/conformance/src/run/judge.rs +++ b/rust/crates/conformance/src/run/judge.rs @@ -91,8 +91,47 @@ fn expect_same( } } -/// `judgeVector`: the vector's `expect` block against the result. +/// `judgeVector`: the vector's `expect` block against the result. A result +/// that misses the primary verdict passes when it matches one of the +/// verdicts the specs also allow (`expect.alsoConformant`: an outcome and, +/// for a reject, its code). An accepted build is still judged on its +/// artifact by the driver. pub fn judge_expect(vector: &Vector, result: &Value) -> Result { + let primary = judge_primary(vector, result); + let Err(mut failure) = primary else { + return primary; + }; + let Some(alternatives) = vector.expect()["alsoConformant"].as_array() else { + return Err(failure); + }; + let outcome = result["outcome"].as_str().unwrap_or_default(); + let code = result.get("rejectCode").and_then(Value::as_str); + let matched = alternatives.iter().any(|alt| { + alt["outcome"].as_str() == Some(outcome) + && (outcome != "reject" || alt["rejectCode"].as_str() == code) + }); + if matched && result.get("id").and_then(Value::as_str) == Some(vector.id.as_str()) { + return Ok(Verdict::Pass); + } + failure.message = format!( + "{}\n(also conformant: {}; {})", + failure.message, + alternatives + .iter() + .map(|alt| match alt["rejectCode"].as_str() { + Some(code) => format!("reject {code}"), + None => alt["outcome"].as_str().unwrap_or_default().to_string(), + }) + .collect::>() + .join(", "), + vector.expect()["alsoConformantReason"] + .as_str() + .unwrap_or_default() + ); + Err(failure) +} + +fn judge_primary(vector: &Vector, result: &Value) -> Result { let actual_id = result.get("id"); if actual_id.and_then(Value::as_str) != Some(vector.id.as_str()) { return Err(Failure::at( @@ -906,6 +945,32 @@ mod tests { ); } + #[test] + fn also_conformant_verdicts_pass_and_others_do_not() { + // Primary reject channel-state; payload-type is also conformant. + let v = vector("batch-verify-voucher-server-mode-config-reject"); + let primary = json!({"id": v.id, "outcome": "reject", "rejectCode": "channel-state"}); + assert_eq!(judge_expect(&v, &primary).unwrap(), Verdict::Pass); + let alternative = json!({"id": v.id, "outcome": "reject", "rejectCode": "payload-type"}); + assert_eq!(judge_expect(&v, &alternative).unwrap(), Verdict::Pass); + let other = json!({"id": v.id, "outcome": "reject", "rejectCode": "invalid-payload"}); + let failure = judge_expect(&v, &other).unwrap_err(); + assert!(failure + .message + .contains("also conformant: reject payload-type")); + let accepted = json!({"id": v.id, "outcome": "accept"}); + assert!(judge_expect(&v, &accepted).is_err()); + // Primary reject; accept is also conformant (sponsor fee policy). + let v = vector("x402-exact-verify-priority-fee-over-cap-reject"); + let accepted = json!({"id": v.id, "outcome": "accept"}); + assert_eq!(judge_expect(&v, &accepted).unwrap(), Verdict::Pass); + let wrong = json!({"id": v.id, "outcome": "reject", "rejectCode": "invalid-payload"}); + assert!(judge_expect(&v, &wrong).is_err()); + // An alternative never excuses a result for another vector. + let foreign = json!({"id": "another-vector", "outcome": "accept"}); + assert!(judge_expect(&v, &foreign).is_err()); + } + #[test] fn reject_code_is_pinned() { let v = vector("charge-verify-wrong-amount-reject"); diff --git a/rust/crates/conformance/src/run/vectors.rs b/rust/crates/conformance/src/run/vectors.rs index e853fb4ff..301c0df72 100644 --- a/rust/crates/conformance/src/run/vectors.rs +++ b/rust/crates/conformance/src/run/vectors.rs @@ -236,12 +236,31 @@ pub fn validate(vector: &Value) -> Result<(), String> { { return Err("expect.outcome must be accept or reject".into()); } + let known: Vec<&str> = RejectCode::ALL.iter().map(|c| c.as_str()).collect(); if let Some(code) = expect.get("rejectCode") { - let known: Vec<&str> = RejectCode::ALL.iter().map(|c| c.as_str()).collect(); if !one_of(code, &known) { return Err("expect.rejectCode is not in the shared vocabulary".into()); } } + if let Some(alternatives) = expect.get("alsoConformant") { + let valid = alternatives.as_array().is_some_and(|alts| { + !alts.is_empty() + && alts.iter().all(|alt| match alt["outcome"].as_str() { + Some("accept") => alt.get("rejectCode").is_none(), + Some("reject") => alt.get("rejectCode").is_some_and(|c| one_of(c, &known)), + _ => false, + }) + }); + if !valid + || !expect + .get("alsoConformantReason") + .is_some_and(Value::is_string) + { + return Err( + "expect.alsoConformant must be a non-empty array of {outcome: accept} / {outcome: reject, rejectCode} with an alsoConformantReason".into(), + ); + } + } Ok(()) } diff --git a/rust/crates/harness-bins/Cargo.toml b/rust/crates/harness-bins/Cargo.toml index ea8bf8d59..a78501f0e 100644 --- a/rust/crates/harness-bins/Cargo.toml +++ b/rust/crates/harness-bins/Cargo.toml @@ -39,3 +39,11 @@ path = "src/bin/x402_harness_upto_client.rs" [[bin]] name = "x402_harness_upto_server" path = "src/bin/x402_harness_upto_server.rs" + +[[bin]] +name = "x402_harness_batch_client" +path = "src/bin/x402_harness_batch_client.rs" + +[[bin]] +name = "x402_harness_batch_server" +path = "src/bin/x402_harness_batch_server.rs" diff --git a/rust/crates/harness-bins/src/bin/x402_harness_batch_client.rs b/rust/crates/harness-bins/src/bin/x402_harness_batch_client.rs new file mode 100644 index 000000000..4b760e53a --- /dev/null +++ b/rust/crates/harness-bins/src/bin/x402_harness_batch_client.rs @@ -0,0 +1,181 @@ +//! Interop client for x402 `batch-settlement`. +//! +//! Opens `X402_HARNESS_BATCH_CHANNELS` channels against the server (each paid +//! by its `deposit`, which carries the first voucher), pays a second request on +//! the first channel with a plain voucher, then asks the server to redeem +//! every channel (`POST /redeem`) and reports the deposit and redemption +//! signatures for the runner to check on chain. + +use std::{collections::HashMap, env}; + +use serde_json::json; +use solana_pay_kit::solana_keychain::memory::MemorySigner; +use solana_pay_kit::x402::{ + client::batch_settlement::{ + build_deposit, encode_payment_header, parse_challenge, resolve_terms, BatchChannel, + }, + protocol::schemes::batch_settlement::{ + BatchPayload, BatchRequirements, BatchSettlementResponse, BatchVoucher, + }, + PAYMENT_RESPONSE_HEADER, PAYMENT_SIGNATURE_HEADER, +}; +use solana_rpc_client::rpc_client::RpcClient; + +type BoxError = Box; + +const DEFAULT_CHANNELS: u8 = 1; +/// Requests each deposit escrows, so a channel never needs a top-up here. +const DEPOSIT_REQUESTS: u64 = 10; + +#[tokio::main] +async fn main() -> Result<(), BoxError> { + let target_url = read_required_env("X402_HARNESS_TARGET_URL")?; + let rpc_url = read_required_env("X402_HARNESS_RPC_URL")?; + let signer = read_memory_signer("X402_HARNESS_CLIENT_SECRET_KEY")?; + let channels: u8 = env::var("X402_HARNESS_BATCH_CHANNELS") + .ok() + .map(|v| v.parse()) + .transpose()? + .unwrap_or(DEFAULT_CHANNELS); + + let http = reqwest::Client::new(); + let rpc = RpcClient::new(rpc_url); + + let challenge = http.get(&target_url).send().await?; + let headers = response_headers(challenge.headers())?; + let body = challenge.text().await?; + let (requirements, _) = parse_challenge(&headers, Some(&body)) + .ok_or("server did not return a supported batch-settlement challenge")?; + let terms = resolve_terms(&rpc, &requirements, None)?; + + let mut deposits = Vec::new(); + let mut first: Option<(BatchChannel, BatchVoucher)> = None; + let mut last_status = 0u16; + for _ in 0..channels { + let blockhash = rpc.get_latest_blockhash()?; + let open_slot = rpc.get_slot()?; + let (channel, payload) = build_deposit( + &signer, + &requirements, + &terms, + terms.amount * DEPOSIT_REQUESTS, + blockhash, + open_slot, + ) + .await?; + let voucher = submitted_voucher(&payload)?; + let (status, response) = pay(&http, &target_url, &requirements, payload).await?; + last_status = status; + let response = response.ok_or_else(|| format!("deposit answered {status}"))?; + deposits.push(response.transaction.clone()); + if first.is_none() { + let mut channel = channel; + channel.apply_payment_response(&response, &requirements, &voucher)?; + first = Some((channel, voucher)); + } + } + + // A second, offchain voucher on the first channel. + if let Some((channel, _)) = &first { + let payload = channel.voucher_payload(&signer, terms.amount).await?; + let (status, response) = pay(&http, &target_url, &requirements, payload).await?; + last_status = status; + response.ok_or_else(|| format!("voucher answered {status}"))?; + } + + let redeem_url = redeem_url(&target_url)?; + let redeemed = http.post(&redeem_url).send().await?; + let redeem_status = redeemed.status(); + let redemption: serde_json::Value = redeemed.json().await?; + let ok = last_status == 200 && redeem_status.is_success(); + + println!( + "{}", + serde_json::to_string(&json!({ + "type": "result", + "implementation": "rust", + "role": "client", + "ok": ok, + "status": if ok { 200 } else { redeem_status.as_u16() }, + "responseHeaders": HashMap::::new(), + "responseBody": { + "ok": ok, + "paid": ok, + "deposits": deposits, + "redemption": redemption, + }, + "settlement": deposits.first(), + }))? + ); + Ok(()) +} + +/// Send one paid request; returns the status and the decoded `PAYMENT-RESPONSE`. +async fn pay( + http: &reqwest::Client, + url: &str, + requirements: &BatchRequirements, + payload: BatchPayload, +) -> Result<(u16, Option), BoxError> { + let header = encode_payment_header(requirements, payload)?; + let response = http + .get(url) + .header(PAYMENT_SIGNATURE_HEADER, header) + .send() + .await?; + let status = response.status().as_u16(); + let settlement = response + .headers() + .get(PAYMENT_RESPONSE_HEADER) + .and_then(|value| value.to_str().ok()) + .map(decode_settlement) + .transpose()?; + Ok((status, settlement.filter(|s| s.success))) +} + +fn decode_settlement(value: &str) -> Result { + let bytes = base64::Engine::decode(&base64::engine::general_purpose::STANDARD, value)?; + Ok(serde_json::from_slice(&bytes)?) +} + +fn submitted_voucher(payload: &BatchPayload) -> Result { + match payload { + BatchPayload::Deposit { + voucher: Some(voucher), + .. + } => Ok(voucher.clone()), + _ => Err("a client-signed deposit carries its first voucher".into()), + } +} + +/// `POST /redeem` on the server behind `target_url` (the proxy forwards it). +fn redeem_url(target_url: &str) -> Result { + let after_scheme = target_url + .find("://") + .map(|i| i + 3) + .ok_or("target URL has no scheme")?; + let path_start = target_url[after_scheme..] + .find('/') + .map(|i| after_scheme + i) + .unwrap_or(target_url.len()); + Ok(format!("{}/redeem", &target_url[..path_start])) +} + +fn response_headers( + headers: &reqwest::header::HeaderMap, +) -> Result, BoxError> { + headers + .iter() + .map(|(name, value)| Ok((name.as_str().to_string(), value.to_str()?.to_string()))) + .collect() +} + +fn read_required_env(name: &str) -> Result { + env::var(name).map_err(|_| format!("{name} is required").into()) +} + +fn read_memory_signer(name: &str) -> Result { + let raw = read_required_env(name)?; + let bytes: Vec = serde_json::from_str(&raw)?; + Ok(MemorySigner::from_bytes(&bytes)?) +} diff --git a/rust/crates/harness-bins/src/bin/x402_harness_batch_server.rs b/rust/crates/harness-bins/src/bin/x402_harness_batch_server.rs new file mode 100644 index 000000000..301296083 --- /dev/null +++ b/rust/crates/harness-bins/src/bin/x402_harness_batch_server.rs @@ -0,0 +1,268 @@ +//! Interop server for x402 `batch-settlement`. +//! +//! Serves the paid resource through the scheme's verify / reserve / commit +//! steps (as the axum gate does), remembers every channel it served, and on +//! `POST /redeem` runs its out-of-band redemption over all of them: one +//! `claim` pass then one `settle` (distribute) pass. Redemption is built as +//! transaction v1, so the claim and distribute pack up to the version-1 +//! capacity. + +use std::{ + collections::{BTreeSet, HashMap}, + env, + io::{BufRead, BufReader, Write}, + net::{TcpListener, TcpStream}, + sync::{Arc, Mutex}, + thread, +}; + +use serde_json::json; +use solana_pay_kit::solana_keychain::{memory::MemorySigner, TransactionSigner}; +use solana_pay_kit::x402::{ + server::{BatchAccess, BatchConfig, X402BatchSettlement}, + PAYMENT_SIGNATURE_HEADER, +}; + +type BoxError = Box; + +const DEFAULT_RESOURCE_PATH: &str = "/protected"; +const HEALTH_PATH: &str = "/health"; +const REDEEM_PATH: &str = "/redeem"; +const TOKEN_DECIMALS: u8 = 6; + +struct BatchHarnessState { + batch: X402BatchSettlement, + price: String, + resource_path: String, + /// Channels this server served, in the order it first saw them. + channels: Mutex>, + runtime: tokio::runtime::Runtime, +} + +fn main() -> Result<(), BoxError> { + let state = Arc::new(read_state()?); + let listener = TcpListener::bind("127.0.0.1:0")?; + let port = listener.local_addr()?.port(); + + println!( + "{}", + serde_json::to_string(&json!({ + "type": "ready", + "implementation": "rust", + "role": "server", + "port": port, + "capabilities": ["batch-settlement"], + }))? + ); + + for stream in listener.incoming() { + match stream { + Ok(stream) => { + let state = Arc::clone(&state); + thread::spawn(move || { + if let Err(error) = handle_connection(stream, &state) { + eprintln!("harness rust batch server error: {error}"); + } + }); + } + Err(error) => eprintln!("harness rust batch server accept error: {error}"), + } + } + Ok(()) +} + +fn read_state() -> Result { + let rpc_url = read_required_env("X402_HARNESS_RPC_URL")?; + // Surfpool runs a payment-channels build whose treasury owner is patched + // to the mainnet constant, so the cluster label is `localnet`, not devnet + // (see the upto harness server). + let cluster = "localnet".to_string(); + let mint = env::var("X402_HARNESS_MINT") + .unwrap_or_else(|_| "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU".to_string()); + let pay_to = read_required_env("X402_HARNESS_PAY_TO")?; + let fee_payer: Arc = + Arc::new(read_memory_signer("X402_HARNESS_FACILITATOR_SECRET_KEY")?); + let price = + normalize_price(&env::var("X402_HARNESS_PRICE").unwrap_or_else(|_| "0.001".into()))?; + let resource_path = env::var("X402_HARNESS_RESOURCE_PATH") + .unwrap_or_else(|_| DEFAULT_RESOURCE_PATH.to_string()); + + let mut config = BatchConfig::new(pay_to, cluster, fee_payer); + config.currency = mint; + config.decimals = TOKEN_DECIMALS; + config.rpc_url = Some(rpc_url); + config.resource = resource_path.clone(); + config.description = Some("Surfpool-backed batch-settlement endpoint".to_string()); + config.program_id = env::var("PAYMENT_CHANNELS_PROGRAM_ID").ok(); + let batch = X402BatchSettlement::new(config)? + // Accept and advertise version 1, and build redemptions as version 1. + // Surfpool executes version 1 but does not expose the `enable_tx_v1` + // feature account, so `Auto` would read it as inactive. + .with_tx_v1(solana_pay_kit::core::tx::TxV1Mode::On); + + Ok(BatchHarnessState { + batch, + price, + resource_path, + channels: Mutex::new(BTreeSet::new()), + runtime: tokio::runtime::Runtime::new()?, + }) +} + +fn handle_connection(mut stream: TcpStream, state: &BatchHarnessState) -> Result<(), BoxError> { + let mut reader = BufReader::new(stream.try_clone()?); + let mut request_line = String::new(); + reader.read_line(&mut request_line)?; + if request_line.trim().is_empty() { + return Ok(()); + } + let mut headers = HashMap::new(); + loop { + let mut line = String::new(); + reader.read_line(&mut line)?; + let trimmed = line.trim_end_matches(['\r', '\n']); + if trimmed.is_empty() { + break; + } + if let Some((name, value)) = trimmed.split_once(':') { + headers.insert(name.to_ascii_lowercase(), value.trim().to_string()); + } + } + let mut parts = request_line.split_whitespace(); + let method = parts.next().unwrap_or_default(); + let path = parts.next().unwrap_or_default(); + + match (method, path) { + ("GET", HEALTH_PATH) => write_json(&mut stream, 200, &[], &json!({ "ok": true })), + ("POST", REDEEM_PATH) => match redeem(state) { + Ok(body) => write_json(&mut stream, 200, &[], &body), + Err(error) => write_json( + &mut stream, + 500, + &[], + &json!({ "error": "redeem_failed", "message": error.to_string() }), + ), + }, + ("GET", path) if path == state.resource_path => { + match headers.get(&PAYMENT_SIGNATURE_HEADER.to_ascii_lowercase()) { + Some(header) => match serve(state, header) { + Ok((name, value)) => write_json( + &mut stream, + 200, + &[(name.as_str(), value.as_str())], + &json!({ "ok": true, "paid": true }), + ), + Err(error) => challenge( + &mut stream, + state, + &json!({ "error": "payment_invalid", "message": error.to_string() }), + ), + }, + None => challenge(&mut stream, state, &json!({ "error": "payment_required" })), + } + } + _ => write_json(&mut stream, 404, &[], &json!({ "error": "not_found" })), + } +} + +/// Verify, reserve, serve and commit one paid request, returning the +/// `PAYMENT-RESPONSE` header. +fn serve(state: &BatchHarnessState, header: &str) -> Result<(String, String), BoxError> { + let access = state + .runtime + .block_on(state.batch.verify_and_reserve_payment(header, &state.price))?; + let settlement = match access { + BatchAccess::Serve(outcome) | BatchAccess::Resume(outcome) => { + let channel_id = outcome.channel_id.clone(); + state + .runtime + .block_on(state.batch.mark_handler_succeeded(&outcome))?; + let settlement = state + .runtime + .block_on(state.batch.finish_commit(&outcome))?; + state + .channels + .lock() + .map_err(|_| "channel set poisoned")? + .insert(channel_id); + settlement + } + BatchAccess::Replay(settlement, _) => settlement, + BatchAccess::InProgress => return Err("authorization in progress".into()), + BatchAccess::Control(_) => return Err("refunds are not part of this scenario".into()), + }; + Ok(state.batch.settlement_header(&settlement)?) +} + +/// Redeem every served channel: claim its latest voucher, then distribute. +fn redeem(state: &BatchHarnessState) -> Result { + let channels: Vec = state + .channels + .lock() + .map_err(|_| "channel set poisoned")? + .iter() + .cloned() + .collect(); + let claims = state.runtime.block_on(state.batch.claim(&channels))?; + let distributes = state.runtime.block_on(state.batch.settle(&channels))?; + Ok(json!({ + "channels": channels, + "claims": claims, + "distributes": distributes, + })) +} + +fn challenge( + stream: &mut TcpStream, + state: &BatchHarnessState, + body: &serde_json::Value, +) -> Result<(), BoxError> { + let (name, value) = state + .batch + .payment_required_header(&state.price, Some(&state.resource_path))?; + write_json(stream, 402, &[(name.as_str(), value.as_str())], body) +} + +fn write_json( + stream: &mut TcpStream, + status: u16, + headers: &[(&str, &str)], + body: &serde_json::Value, +) -> Result<(), BoxError> { + let body = serde_json::to_vec(body)?; + let reason = match status { + 200 => "OK", + 402 => "Payment Required", + 404 => "Not Found", + _ => "Internal Server Error", + }; + write!(stream, "HTTP/1.1 {status} {reason}\r\n")?; + write!(stream, "content-type: application/json\r\n")?; + write!(stream, "content-length: {}\r\n", body.len())?; + write!(stream, "connection: close\r\n")?; + for (name, value) in headers { + write!(stream, "{name}: {value}\r\n")?; + } + write!(stream, "\r\n")?; + stream.write_all(&body)?; + stream.flush()?; + Ok(()) +} + +fn read_required_env(name: &str) -> Result { + env::var(name).map_err(|_| format!("{name} is required").into()) +} + +fn read_memory_signer(name: &str) -> Result { + let raw = read_required_env(name)?; + let bytes: Vec = serde_json::from_str(&raw)?; + Ok(MemorySigner::from_bytes(&bytes)?) +} + +fn normalize_price(price: &str) -> Result { + let amount = price.trim().strip_prefix('$').unwrap_or(price.trim()); + if amount.is_empty() || !amount.chars().all(|c| c.is_ascii_digit() || c == '.') { + return Err(format!("invalid price: {price}").into()); + } + Ok(amount.to_string()) +} diff --git a/rust/crates/harness-bins/src/bin/x402_harness_server.rs b/rust/crates/harness-bins/src/bin/x402_harness_server.rs index 1cd7f1755..78fe3ebfa 100644 --- a/rust/crates/harness-bins/src/bin/x402_harness_server.rs +++ b/rust/crates/harness-bins/src/bin/x402_harness_server.rs @@ -146,7 +146,11 @@ fn read_state() -> Result max_age: Some(60), fee_payer_key: Some(fee_payer.pubkey().to_string()), payment_identifier: PaymentIdentifierPolicy::NotAdvertised, - })?, + })? + // Accept and advertise version 1, as the reference facilitators do. + // Surfpool executes version 1 but does not expose the `enable_tx_v1` + // feature account, so `Auto` would read it as inactive. + .with_tx_v1(solana_pay_kit::core::tx::TxV1Mode::On), fee_payer, routes, settlement_header: env::var("X402_HARNESS_SETTLEMENT_HEADER") diff --git a/rust/crates/harness-bins/src/bin/x402_harness_upto_server.rs b/rust/crates/harness-bins/src/bin/x402_harness_upto_server.rs index 37bed5da6..1ab841f05 100644 --- a/rust/crates/harness-bins/src/bin/x402_harness_upto_server.rs +++ b/rust/crates/harness-bins/src/bin/x402_harness_upto_server.rs @@ -123,7 +123,11 @@ fn read_state( withdraw_delay: 900, fee_payer_signer, receiver_authorizer_signer: Some(receiver_authorizer_signer), - })?; + })? + // Accept and advertise version 1, as the reference facilitators do. + // Surfpool executes version 1 but does not expose the `enable_tx_v1` + // feature account, so `Auto` would read it as inactive. + .with_tx_v1(solana_pay_kit::core::tx::TxV1Mode::On); Ok(UptoHarnessState { upto, diff --git a/rust/crates/kit/src/core/payment_channel/v1.rs b/rust/crates/kit/src/core/payment_channel/v1.rs index 3594fb60f..525c982a3 100644 --- a/rust/crates/kit/src/core/payment_channel/v1.rs +++ b/rust/crates/kit/src/core/payment_channel/v1.rs @@ -919,12 +919,24 @@ pub async fn build_open_payment_channel_tx_with_options( data: memo.as_bytes().to_vec(), }); } + // A version-1 open must carry its budget in the header. Without one the + // builder budgets the runtime default (200,000 units per instruction), + // which an open with both memos would put over the 400,000 a sponsor + // accepts for an open, so the default is capped at that ceiling. + let budget = match (options.version, options.compute_budget) { + (TxVersion::V1, None) => { + let mut budget = ComputeBudget::runtime_default(instructions.len()); + budget.unit_limit = budget.unit_limit.min(OPEN_MAX_COMPUTE_UNIT_LIMIT); + Some(budget) + } + (_, budget) => budget, + }; let mut tx = crate::core::tx::build_unsigned( options.version, fee_payer, &instructions, recent_blockhash, - options.compute_budget.as_ref(), + budget.as_ref(), )?; crate::core::signing::sign_versioned_transaction_slot(signer, &mut tx) .await @@ -1547,6 +1559,30 @@ mod tests { .await } + /// A version-1 open built without an explicit budget stays within the + /// 400,000 units a sponsor accepts, even with both memos (three + /// instructions, whose runtime default would be 600,000). + #[tokio::test] + async fn a_default_version_1_open_budget_stays_within_the_open_cap() { + let open = build_open(&OpenTxOptions { + memo: Some("invoice-42".into()), + binding_memo: Some("binding".into()), + version: TxVersion::V1, + ..Default::default() + }) + .await + .expect("version-1 open"); + let tx = crate::core::tx::decode(&open.transaction).unwrap(); + let solana_message::VersionedMessage::V1(message) = &tx.message else { + panic!("version-1 message expected"); + }; + assert_eq!(message.instructions.len(), 3); + assert_eq!( + message.config.compute_unit_limit, + Some(OPEN_MAX_COMPUTE_UNIT_LIMIT) + ); + } + #[tokio::test] async fn open_tx_carries_the_memo_only_when_requested() { // The bare open is what every pay-kit server verifies; a declared diff --git a/rust/crates/kit/src/core/tx/mod.rs b/rust/crates/kit/src/core/tx/mod.rs index c645d0855..0371d24ff 100644 --- a/rust/crates/kit/src/core/tx/mod.rs +++ b/rust/crates/kit/src/core/tx/mod.rs @@ -28,9 +28,9 @@ pub use build::{ pub use policy::{ advertised, check_envelope, check_envelope_without_legacy, check_priority_fee, check_reported_version, check_reported_version_without_legacy, check_v0_budget_caps, - check_v1_budget_caps, check_v1_budget_caps_with, highest, negotiate, require_budget_prefix, - require_presigned, require_static_accounts, tx_v1_active, LoadedDataLimitRule, TxV1Mode, - MAX_SPONSORED_PRIORITY_FEE_LAMPORTS, TX_V1_FEATURE_GATE, + check_v1_budget_caps, check_v1_budget_caps_with, highest, negotiate, reject_v1_heap_request, + require_budget_prefix, require_presigned, require_static_accounts, tx_v1_active, + LoadedDataLimitRule, TxV1Mode, MAX_SPONSORED_PRIORITY_FEE_LAMPORTS, TX_V1_FEATURE_GATE, }; pub use version::{accepted_versions, TxLimits, TxVersion, DEFAULT_ACCEPTED_VERSIONS}; pub use wire::{decode, decode_bytes, encode, serialize, serialized_size}; diff --git a/rust/crates/kit/src/core/tx/policy.rs b/rust/crates/kit/src/core/tx/policy.rs index 20f6e1152..3dd782775 100644 --- a/rust/crates/kit/src/core/tx/policy.rs +++ b/rust/crates/kit/src/core/tx/policy.rs @@ -183,6 +183,21 @@ pub fn check_v1_budget_caps_with( Ok(Some(declared)) } +/// Reject a version-1 message that requests a heap size. A sponsor bounds +/// the compute a co-signed transaction may buy; version 0 refuses +/// `RequestHeapFrame` for the same reason (x402 scheme_*_svm.md §2.2.1: other +/// ComputeBudget instruction types "SHOULD be rejected"). Other versions pass. +pub fn reject_v1_heap_request(message: &VersionedMessage) -> Result<()> { + if let VersionedMessage::V1(v1) = message { + if v1.config.heap_size.is_some() { + return Err(Error::Other( + "version 1 transaction config must not request a heap size".into(), + )); + } + } + Ok(()) +} + /// Version-0 (and legacy) counterpart of [`check_v1_budget_caps`] for a /// message a server co-signs: every ComputeBudget instruction carries no /// accounts, no opcode is duplicated or unsupported (a loaded-data limit diff --git a/rust/crates/kit/src/core/tx/version.rs b/rust/crates/kit/src/core/tx/version.rs index ec4a02bb5..df63ff90d 100644 --- a/rust/crates/kit/src/core/tx/version.rs +++ b/rust/crates/kit/src/core/tx/version.rs @@ -100,9 +100,13 @@ impl TxVersion { /// /// A legacy (unprefixed) message is policed as version 0: it shares the /// 1232-byte packet limit, carries its compute budget as ComputeBudget - /// instructions, and cannot reference address lookup tables. Servers keep - /// accepting legacy messages from existing clients for backward - /// compatibility whenever they accept version 0; the kit never builds or + /// instructions, and cannot reference address lookup tables. Whether a + /// legacy message is accepted at all is the protocol's call: the x402 + /// sponsors keep accepting it from existing clients whenever they accept + /// version 0 (scheme_exact_svm.md §1.5, via [`super::check_envelope`]), + /// while the MPP charge and session servers refuse it ("servers MUST NOT + /// advertise \"legacy\" and MUST reject a legacy message", via + /// [`super::check_envelope_without_legacy`]). The kit never builds or /// advertises legacy itself. pub fn of(message: &VersionedMessage) -> Result { match message { diff --git a/rust/crates/kit/src/x402/client/batch_settlement/payment.rs b/rust/crates/kit/src/x402/client/batch_settlement/payment.rs index 77699a233..af6842415 100644 --- a/rust/crates/kit/src/x402/client/batch_settlement/payment.rs +++ b/rust/crates/kit/src/x402/client/batch_settlement/payment.rs @@ -1361,6 +1361,8 @@ mod tests { voucher_signer: None, operator: None, max_idle_secs: None, + max_claim_channels: None, + max_settle_channels: None, }, } } diff --git a/rust/crates/kit/src/x402/client/exact/payment.rs b/rust/crates/kit/src/x402/client/exact/payment.rs index 9f7f13a64..6011aae1a 100644 --- a/rust/crates/kit/src/x402/client/exact/payment.rs +++ b/rust/crates/kit/src/x402/client/exact/payment.rs @@ -18,6 +18,10 @@ use crate::x402::{ X402_VERSION_V2, }; +/// Loaded-account-data budget an x402 `exact` client sets on a version-1 +/// payment, matching the TypeScript, Go and Python reference clients. +pub const X402_LOADED_ACCOUNTS_DATA_SIZE_LIMIT: u32 = 4 * 1024 * 1024; + /// Build a payment transaction from x402 payment requirements. /// /// Returns a `PaymentPayload` ready to be wrapped in `PAYMENT-SIGNATURE`. @@ -59,7 +63,13 @@ pub async fn build_payment( // Compute budget. Canonical SVM exact validates these by index; on version // 0 they are the first two instructions, on version 1 the header config. - let budget = crate::core::tx::ComputeBudget::new(20_000, 1); + // Version 1 also carries a loaded-account-data budget (§1.5: it MUST be + // set); the reference x402 clients request 4 MiB, which covers the mainnet + // Token-2022 program data (about 1.4 MiB) and the rest of a payment. + let budget = crate::core::tx::ComputeBudget { + loaded_accounts_data_size_limit: X402_LOADED_ACCOUNTS_DATA_SIZE_LIMIT, + ..crate::core::tx::ComputeBudget::new(20_000, 1) + }; let cluster = signing_cluster(requirements)?; let mint = try_resolve_mint(&requirements.currency, Some(cluster))?; diff --git a/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/tx_policy.rs b/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/tx_policy.rs index 1661dd74f..ea30630d3 100644 --- a/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/tx_policy.rs +++ b/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/tx_policy.rs @@ -338,6 +338,8 @@ fn check_envelope( crate::core::tx::LoadedDataLimitRule::Present, ) .map_err(|e| err(format!("{label} transaction: {e}")))?; + crate::core::tx::reject_v1_heap_request(&tx.message) + .map_err(|e| err(format!("{label} transaction: {e}")))?; let payer = pc::parse_pubkey(&expected.config.payer) .map_err(|e| err(format!("channelConfig.payer: {e}")))?; diff --git a/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/types.rs b/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/types.rs index f274addcf..7f9679382 100644 --- a/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/types.rs +++ b/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/types.rs @@ -33,10 +33,21 @@ pub const MIN_WITHDRAW_DELAY_SECONDS: u32 = 900; /// Maximum forced-close grace period (30 days). pub const MAX_WITHDRAW_DELAY_SECONDS: u32 = 2_592_000; -/// Maximum voucher claims in one `claim` batch, so the Ed25519-precompile plus -/// `settle` instruction pairs fit a legacy transaction without lookup tables. +/// Channels per `claim` or `settle` request when the facilitator advertises +/// no capacity, and the most a legacy or version-0 redemption carries: four +/// Ed25519-precompile plus `settle` pairs fit a legacy transaction. pub const MAX_CLAIMS_PER_BATCH: usize = 4; +/// Ed25519+`settle` pairs that fit one version-1 redemption (size-bound), the +/// most `claims[]` entries any facilitator may advertise as `maxClaimChannels`. +pub const V1_MAX_CLAIM_CHANNELS: usize = 18; + +/// `distribute` instructions advertised per version-1 redemption, the most +/// `channels[]` entries any facilitator may advertise as `maxSettleChannels`. +/// Bound by the 64 static account keys: 14 fit when every channel pays the +/// route's `payTo`, so 13 leaves a channel of margin. +pub const V1_MAX_SETTLE_CHANNELS: usize = 13; + /// The only voucher expiry this scheme permits. /// /// The forced-close grace period after a payer `request_close` already bounds @@ -160,6 +171,18 @@ pub struct BatchExtra { #[serde(default, skip_serializing_if = "Option::is_none")] pub max_idle_secs: Option, + /// Most `claims[]` entries the facilitator redeems in one `claim` + /// transaction, copied from its `/supported` extra. Absent means + /// [`MAX_CLAIMS_PER_BATCH`]. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub max_claim_channels: Option, + + /// Most `channels[]` entries the facilitator distributes in one `settle` + /// transaction, copied from its `/supported` extra. Absent means + /// [`MAX_CLAIMS_PER_BATCH`]. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub max_settle_channels: Option, + /// Corrective-only server channel snapshot, for cumulative-amount /// resynchronization. See [`BatchRequirements::is_corrective`]. #[serde(skip_serializing_if = "Option::is_none")] @@ -632,10 +655,27 @@ pub struct BatchSettleChannel { pub channel_config: BatchChannelConfig, } -/// One to [`MAX_CLAIMS_PER_BATCH`] redemption entries: the only batch sizes a -/// `claim` or `settle` payload may carry (spec §4.5, "`claims[]` MUST contain -/// between one and four entries so the instruction pairs fit in a legacy -/// Solana transaction without address lookup tables"). +/// A `claim` or `settle` entry type and the most entries any facilitator can +/// accept in one request: what fits one version-1 redemption. +pub trait RedemptionEntry { + /// Largest capacity a facilitator may advertise for this entry type. + const MAX_PER_REQUEST: usize; +} + +impl RedemptionEntry for BatchVoucherClaim { + const MAX_PER_REQUEST: usize = V1_MAX_CLAIM_CHANNELS; +} + +impl RedemptionEntry for BatchSettleChannel { + const MAX_PER_REQUEST: usize = V1_MAX_SETTLE_CHANNELS; +} + +/// One to [`RedemptionEntry::MAX_PER_REQUEST`] redemption entries (spec 4.5: +/// "`claims[]` MUST contain at least one entry and at most +/// `extra.maxClaimChannels` entries"). No facilitator can advertise more than +/// what fits one version-1 transaction, so a longer batch is malformed for +/// every facilitator; a facilitator then checks the batch against its own, +/// possibly smaller, capacity. /// /// The bound is enforced at construction and at parse time, so an empty or /// oversized batch never exists as a value: a facilitator cannot silently @@ -643,18 +683,19 @@ pub struct BatchSettleChannel { #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(try_from = "Vec", into = "Vec")] #[serde(bound( - serialize = "T: Serialize + Clone", - deserialize = "T: Deserialize<'de>" + serialize = "T: Serialize + Clone + RedemptionEntry", + deserialize = "T: Deserialize<'de> + RedemptionEntry" ))] -pub struct RedemptionBatch(Vec); +pub struct RedemptionBatch(Vec); -impl RedemptionBatch { +impl RedemptionBatch { /// Wrap `entries`, refusing an empty batch or one over - /// [`MAX_CLAIMS_PER_BATCH`]. + /// [`RedemptionEntry::MAX_PER_REQUEST`]. pub fn new(entries: Vec) -> Result { - if entries.is_empty() || entries.len() > MAX_CLAIMS_PER_BATCH { + if entries.is_empty() || entries.len() > T::MAX_PER_REQUEST { return Err(Error::Other(format!( - "a redemption batch must carry 1 through {MAX_CLAIMS_PER_BATCH} entries, got {}", + "a redemption batch must carry 1 through {} entries, got {}", + T::MAX_PER_REQUEST, entries.len() ))); } @@ -672,7 +713,7 @@ impl RedemptionBatch { } } -impl TryFrom> for RedemptionBatch { +impl TryFrom> for RedemptionBatch { type Error = String; fn try_from(entries: Vec) -> Result { @@ -680,7 +721,7 @@ impl TryFrom> for RedemptionBatch { } } -impl From> for Vec { +impl From> for Vec { fn from(batch: RedemptionBatch) -> Self { batch.0 } @@ -878,6 +919,8 @@ mod tests { voucher_signer: None, operator: None, max_idle_secs: None, + max_claim_channels: None, + max_settle_channels: None, } } @@ -1232,30 +1275,58 @@ mod tests { } #[test] - fn redemption_batches_carry_one_to_four_entries() { - let entry = || { + fn redemption_batches_carry_up_to_the_version_1_capacity() { + let claim_entry = || { serde_json::json!({ "channelId": CHANNEL, "channelConfig": serde_json::to_value(channel_config()).unwrap(), "voucher": serde_json::to_value(voucher("5000")).unwrap(), }) }; - let claim = |n: usize| serde_json::json!({ "type": "claim", "claims": (0..n).map(|_| entry()).collect::>() }); - for n in 1..=MAX_CLAIMS_PER_BATCH { + let settle_entry = || { + serde_json::json!({ + "channelId": CHANNEL, + "channelConfig": serde_json::to_value(channel_config()).unwrap(), + }) + }; + let claim = |n: usize| serde_json::json!({ "type": "claim", "claims": (0..n).map(|_| claim_entry()).collect::>() }); + let settle = |n: usize| serde_json::json!({ "type": "settle", "channels": (0..n).map(|_| settle_entry()).collect::>() }); + for n in [1, MAX_CLAIMS_PER_BATCH + 1, V1_MAX_CLAIM_CHANNELS] { let parsed: BatchRedemptionPayload = serde_json::from_value(claim(n)).unwrap(); assert!( matches!(parsed, BatchRedemptionPayload::Claim { claims } if claims.entries().len() == n) ); } - // Below the minimum and above the transaction-size bound never parse. - for n in [0, MAX_CLAIMS_PER_BATCH + 1] { + for n in [1, V1_MAX_SETTLE_CHANNELS] { + let parsed: BatchRedemptionPayload = serde_json::from_value(settle(n)).unwrap(); + assert!( + matches!(parsed, BatchRedemptionPayload::Settle { channels } if channels.entries().len() == n) + ); + } + // Below the minimum, and above what any facilitator can advertise, + // never parse. + for n in [0, V1_MAX_CLAIM_CHANNELS + 1] { let err = serde_json::from_value::(claim(n)).unwrap_err(); - assert!(err.to_string().contains("1 through 4"), "{err}"); + assert!(err.to_string().contains("1 through 18"), "{err}"); } - let settle = serde_json::json!({ "type": "settle", "channels": [] }); - assert!(serde_json::from_value::(settle).is_err()); - assert!(RedemptionBatch::::new(vec![]).is_err()); - assert!(RedemptionBatch::new(vec![0u8; 5]).is_err()); + for n in [0, V1_MAX_SETTLE_CHANNELS + 1] { + let err = serde_json::from_value::(settle(n)).unwrap_err(); + assert!(err.to_string().contains("1 through 13"), "{err}"); + } + } + + #[test] + fn redemption_capacity_round_trips_in_the_extra() { + let mut json = serde_json::to_value(requirements()).unwrap(); + json["extra"]["maxClaimChannels"] = serde_json::json!(18); + json["extra"]["maxSettleChannels"] = serde_json::json!(13); + let parsed: BatchRequirements = serde_json::from_value(json.clone()).unwrap(); + assert_eq!(parsed.extra.max_claim_channels, Some(18)); + assert_eq!(parsed.extra.max_settle_channels, Some(13)); + assert_eq!( + serde_json::to_value(&parsed).unwrap()["extra"], + json["extra"] + ); } #[test] diff --git a/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/verify.rs b/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/verify.rs index ce438f200..1a114bbba 100644 --- a/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/verify.rs +++ b/rust/crates/kit/src/x402/protocol/schemes/batch_settlement/verify.rs @@ -663,6 +663,8 @@ mod tests { voucher_signer: None, operator: None, max_idle_secs: None, + max_claim_channels: None, + max_settle_channels: None, }, }; let config = BatchChannelConfig { diff --git a/rust/crates/kit/src/x402/protocol/schemes/exact/types.rs b/rust/crates/kit/src/x402/protocol/schemes/exact/types.rs index 7be660c54..20640ba6a 100644 --- a/rust/crates/kit/src/x402/protocol/schemes/exact/types.rs +++ b/rust/crates/kit/src/x402/protocol/schemes/exact/types.rs @@ -447,29 +447,33 @@ impl<'de> Deserialize<'de> for PaymentRequirements { } } -/// `extra.transactionVersions` intersected with what the kit can build. +/// `extra.transactionVersions` as the accepted set. /// -/// §1.5: clients intersect the advertisement with the versions they can -/// build, so an entry the kit never builds (`"legacy"`, an unknown version) -/// is dropped rather than refusing the offer; an advertisement with nothing -/// buildable left then fails negotiation with `unsupported_transaction_version` -/// (RULINGS T1, T2). A value that is not an array is malformed. The wire -/// object stays in `accepted`, so the echoed offer is unchanged. +/// §1.5: "A client or server MUST treat a field containing any non-integer +/// entry (a string, null, or "legacy") or any integer other than 0 or 1 as +/// invalid and fail closed with unsupported_transaction_version." The whole +/// field is refused, never filtered down to the entries the kit knows. A value +/// that is not an array is malformed the same way. fn buildable_transaction_versions( value: &serde_json::Value, ) -> Result, String> { let entries = value .as_array() - .ok_or("extra.transactionVersions must be an array")?; - Ok(entries + .ok_or("unsupported_transaction_version: extra.transactionVersions must be an array")?; + entries .iter() - .filter_map(|entry| { + .map(|entry| { entry .as_u64() .and_then(|n| u8::try_from(n).ok()) .and_then(|n| crate::core::tx::TxVersion::try_from(n).ok()) + .ok_or_else(|| { + format!( + "unsupported_transaction_version: extra.transactionVersions entries must be the integers 0 or 1 (got {entry})" + ) + }) }) - .collect()) + .collect() } fn normalize_network_identifier(network: &str) -> String { @@ -1438,31 +1442,46 @@ mod tests { assert_eq!(requirement.network, SOLANA_MAINNET); } - /// §1.5: the client intersects `extra.transactionVersions` with what it - /// can build. `"legacy"` is never buildable, so `["legacy"]` leaves an - /// empty intersection (negotiation then fails with - /// unsupported_transaction_version) instead of failing to parse. + /// `extra.transactionVersions` holds only the integers 0 and 1; any other + /// entry invalidates the whole field (x402 scheme_exact_svm.md §1.5: "fail + /// closed with unsupported_transaction_version"), rather than being + /// filtered out. #[test] - fn transaction_versions_keep_only_buildable_entries() { + fn transaction_versions_fail_closed_on_any_invalid_entry() { use crate::core::tx::TxVersion; let with_versions = |versions: serde_json::Value| { let mut offer = v2_offer(); offer["extra"]["transactionVersions"] = versions; serde_json::from_value::(offer) }; - let legacy = with_versions(serde_json::json!(["legacy"])).unwrap(); - assert_eq!(legacy.transaction_versions, Some(vec![])); - let err = crate::core::tx::negotiate(legacy.transaction_versions.as_deref(), None) - .unwrap_err() - .to_string(); - assert!(err.contains("advertises no transaction version"), "{err}"); assert_eq!( - with_versions(serde_json::json!([1, "legacy", 7])) + with_versions(serde_json::json!([1, 0])) + .unwrap() + .transaction_versions, + Some(vec![TxVersion::V1, TxVersion::V0]) + ); + for invalid in [ + serde_json::json!(["legacy"]), + serde_json::json!([1, "legacy", 7]), + serde_json::json!([2, 1, 0]), + serde_json::json!(["1", 0]), + serde_json::json!([null, 0]), + serde_json::json!([0.5, 0]), + serde_json::json!("0"), + ] { + let err = with_versions(invalid.clone()).unwrap_err().to_string(); + assert!( + err.contains("unsupported_transaction_version"), + "{invalid}: {err}" + ); + } + // Present and empty is valid and accepts nothing (RULINGS T2). + assert_eq!( + with_versions(serde_json::json!([])) .unwrap() .transaction_versions, - Some(vec![TxVersion::V1]) + Some(vec![]) ); - assert!(with_versions(serde_json::json!("0")).is_err()); let mut absent = v2_offer(); if let Some(extra) = absent["extra"].as_object_mut() { extra.remove("transactionVersions"); diff --git a/rust/crates/kit/src/x402/protocol/schemes/exact/verify.rs b/rust/crates/kit/src/x402/protocol/schemes/exact/verify.rs index 7f604f72b..952bcb324 100644 --- a/rust/crates/kit/src/x402/protocol/schemes/exact/verify.rs +++ b/rust/crates/kit/src/x402/protocol/schemes/exact/verify.rs @@ -15,8 +15,9 @@ use crate::x402::error::Error; const MAX_COMPUTE_UNIT_PRICE_MICROLAMPORTS: u64 = 5_000_000; -/// Highest compute-unit limit a sponsored fee payer co-signs. -const MAX_COMPUTE_UNIT_LIMIT: u32 = 200_000; +/// Highest compute-unit limit a sponsored fee payer co-signs: the reference +/// default of scheme_exact_svm.md §2.2.1 ("Max compute units | `400,000`"). +const MAX_COMPUTE_UNIT_LIMIT: u32 = 400_000; /// Verify a confirmed transaction matches the expected payment requirements. /// @@ -284,6 +285,7 @@ pub fn verify_exact_versioned_transaction( // has no ComputeBudget prefix; the price cap is applied to the header. let budgeted = version == crate::core::tx::TxVersion::V1; if budgeted { + verify_v1_config_presence(&tx.message)?; let declared = crate::core::tx::DeclaredBudget::of(&tx.message) .map_err(|e| Error::Other(format!("invalid_exact_svm_payload_transaction: {e}")))?; if declared @@ -303,12 +305,15 @@ pub fn verify_exact_versioned_transaction( ); } // The limit and price caps are checked above with their own reasons; - // what is left (a zero unit limit, a missing or short - // loadedAccountsDataSizeLimit) is a malformed version-1 header. - crate::core::tx::check_v1_budget_caps( + // what is left (a zero unit limit or loaded-data budget, one above the + // runtime maximum) is a malformed version-1 header. §1.5 requires the + // loaded-data budget to be set, not to be the maximum: clients size it + // (the reference SDKs request 4 MiB). + crate::core::tx::check_v1_budget_caps_with( &tx.message, MAX_COMPUTE_UNIT_LIMIT, MAX_COMPUTE_UNIT_PRICE_MICROLAMPORTS, + crate::core::tx::LoadedDataLimitRule::Present, ) .map_err(|e| Error::Other(format!("invalid_exact_svm_payload_transaction: {e}")))?; } @@ -334,6 +339,39 @@ pub fn verify_exact_versioned_transaction( verify_required_signers(&tx.message, budgeted) } +/// The version-1 config rules of scheme_exact_svm.md §1.5 and §2.2.1 that +/// have their own reasons, checked before the shared budget caps so each +/// failure names its rule: no ComputeBudget instruction (the runtime ignores +/// them, so bounding one bounds nothing), no heap request (version 0 rejects +/// RequestHeapFrame the same way), and both the compute unit limit and the +/// loaded-account-data budget set (an unset value is zero, which cannot +/// execute after the sponsor has paid the fee). +fn verify_v1_config_presence(message: &solana_message::VersionedMessage) -> Result<(), Error> { + let solana_message::VersionedMessage::V1(v1) = message else { + return Ok(()); + }; + let keys = message.static_account_keys(); + if message.instructions().iter().any(|ix| { + keys.get(ix.program_id_index as usize) == Some(&crate::core::tx::COMPUTE_BUDGET_PROGRAM_ID) + }) { + return invalid("invalid_exact_svm_payload_transaction_v1_compute_budget_instruction"); + } + if v1.config.heap_size.is_some() { + return invalid("invalid_exact_svm_payload_transaction_v1_heap_size"); + } + if v1.config.compute_unit_limit.is_none() { + return invalid( + "invalid_exact_svm_payload_transaction_instructions_compute_limit_instruction", + ); + } + if v1.config.loaded_accounts_data_size_limit.is_none() { + return invalid( + "invalid_exact_svm_payload_transaction_loaded_accounts_data_size_limit_missing", + ); + } + Ok(()) +} + /// Only the fee payer and the transfer authority may sign: every extra /// required signature is a base fee the sponsor pays. fn verify_required_signers( @@ -1637,16 +1675,62 @@ mod tests { let solana_message::VersionedMessage::V1(message) = &mut tx.message else { panic!("version-1 message expected"); }; - message.config.loaded_accounts_data_size_limit = None; - let err = verify_exact_versioned_transaction(&tx, &requirements, &[fee_payer]).unwrap_err(); - let reason = err.to_string(); - assert!( - reason.starts_with("invalid_exact_svm_payload_transaction: ") - && reason.contains("loaded accounts data size limit"), - "{reason}" + let base = message.config; + let reason_for = |tx: &VersionedTransaction| { + verify_exact_versioned_transaction(tx, &requirements, &[fee_payer]) + .unwrap_err() + .to_string() + }; + let with_config = |edit: &dyn Fn(&mut solana_message::v1::TransactionConfig)| { + let mut tx = tx.clone(); + let solana_message::VersionedMessage::V1(message) = &mut tx.message else { + unreachable!() + }; + message.config = base; + edit(&mut message.config); + tx + }; + + assert_eq!( + reason_for(&with_config(&|c| c.loaded_accounts_data_size_limit = None)), + "invalid_exact_svm_payload_transaction_loaded_accounts_data_size_limit_missing" + ); + assert_eq!( + reason_for(&with_config(&|c| c.compute_unit_limit = None)), + "invalid_exact_svm_payload_transaction_instructions_compute_limit_instruction" + ); + assert_eq!( + reason_for(&with_config(&|c| c.heap_size = Some(64 * 1024))), + "invalid_exact_svm_payload_transaction_v1_heap_size" ); + // §1.5 requires the loaded-data budget to be set, not to be the + // runtime maximum: the reference TypeScript and Go clients set 4 MiB. + let sized = with_config(&|c| c.loaded_accounts_data_size_limit = Some(4 * 1024 * 1024)); + assert!(verify_exact_versioned_transaction(&sized, &requirements, &[fee_payer]).is_ok()); + let zero = with_config(&|c| c.loaded_accounts_data_size_limit = Some(0)); + assert!(reason_for(&zero).starts_with("invalid_exact_svm_payload_transaction: ")); } + /// A ComputeBudget instruction in a version-1 message is refused with its + /// own reason (x402 scheme_exact_svm.md §2.2.1). + #[test] + fn verify_exact_v1_rejects_compute_budget_instructions() { + let requirements = requirements("1000"); + let fee_payer = Pubkey::new_unique(); + let owner = Pubkey::new_unique(); + let tx = build_exact_v1_transaction( + &requirements, + &fee_payer, + &owner, + vec![crate::core::tx::unit_price_instruction(1)], + crate::core::tx::ComputeBudget::new(20_000, 1), + ); + let err = verify_exact_versioned_transaction(&tx, &requirements, &[fee_payer]).unwrap_err(); + assert_eq!( + err.to_string(), + "invalid_exact_svm_payload_transaction_v1_compute_budget_instruction" + ); + } #[test] fn verify_exact_transaction_caps_v1_compute_unit_limit() { let requirements = requirements("1000"); diff --git a/rust/crates/kit/src/x402/server/batch_settlement.rs b/rust/crates/kit/src/x402/server/batch_settlement.rs index ceba4a58c..01f14342c 100644 --- a/rust/crates/kit/src/x402/server/batch_settlement.rs +++ b/rust/crates/kit/src/x402/server/batch_settlement.rs @@ -67,7 +67,8 @@ use crate::x402::protocol::schemes::batch_settlement::{ BatchChannelConfig, BatchError, BatchExtra, BatchPayload, BatchPaymentPayload, BatchRefund, BatchRequiredEnvelope, BatchRequirements, BatchSettlementExtra, BatchSettlementResponse, ChannelStateSnapshot, SetupForm, TransactionExpectations, VoucherState, - BATCH_SETTLEMENT_SCHEME, MAX_CLAIMS_PER_BATCH, MIN_WITHDRAW_DELAY_SECONDS, VOUCHER_EXPIRES_AT, + BATCH_SETTLEMENT_SCHEME, MAX_CLAIMS_PER_BATCH, MIN_WITHDRAW_DELAY_SECONDS, + V1_MAX_CLAIM_CHANNELS, V1_MAX_SETTLE_CHANNELS, VOUCHER_EXPIRES_AT, }; use crate::x402::protocol::schemes::exact::{ caip2_network_for_cluster, default_rpc_url, default_token_program_for_currency, ResourceInfo, @@ -809,6 +810,17 @@ impl X402BatchSettlement { crate::core::tx::highest(&self.accepted_versions) } + /// Channels per claim and per settle redemption transaction: the + /// version-1 capacities when redemptions are built as version 1, four + /// otherwise (scheme_batch_settlement_svm.md, facilitator-built + /// transactions). + fn redemption_capacity(&self) -> (usize, usize) { + match self.tx_version() { + TxVersion::V1 => (V1_MAX_CLAIM_CHANNELS, V1_MAX_SETTLE_CHANNELS), + TxVersion::V0 => (MAX_CLAIMS_PER_BATCH, MAX_CLAIMS_PER_BATCH), + } + } + /// Route this handler's chain reads through `rpc` (a mock in tests). #[cfg(test)] pub(crate) fn with_rpc_client(mut self, rpc: RpcClient) -> Self { @@ -926,6 +938,12 @@ impl X402BatchSettlement { voucher_signer: None, operator: None, max_idle_secs: None, + // The redemption capacity of the message version this server + // builds redemptions in; absent (four) when that is version 0. + max_claim_channels: (self.tx_version() == TxVersion::V1) + .then_some(V1_MAX_CLAIM_CHANNELS as u32), + max_settle_channels: (self.tx_version() == TxVersion::V1) + .then_some(V1_MAX_SETTLE_CHANNELS as u32), }, }) } @@ -3378,7 +3396,9 @@ impl X402BatchSettlement { }); claimed_watermarks.push((channel_id.clone(), state.cumulative)); } - let signatures = self.submit_groups(groups, MAX_CLAIMS_PER_BATCH).await?; + let signatures = self + .submit_groups(groups, self.redemption_capacity().0) + .await?; for (channel_id, claimed) in claimed_watermarks { self.store .update_channel( @@ -3442,7 +3462,9 @@ impl X402BatchSettlement { }); distributed_watermarks.push((channel_id.clone(), onchain.settlement.settled)); } - let signatures = self.submit_groups(groups, MAX_CLAIMS_PER_BATCH).await?; + let signatures = self + .submit_groups(groups, self.redemption_capacity().1) + .await?; // A successful distribute proves the claim watermark was already // visible and paid. Persist it immediately so the next lifecycle tick // does not re-submit the same channel merely because the RPC account @@ -4590,6 +4612,8 @@ mod tests { voucher_signer: None, operator: None, max_idle_secs: None, + max_claim_channels: None, + max_settle_channels: None, }, }; let (_, config, channel) = client(&fee_payer, &requirements); @@ -4646,6 +4670,67 @@ mod tests { assert!(json["extra"].get("channelProgram").is_none()); } + /// The advertised version-1 claim capacity packs into one transaction: + /// 18 Ed25519+settle pairs fit 4096 bytes, where version 0 needs five. + #[test] + fn eighteen_claims_pack_into_one_version_1_transaction() { + let program_id = Pubkey::from_str(pc::PAYMENT_CHANNELS_PROGRAM_ID).unwrap(); + let groups: Vec = (0..V1_MAX_CLAIM_CHANNELS) + .map(|_| ChannelInstructionGroup { + channel_id: Pubkey::new_unique().to_string(), + instructions: pc::build_settle_instructions( + &Pubkey::new_unique(), + &Pubkey::new_unique(), + &[7u8; 64], + 123_456_789, + 0, + &program_id, + ) + .unwrap(), + }) + .collect(); + let fee_payer = Pubkey::new_unique(); + let v1 = pack( + TxVersion::V1, + groups.clone(), + &fee_payer, + None, + V1_MAX_CLAIM_CHANNELS, + ); + assert_eq!(v1.len(), 1); + let v0 = pack( + TxVersion::V0, + groups, + &fee_payer, + None, + MAX_CLAIMS_PER_BATCH, + ); + assert_eq!( + v0.len(), + V1_MAX_CLAIM_CHANNELS.div_ceil(MAX_CLAIMS_PER_BATCH) + ); + } + + #[test] + fn requirements_advertise_the_redemption_capacity_of_version_1() { + let (mut handler, _) = handler(Arc::new(MemoryChannelStore::new())); + let v0 = handler.requirements("0.001").unwrap(); + assert_eq!(handler.redemption_capacity(), (4, 4)); + assert_eq!(v0.extra.max_claim_channels, None); + assert_eq!(v0.extra.max_settle_channels, None); + + handler.accepted_versions = vec![TxVersion::V0, TxVersion::V1]; + let v1 = handler.requirements("0.001").unwrap(); + assert_eq!(handler.redemption_capacity(), (18, 13)); + let json = serde_json::to_value(&v1).unwrap(); + assert_eq!(json["extra"]["maxClaimChannels"], 18); + assert_eq!(json["extra"]["maxSettleChannels"], 13); + assert_eq!( + json["extra"]["transactionVersions"], + serde_json::json!([0, 1]) + ); + } + #[tokio::test] async fn withdraw_delay_outside_the_conformance_range_is_refused_at_verify() { let (mut handler, _) = handler(Arc::new(MemoryChannelStore::new())); diff --git a/rust/crates/kit/src/x402/server/upto.rs b/rust/crates/kit/src/x402/server/upto.rs index 137909180..4f84fdee5 100644 --- a/rust/crates/kit/src/x402/server/upto.rs +++ b/rust/crates/kit/src/x402/server/upto.rs @@ -1919,6 +1919,7 @@ pub(crate) fn validate_open_instruction( pc::MAX_COMPUTE_UNIT_PRICE_MICROLAMPORTS, crate::core::tx::LoadedDataLimitRule::Present, )?; + crate::core::tx::reject_v1_heap_request(&tx.message)?; let keys = tx.message.static_account_keys(); let ix = find_canonical_open_instruction(tx, keys, program_id, expected_memo)?; diff --git a/typescript/.x402-vendor/x402-core-2.26.0.tgz b/typescript/.x402-vendor/x402-core-2.26.0.tgz deleted file mode 100644 index 4164286f32a08edb831d0c2fbbca0d7c3d3f8953..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420604 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%0DV9Tx0j|Ffoj(GlY;UnSM~YiA2I zY=A|`e-YwejPwoRFOXE%`Bv=&cZbw$3_fpIzJs^cl$lN74Q4g^>^)0EZ`12?xptj&qE=Aewr-q=JZGoP+aF#GlOL~Z^`z}#g@3Xo#+mY> z|L_gM6~L?e-n(gXy`KlaI!~_lv-32cReR|$pNt?SrBej=+N!nl$kbFnrL~b7(O-YN z*lDE~+$CYxdAAfWu$ukE$%jp*VgK9OL+W4>ytp@zyhYu}@ciqRvuX>UAz$+u5>O6M zQU+SFt~wfr`T21+!Bf?jfz-Hufdmw_LeQQpX353CrG8C|GIL@(8t9^quB7m%P6^rW zU!Tf@iP&ohypGo7ecWU1r8x~gQW$cn)%wHLmD#zn54}Wlq3rD-v?aFM*H#uGw8BcH z@LJ%fU4XsxImqB#9b%uFfY>125bZR6!?pvqI58$y5ah4xw5H6g$ z^b}C5XV|N`c>73dVQ(Cgb`Q_mf=#QP}qW?;1>v))09d6aR zA8JPvwG7s0Y{(QDXzbThkuD}c!2F8`NPsHOhC}r1@27~G zf4Wq?nNnbb>kAA>BD3*0K)d0L9b_<%8M@r{%VHN*kra>4my3tWDUi~FEi0eFy{*Sj z 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

PwM1x^sC+&o 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 !8uLx#n>)rw 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%0AM!c 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�C03`sO#94L4vNF}3aQsjNZUAHc+r zDMSl;zJ^%7mU!)Hsn!pUsyjh*B0nTGOHkP%^#k<(W+;a$<`%M)Gf3&|L`AsY z2^t=moaSErX6I`3PMgp&ccW~crix?wyA5viluv@tvYwn5uxrZ8dt??jdiZ{0<0iNJ(!bT;;7+fv5QMnv zNE5hp)(ry_?Rpms#61g-afV5;*Xu$4E93H%IrWfElI@9SP$igI&o1m zUeV^`oC@rVZ2XpnQ#{Aq;Z@uzh z$%o+oIys{Ty#@X$$*L=kr?t<-5Rhp=s8GNmA+uNPV2B(5Jpq^g37oZf*gNM&PwayK zI=UPguq3z!gGc}1j6%ZgJ>VTDy*`_TKx%g<_oG>d2=(49nV%_UOz2lOFLWp~z?~$6 zproDP#fAR|fBaxx;VcMB%}$P96X#bVA#-t20?E(#1GnG zb!$#LWpbhN#5i8xfs?@Q6B>H>jzF+*LJ5DLUfSP9*LB`$qpjHJ9WKAKRTipO&MtNU zO+;`7Sg@vUhVN$|!^HBB2;Oi!Jg@i_=bHIV!&jZA%%)A}zcU;DD*k_7x?$!c?E6MDGZ&-&f{Kh_n=DyP<33nX zftW7+TPg^b1ne1EadyC5M80bEB2MywoVqrpTXiSNWm>9A_=CUIhcdnQPGjdh_wo+K z_k<)@cP2cFT)8$gh|kkah<9a_9n9;p;l)%lo=il^PVrJ0`w^N-D`rLloVXXF87)a~#N3UCWW2 zxnO!x2ozHsg!`7H<auqvh>vI>GhI64gKi|Mg5A2P)f1@t*Y z=4qoLn#QiqY1$B-?rx0wXv2qk>cnm;2Cv}Znu$835^Grsh{FdE zAl(_#*^cHSlHg)WV%{y&6U?uI#>~YsJ(=bjCmWlWz_n`(xE51z%0N`2Eip_dMU}~f zKa&u$Jbl43T}TfLR8@WauThr27mYUM9<_1h5Yj9Q$qcgYTI00Z^o(3GmzImmk5(0k z6euqEOdz7W%C-8N@1Cxmw;KnYrx^mL%ViT7QIfhFO-c{DNqy$;33pwaEFzAAzG-JF z;fDI9RrSHHC@qTD75RLIB|hN&WkqpOAN+K4u_SZzaue0?7vUlFd6D=wTA8Q|<*IZj z`poyL4{J7fpPb6POLt_jH*Q-vazx)UVfRr;+tr}1P^>CgT%#0@kl#>a7iCtb7Ph}u zZ371AdzJBt#5uWhIeS?UuW}=NOSI#ar6uto#y7vU2fYCf`lX_plZ>ZiGDu&xl{n}Ic`F8Ee;RE5re)mu zJq_p23=mfm$5h0&525|bv3PiFk`Kk#4$tp8Xtfi%aE6hc15>@x<3-SD;|5FyP@aPg z;k%6u@$qUc#OWK|c|swdD%^8rX(^x-u=2S%L7!|$Tu;Rn6D${?3C9Kvg5#FXo}%mw`O(<5dML2TKPsQ(G+PG)-1*b#k_lVC`k zA4!M|go1AyC@d6PI7hwcNV;myBAvC^9_#uB`(bguP^5T(@x_|L*Q+tsX9Cx?-aNp^ z=Hg!Fy3`N&gF9~oh$_;U`CwZRzgN9%A71JMMHw=*NYQj z$H+_F6dpE}I44pghS7j$Y3UV z#*8cmq58Aa7|aTTzl{_IzNcPeDg(+I7QjL4Qo|;1?@aK`xj@}$BdIx>c*9wiY^6|=M1Hp+}Z=OdmB{5u5t06usUNih9iTN)T;pJi0g~ymsu5uhpqdqu3!J%yZKN~Jy=r@)wDj_P0AWG!(eqLMF`9Tq@EMd z{o>o|!D8od8A6cc8!J#zwfD_8x^33t{ZQ#8zf!uIp+giLx6S&MRt`4&LvV%){oI(#-pR|q5 zOE&I$KwJ;uXkY_WF><0!#KbFE#rF~-uBAaFBWLHHW^=TkC3nz{4f2CMYRwJr!Kq zA0q0VLZMS$-*A{Ne$6j;&Ly^mI>uUep=lwD(Q<&&#c-|EJd?OMwI?MfehG;C6j z4cnBTL7c3OUg&H_HcAOrT4KYh5G=oH5noT9ft!BG26E~#k)b+F>hU|9bmD|F2ieR) zG;@)RCYWiiWt}6Ok)v7;^oZ004h=O^kmQ*1gl*mXXibc!77zS9v=*&g1m}8A`++gm_q#57-7T#YPL1v3kB>1R zZdJ6FoEMYi@}Tg`kCP7v**Gnx^?o`i@*$);uuI^sShe;Dsdpo@7jrcgziS#-i7+AF zBu3g%H@_gw%d93Qfr*H0j@NncS`nkpE1Sjm!lymuvw5ff`k%6V7(ZC|c`+^zvDDdo z;^IqSEub%FDBj7x_j@KIb+)og(6yK&zc+Xsu+l8^=0|IYdN^dIyi4=^Hx4j-!2OVt zrdlc;>pqDnu?s>4)2dtn`n~i9l)j2%ld!_v8bc~2N_`?PAeNIx2DcDWHF3pJ6nxgY zD4P2VxJv}2+4>A?Td|ST$;3z$ve{l;yoSd-LdZdV!%?jV6F2ZEAX08o`c||$mnKJ> z-CexvP;pG}K;q5)7ASa}r>x7QR^etztB0MC?}j!_Du7+9id5w@q+R>LuroYX>2f^Kq|P(&qvI#jjgB->SvNkxfHA)0m~Fsrtj zQKi~to~+U(Q(HK7-pE!579>zo`CjZl|7mCQ;Pu{ii>->AY1tM(%!Y2GYmzpL+irprX2oit4qAYxhY!A1*X<_%~dYYN>81s6zbw4Jr*(n(hb*HIXG+J z@yR4j$U*lwRiELXfJG1DMp{cw>K1#+H}RRAZkt6^X}Nhy!LS@qS3Pzdo~iM$fdw|X zZjKdsS^P5_jS`b+(e-?8vVfMw*!7nghIqM+p1L4*13orZ6+V%qK$OmN_CoXdk0G(| zHUO|oe@V2!fuRcg4k;}HW@@X`@nn?LwmYs3W@`D`P*puwZOi!v*be4!$D@y05u3Zu z)u3FZ=U!;aHKhfBN?c?{YZ4vAk}ex`*BO#yX;wMey_C$9hY-$+Nm`DxdgUk?jfx8p zZcRdXu^}EVuL!hSIuO$;mcjvEi9yo1X=n|P+6u;nb*E~Q~pO`!%q&<|Luc#bxU z4gk5>p@o8U$XkF-CDfgvV;>8>x?*9aLspnGj#_`3evocJyuDtTPDaTfZ7;rkyLj3at+#LA zzHN2Pv>#kuYTHpfyt-L{s z7ta=-?k&E4u(GuB2m0Ut?t9?w=*SstqT zjz?(&;lK8!wo4;aiD2R`KU4s--pG4kTuqQ%$kJsoj`)e_c85lr;JDwYTe`LJ;K?sE zq5nMvBbVGDa)%vm{O7yH&f!wTCM!$x22?KYMU{(N&NoXXO`C)+PTDA7U)|(Ou`d7h zdhai^fuGixuTAk5j%U{ROf}m!6 zT^y;~M!RKYNN#EJmmXSKH5nzBn`q)-`K7k_^T;*B&5RSc52;tqH9>YpBB-fM5KQl^ zOfFXUVi2Vau4XVT%QUYkQ;hufMsHecG#$ z9l1C_NoPRhrH9=jFIUD_X6%N5E-R!PkZ+7&q>6s?jj9z)ZzRft!oI_Y9Ahju3Mk%S3ASW06hT>v6y30g`+*Ysvr&=Mx=>FdiHb$Byd>`5 z*B@`tX-cettF=3K78gZT4i>@pa?zxdhb*?ey1Jv%H;Sx!mek2;zfQ_}I)T?L=O;}7 zH^xLjd7dVdd!AM-7c1~FddLsk7dg+I(ZZDGr(Sae{Nk5=<>?5jd-z0-1 zulMnUeFo0tz?!N&nN(**9Y~n@?j z`z0$={h=5_D0>$SNrv~J=-?ENvE%T%WI2&KkN3Xcdi-;5{PzlOQ~&Yx@89>2BIMJ>VOG_P zX*FIX8hEq)-Sr!@Y&y3T3UMi@S%YJFD)&(|6f{Ke)OGK`tH%=rRC+vkCz^b zrR7H}kG>cGv2-gVobflU>ZJUSrO*DBJGg(5KPe_<`4BuAsypXN$=!##AW4tMr) z1|Q)x^p%hNPX8kN|IfdyJpJX(i@$z>{lEO(!|xxv`~Tsi<*)nyOZ>_GKdrM-Ww?O8 zkmS?xaatY}@ZpksPF|+T1dr&YEuE5d3j4 zXGxB*I;3#juS+n>RCTGk%zfQv6}w`2i51M#(*#6uXwH192Mb?I zgUmvUl~0Zh^-E(h(0#FY)3hQUD`#8vb$Jl#*TYzGDV!eT=oT;5WiP8EeiM$n0*na9D0JRz~Tq zBzd;k+P4-U8*r-y?WoygH+CeymqnglO6niOzxnbs+t?L~&k2Z)MmitwPe(RGD*MvJS&@9yBUURFH=g+;0w`SeLv{DG^iZZrTF#!4%J z!z@g8K-UxwOoe>)sZWQz|@PbsIa}&Xwz2~5e|y{JT2>k0#(*hoho;+)bVR2p&?Md zRjk6%4Wn$sYStAc-TP?OzY=e!D@)4{!3R)lfAfMOvAX0lK7ji+oDup(-&l69%!WtG zdE47~JG_7IT78|_NtZa_e1h0aoGKXrN=K7bFL+2zlHo8NZlwb%jUk>BP=5_oZ>uga z^p3}fiNz}RD!U*am=>9x@^4EIh%cgHWvK-;0N0YV8YGjH?DvpF@tkrftp7+5gUq3! zcmKi0-|l_9YIi;zzJ2%hEq7~J!?vVXzH|>cC`_x`Q$(syrI4dcRJ;?qEVtWgXNeXc zGV?qDmji0<>K-i4mDMAHOsizaSckf*gzlMcIy4m1H*!yxb@k`KubtGR)sxE|8MUx3 z+Te+eWBJJ7Ita;amt$H@dV|Lhw|R0Fs2u2)LIa|5}Rsq^peP+m>3a+meXF#4O}A~ zW6QqEw7jZUoB5E@1XX(3)D0dFyp_}mh}x=_{b4H(6N(1H8lZ$Jph9S>-dR$$-33!O z3R9d#{ctWDrVLik+i2JNgfj>^zfY1Xef)5npq-U_*W%xdB=BJI-Tn2COWl>Ldy8x4 zsH>8bl-F$!ai$!h>vU8cC!>S2tfKT@I`jsS2)shQFIaLGG z%ogT#me+qEoFd)~zb8rNihNtFi={P@i62Cu^qR;XJTSZuKXaIYG+-4T$o1N++nFV8 z>kDZ?Q8$WkXfn$-tir+{oQ0Led-Q)IlsOhutsh%b-8x&*VVX|1|1nKQ?c(_F%Uv+x zukibr_Ll=CdfH-jDxIU4}ll%0a#9%u7tfE?*aeN zp9o?BDWM4?XxFu4I*$m4f%Tw7yVE-<%IyR!*YDv@#$5KOopYJOt2q8U=HOE2EVYl1 z4Ag)u>37V$cBPkkWjh5s0@D%U*^$&qeL*0U9<+2EcwQ96+g z_%CEDd?VBacrPYpay&|jn9fbsF`v@Z;H@6$c~GaQnO?O)%oExo@GQC(Zu3@x2>I|3 ztG!cV|K`@#^MmJawvRUV_BQ`=^nB;ptD|Snw_j}S%j704#D7f71>h#FRk3(q{MXUZ z?(4nnqa$&D5qZ*nTDK2dRqI_xoy_~&dvCV)j$Zw;v%U3MjV7#7r>`$J|9tdfd*`Qv zpJUB_6xAxYw~)^YGqVJ>7G34r&hGT~vo5hY@0twHg8~q|2nmnsxi6BcH;rN=6!K*s z^ucf>8~YiZ8)VUzY#e@gqzn(^gh6fv;q?vFWXm+eq{Yo5{~jhS-~NLx0@4(48`hs$ z_MgX(R=$7e*?%5C`fC6A5`Wp)vg~pv5%SV(^?HlGUr1~1j;v|k?>zkPKmYZomA~5W zJ)5!HEH@K}nti$X{j=|$zIg68+spuBY|vsX%`7g&6r)_!X2KrF@(0eDNoe3t{&?`} z(H~zulJAvAquih{r?gVaY_D9(fSql=eD!+g;AnSy??^gOftv5$a%+vdK5o{4cekh*CjHn5x}AboQ(Cp=PQep`o#bX8kc@*2z`v^wIx^=e`(JmUtPQBLBVUTEs7Co8VY?<-fIA@J3 zE3FxtrT~!p^9W8UmrR=*y>aq^cEE00s*n{qk(LR|-7dO`Pz#;7HA~-|`V||9L$`$Pt#H)*ePvM0jonIhQ(-&Gx~qk58dk&C_-ah z%d}z9r%W`5!wn7ZI%F}ehA*;lR?BpD(Ka_WW-!Jzi--6ICT99n-|X}fZEj-QjM+M_ zv?G;Fy0k6^BS=nu#GZZhBcuV78%TwfQZD2(gBZ}0dOsbd1A>TsW-fxF!pFgo3kke& zo@669tUN4joNfS1DBQqf>x0HX1%Rbm-%f*&2Px=21NW$x$wZ-UU~N*gQcZwR-c)&a z=Bqv_M%f@sIjpPGDGN|~t{(B7$`l%utr7veRqiiX#;nMHR&dw62bhFpo`Oa0l#*`R z!NL>A>$kB?fKuF86Z`F_Pomvs0^CYhXhih&A6Ya>4DF07R6(a}% zI3xx+RVj2EbgBv^S}1DhN}#I12B_p%oiLwGo@go1d%Z&dU?CgeU`$F(4*-3j7y(QM zV*|2q(-Ij~Fy>{Tp&6~2w5@Q(nX#bsEN{;Bb+K%P^^gRqw#J)fRZGi1@;4P^(XY%A zC(zKm%~%>XH4$>fHp~d|k)s;4Ke&q}R6$#FCq)mOJ8L7~WqMtw-72lQoKXcE2%U{o z-`fic1Q&LLM39pNp@P?BKp|2Z#CRhJyT1t(!W``a^$YV)(HE#O-L}1h=rPrm-B3-) zcdVsA*jsQD7o`}SQB=F$6Pge-1<0khPj+NZN2;*I2j=jF!mWSJndP%7mS@iA`LceH z4as#QEeWo_80A&jeC0zZ9{or3pl*^|bBAJmg?mr0fNZATI| zal89&x2j1xAP*;LroW|*mFn=|j=JBb*<|_AqgA(4Fmv99u+Ic8pQ+F}*r^7zB^2tTVh=k@qh=t!kwlrN1dYO6x? ztd8MQvL7s|4x}9!B)Ld2R@23rw3rmT9srxdOrGgba;Ms`^MRCa;Sn4S8n_aelTJ9Q z9%hxeC;{?tNZ3Ut*}$U08dxN0Ivol`{1@Ap0l=_8YEW1Fwi10B&aRbKu`lz+L88); zM2s94!|db|yJ~0dqyWbSonVL({^Gzfsc?Co4#jzvh%saimy?j{fY$&~nMt=Kb+#6_ zd+zDwGMRHCmr=8@Am7=EcDkm6b8rHH;Kl4H=6G_4X(wp%@~*I&rivb$lX57Os|sBs z;sZo>4(@T$eIgQ~6UZL;AsqltmpoBjAl8Arg-Vin3Q56^G2x$lK_@kI4vy`Q^p;@r zx*C?5bWbEL+Z2P{AY#FPG86W#P)dM-jI_yAZq383CFv=s7D!zHj#Z^}f63UAMr;y2VN4b;BP~y@r zHuW0A(VO#-cI{eI{VXftzGEL2<{}}XFV9rUJ-i9^)GE=K`hnT(V}h<+=7^=WsLWyz zjEcC(@~RUO{OS)Lz-;@t~v*L*V9SqSP2*0o!CMBA>jCpomY9aPSg5D za-5FRA>|U38kv^2N*ZiwP=8PhBsXv`koy2ig;Gqj+6r)CgQuq2*a&^VKCOk94zRTI zVPm2_7(7SYk!2wFm0nnc-Z3vql|x#-=2|-)N8?dN12&FrL6CI&LZav6GXEYvdqYsi6Z-XrJ0&Om!~@Na~*euu#+Rx-pC` z%kx_0v|iUkjljoIA1Jw}`uwV=DNROBkT=t z0%6vMuQ*%tXh_*`wdjXcD7%#Ak8rurgkp0(AL5X1?vi@7X*TQy)DF{p*JdRuBF1{i zL!pG7dd&KEF42cv`7N;@C-iG4C+mH?G8Irm>CBpWv99;kTINxZq*WjgzbHGcQUM8E1o0&;2*tVg44 zP{Yk9L4`NiB8q&F)M*YI#U3j~aue*VXd`g`u(*I*UYd-lMTu=QNG6EAq2^K7EisWY zSb1{h|L|?qL1}0>r5r2DcwDCA;yfL$p~pZ1o{})p88!j=o1wckZE2C9UqP0ij?#sc zBDiTx(mX>g7FgFG_xm)RRP3VoZADI*T~Q_D6dTVkWo_z8;BHD)*%`aQO;mb`k1yGW zDED{@IfBBt>oh~LMkj>6+jp}_FNkD^Y>Q$Ulqo9PNAPFjPwdKWnMF}fGhxl^-zsyS)m8Sp1VpE%kmkwT+A z>O;pqI{6xyHUK>Xs?c!s$KI{6nucsyJsq@bBJKUQop9f~AqqC-F>{|g$k2zpGBZBp zmUm{x0MfxR8z2YvrK>foVsP%znN&ArSCESxPJ6Ftiq-a#-dp5lI%XBKb99GN8{28) zG4{gROdAO5p+-b`Q)ew+gpu%R56?R_MJD+5Kzy|KDQ|R|X~Y}xI^!&)rg3UQQzHI! z`yF3+WRh5?dYxzgm@0J@g~#%tIvohFlD$sun%$L~e^M580eb^h?bSuTTNabFtS@_@ z^l!7Sc72Q>Nxb6cDf*D$^JnG6Dzsro2e+*d~-)PWvMBW!#%Wlfkzo>kD15o2#}}`M9DeV1HDf>-BoN zzI?=WXhH2^gUV2Mo;@VBshG^U`JR?u(pgXe$rV| z(b%f&)R5+Zd|}0RJ+Ymi6s6~~D%y!kuF(~fv|K=aG+eK%u6Vt_g%|BYN0(B-UnM*A zuqQSl>xAdipnSWP7XuZ4)Ki|q$+SKz%Iu$H%V~qFE8Gp!4{$rr>W)A+p6TSIEOG!N z7=TU%eSz@CNV*GZ^l=Yz1R1yQx{#jV(&?M6rq2+$Hhe)lj0im32E|AjCmXmPQOSbw z<}=}QbGnEtYhk=Rxy;7wns!81pm(=rALbwWG6rG(#h?XP?vHdBn3!-hn{q7YMi?(Q zpfw^DYwTj`&0!M^TmP(z0cQ>tLhdP!t-2^M^UpD8Jv-*9X`U2Xv~zTYR!t6PQF5p2 zte&_y1CavV9xjbjMledm4^cLAWSMX*(vPT>9i20)Qmr=l&)VdVI8_~%T~|doSWSc} z!mlj({XBKG@2*T{sfcF%M_#$IyV>cTjFP&oOomsTi1&m#HsG9ac1|O~%-TZIVlgT% zgpF>1r_%;Mp4M#graDHEB!91qmUUvZ?052XR| z4n%G**_OAK2M9tBWV)v z_=X@)G+fX=;_U82vC3KHh{(oCn0*~53BuZ(l`t1|pLN+QZrP6`{dB}!6F27j^H{;) z5gZz3_%+`SoTAAEEyJr5KoNB}D<1~M+=~rsUwX?ZEJqIsFTyQNw203TuEG0W#DA@k zr3d^1l`mW1P41rq3i{PJIYoM>yKcSNnBgN8aFKEZYn9nFA8vAppy2G>95cx6xAk%4 zBAfXo!P_t-nlO&lns=mA_7c{{hP{Pt|DTyM80BJ#cisgy;@r6Ot!WHgoK0G&L0{fd zBfPeB)qGHw>EG$ztT?>d-K(O=N0*Mq0@VxBMIg&X1K<(`q|=k0*c?I-r?5*PSQfIt zyvP^ShiZTdszBjh+vQcH5!lSr+U+cIonBDnyB@xgW?^DO{(tor0FgBAG`byA8&8u7 zmtG7pt2KE-H2gGyL<;Oa%gem3hLq_;3X^6ZXo8vVqG16`tv7C2$C!J|cw+4I!GYf# zCyfic*j50Zq;bDGhZA(h98|$62_c*5I(AZo>%*q0{syRn_g+MlAl&Q&UpG6#KeZzh z!<%4O())vCgfu6i4uZH}dK$W7`41gtMAM5sS2K<9VWEbL_bX!E>gNyZ=4-Z_+uh>* zO2^+@&VJaC0Dx;Q4HfTK!X#9@H={D-03A_7O(r%C74N?kv3QQi;sz7oni2JcT>Bs+ z-GbNaZ@%$(XAiA^alWSgMHp|29J}61rZeYRFLbBrn#?BkrU$Wet_Hf)6MG4SN1-Z^ z8z1nnM6*C>Aay|pteEBl!ck~Dr#+fbPrxjJrcr4at&7RRC_PU{%CgbX=Pq+1w>>#; zQ7{QEO8eeNnZrOcg)0cvaOrqM^t%kzEKuaCkLl^II%-w}pCjoc!zm;g!Jv2qB$o*I zBuG99TQG?{sn#tfX~LQ0qK0+Lf1U$WYcdk!v_30_7W|ci0yXotJ)iyOUj%lm z0ZMDd2YTW@lZ~2iFgaL;ATG!^)Tls7RoVlRUil4WliEPGO%;@);R?}-OvXFkc8?T{hO0S~d zdSC%{_(i4HU5*)pFW8{4P^j;6@rNk{5Zmjo4>1Ra!0tQ6<#YH__#pW&MG#U;Z4KN%~@J{vAD~fYCuINS+e$Zh|yE^2QWzJfEy?IG#Sa=aZ->ZVxk$OpM*R%F@yzmqcn=UNayBT~kwz|(e6jG*NP!N60)E2K`{C)dj)qJ`gY@b$3jsWFA4 zGAyq-QmZ*74148nSHYBn6db*tFply-rj<oOluDo$nfa9@eN~?57XLT552cxTK|+@su@2`>!)^@kSriK zn(sxbTl$j)c6S|*(z|Wm2=J7^usWW9d0-^mSG$K?YomAQj@1fhx@*1lKceTqO%A{W zIAp0;l&*v~)b>YU&D6WD;NU%1ozU?nSI&<21Z{by?x{#NxH1)CZE=n*@?@Mg9bC`- zW*jEJZ8!LyvV@a{MHiR6zL9R^bbS`rmb21|NQ13wv1ij*NYHCtn-81zB1PwCw_a1a z437c6VkviGK^rPwgXgK#v4sTWABg7yF0Jb85TbY1t)3d`RmC`Mx6=<iL- zry=YF<+2Uea0GGCig&PPsPGM43Z2{dAf!ulWi`qR1eN-{z--MvC*JF2)u_7sQ?@Uh zDxxA)?T}gZwj(yo=vT#|`nRNr>!#_bWcVrX)lKLol(yq5wcLo<=C@3<@N3NNEbw^-2mkqy^MoXWUds^#dARw_0G_wXN>KJ20?)I-$sm+) zuaj_Jj{zSi1p5pfbJq}_)rA#W5te?BwKJEc&rEN(^70NjSe6tp2R27VWHhlZ-NnoUB~^ zF^P%Fp0V@lKxNRtC{(LHqR_Keq(j;QoJPVC)TAhsgq#t+(7J3I(J}()|0}G@1^MI5 zSP2`?Ur+a{T}ln!o^agckk#b_1ZGfHV{+li#c+yyA+o`4lr?}b7FGq#l{VG=cH7M& zvrxhS|H5!vi`&4{D!f39wf7CTWSLZ8? zx^5*)h}!QohTp+{x31=){qEo0uQll?uIVsfJ+JSx9DpS`>;_!CAQuE!`Kaz|FmC9( z0h9P7Bi5JK4xXwN-Oq6PQk3)Is+JC&+!qkkEU#XWf-fOIMDXvtNXj9GmM3*~3^OPr z%-<}lc(tG)tZ#@0qXw(t7!i>XKi0;F>I$0WB25NoLLxwRqI1EeN`4pRH!b>-QM*WM zC^hip@>w#@MwiS@hgy*BCo9lK6Wex*eomNSnFB8WHi~ex#L!f9D#DJP*tArgL zM}NwR%z6k2H`uRlz7Zc~7cF!xt49jyS1vjq$soxlL=C(G!ByJSa!B>x*>faZqEf{o z3d{YpZd-lhy>_N}pIX+F%+e9#8w&jkf4-LthpHI+p6!%> zP*n%)<{*OHVH#0gb2x4^9f~91Gn85b>0o*icp3o1C&HbvwN7`R64@Aca7VR33PX4D8m_S&E+0 zp*DQ)Y00f3Bef2F-q|&)y5-0woRbCm7_=hto=@meaOeL9y>h#tdiNkAC%7^BDNDa$nzl*p|EFQixs$>-Nf+;B^&8#vSzz79`c zdU%Xw_Y~VDsh^c9Y7~NPMise}G$MxG~Sedm+ejm9_T(Y@-Y7^2q@vDl) zPi6VW@npKCI}7RgKIhJILJ_M{TR889h3OX~*A*)9FL7OAirL>f(ciwA*IP>Q_w`Eh z^-A*fO7ite;$2B9Wy+cBN+Q|$uYD!?9Epn$=voq2kpEv_;^N=`?IkYX{`K!DaXkTA z2Z76{caxer zL9?5KgKs>}LcIgSor>5YY5OJAob0UY7(gI17RG# z3t`pYP#O&c%{oolMoey#m5&Tsxw7qPOR7l#juMPCR1MQIJ5QCMqYKlR=5QX^!ur6L zF0#>Z0Ooo50b)wPMO+_hl{x1Gv4J#gR%hVjjaM$nlZXM5lVpG{8AMR-CuBpfAeG_; zUEZi5G(xE*HN|4miDUqQ>h<6ZvSj)DF0_Z#Gl#Zm+-$H#saw|M9GP53v3g2upfMF? z*jj5WxvWd7w}(rXe}SIE3e$$k77$=QM`LZ?t0tqYZnsujox>$X%o2?fqZN1TCL~em zhYXv=EpPJVu-wzKzx{h3O&f%UJg0W0hTfU2WD)mz|cGtP2|_#B9A znC3N@nM+BYLnA#nT9*JjkMsszGW*)`x=-F($#IoJQkM^ttn`vKspFJS+oYW4Y1`*I zYCiQDywR&a{G3#0fk}jvh!QCSr{~+sXsF5}84i-F7JaJT$F#X;Nri6WmnmSMrt(;Y zyslX}R=!EU!n{&j)DwBknjX3{?5mvG7)?OcL&Vq9Wj@MMUAcUl^{UuP>a>>^7wwK@ z^UgGm3*_qgrA|y~pm1?sf2CL{(`|v$&X%J~7|%GF zi2wV4{y*uvJwj-MI;|oeWSe3#f-K51tYl2#$>bm=H-(H=0EqbL>dD^k%WgSxECF$Z z++8Sg1XjQ}eaW^gI0~H<4~nu)G6#5pT64v_3P|)!*_A*3*C@;1$NA`0PY+OTVO!5R zt&0-?O=m>65O3{!hxe!P%2!@cy(crup!Bp4C4i1{u~KrjT9UNiO+wnhb-lCD2j$H8?CLHE4zO z`!sKC-FfY{ZoLk)o>kA1IvMTPNm)-PFfctS;9I;~X6H$rK1~K^sf0}RfiU=!y_ERF zKH_}%5%#a2J>L6%>+#RA2>YFf|NZB`{kOcbE;5UpG!R$_Et?&=-oj!PK&9T zgVVH*)%3^qa`XFV-#vZtJl6MXq6;ui{;Q1b>sGqmt<*p(Ut*{I8-vk!=l|^<{rETI z{9jsGanJvU%a0#^J^#PN-z@x>#Uscw@G%-H|mEj|9; zmH!{FtbE=7U*eDL|IPdo4nb)JM`J|dJ$SS1Kf?5qJ4L=dp469=)&QQo!hq~#B-^!f zh@0l^=WmvyZ&tiFO3sMB2(+eOMVmwGedEh`v-FxZtwf3E`AK1(X4S6eNZ>xBnf9Kp zSWnexf)AY*%*aEJwa-HEMYt(BT6l$NZu~*<$GoqB=eh&v5S`S4)|@xI!SE~H=0E)_ z#jNX4{7n10QNC`Jf8&kvRZ9CG^ykZec;~&uf^K>(~&|4-rV2cJ~%qq+uYfIw!L@sa{J)tS6lO_x*&D188OlsgEWF+&#yVQzy2Y*Zk5Jj>D%){qG+ zrO)JUQlFU~v-fPe!%ue+-W=X3OKaead688$FXGR^oLW0uN2lI=)sg@E=*Yjan|}dz zb92r7|3Gf^JCv+F`LDj5q_?X5o2~zU{GBKNefQm?ukzoQ`1`d_FxpZ2Ck4d*I_KLL zKEFO=WWOUm5ZV9d%eTk^X6^r_hbx}`|It_fpD*(FyCKA{f4|9}xBsVgHu|#X|MDX* z|I63&|4aRG``^~q^MmJawvRUV_BQ`=^nB;ptD|Snw_j}GCCqsXd7WNt@BDP|GroP2 zRO#b~+vvtK+)Gc>4|J{Cd$YZF^y-(L?Jc*xL6M)QWqnW_6z|iVl8txK(MaZ{f*;}R zf9ef8U{yxa&3vd50?I;edgX2`WevWVj*rvwpx8bH6ynX=m^8Nj?+OgPRZ6u$$qfHcnWclMGb9@ z(&Rjq0d@t3wxb>{r)W^@zRD{Dmo^!cWz9yJLi`V5mlAj;kB}>;5~!SiqdF_5BZzL# zYEdRQNVc!z`)O(WSG> zFdGW@Nv-w5$tXKLtAjIzVUGE9G@?bG=8%Odyn+py)i(R=s=}T60dfofC_Z8H9ZFWb zc1NG{P3<9mc{fHg@HPXO0<-@;{!h^9@&fP~OrQNV^Z(^X4}JOn`{nPx^8YXKr{sT; z0CBkfA|m+*JZ7m{#V#wS;m!8pp_?Ru#M*Cry+u=h;pxt3`p2iwGZ2ctU1KzT4o!qo z`~rweS0qz-AIv8#3p|AaPHy9_NHznH5f`Q_k|*XJ9#zm6uh2FWnvu>{Bo|QXRYO+y zu1GGeGCVJP7x%56SFElfAiE+d-IrOBo40k~?K2C{rYn*yzHY@R8(elp^1)hkW%W>1 ze#TWr;hU0i5OeK{kUSvE?=ILY#wV0TbTLWHHXWRNOMoFS+SJ7`L65;Bg07(B%A zd76qf>*d5JGKt0{!_F~N4{|=33INA&KBn-3da|^tBqcaG|0KMz;C?o#d}2n$X*Q5e zESd;)3E@GFt+L7;ud{&+MI`H5`@3@Xr|P{R8ZW1qU8X39X}KolT!c}wcKSt@SCL`Q zn|a8=@5rh+{*s;%Z|h+mA#Z!ZNII(;6v&>WX-;fcQlK>~LMx$uOKL~ZlW}CM4h@9? zURh!v4KG2LS*JC_wPi!E_g*M)2>Fh{Llk?qkSe^dd6WFJVbcICaf0}Xb$My74va$^ z#%!$s5tO?MvreUM;6&<}`$d?~$qUDi-V&1LE0l^P%j*KXW6EMu!mWz#jB0f?3NTOl z99`6zpuZF(>d!L&Bpd*Yp-~l+$Es4HrPdrbMV~sbu&a*f+i5;D_#}ce&Y-S*`pI%i zY=zkIK(II>MOBeWJ56iqpjZ&ktQ`+%7U!v)5m13lG0z!5EQ$6YsnUfkui%sgXQ7VM z>~S#!+!hs)V0IF|017@|wsUR;SW94!5LAja>!+zBI}Viu+SY?x6$me-Nf>hqQA$7} zR`JQCc1B$c0J|jAt_POVZsTuIZ(_1~OkO zzKh*mJBQV{sv9dP+DrB?znTQk$fu zjzxI#f@tpW(~%2h?w(m)aZ~)+{)cR=kuCiFkMwqu;MTwtHbXRQv z%Dsq(6UidE=yQKe)pp+{F0$|u!k%?WlM9cn_31}{6^r$ywr62)dw=)U&i-~^HO828 zb^?HX72U%%7Nt|2+?e};KYJhU&)iYgU-)M)p`3HZs1K~f?vmtkYyR@yit z)44>pQ&OG+W*LdqDGdO6UkBRh>5X8CEPOYFYVmyt3&NPu0#+SOKB1S8#K@Jt?lIapdQ>;PW7w_Nq z&dZ+aVrch31&ciw(;7^>J+muG+Ld*o@m>DNG-JkPn1ya8u)`QZY)LW<928x~@mE#( z1=kiL+PI4D0U{Q~pBLPR9n*@dzII!ob7T!+Ce;Dq9}RYXFQr$&-g{@T_~hT2uGY-T zT5~JbMT?HUVM}~c|2~rW&)|uit0P6#_%JW>w8ib2y7jP`Cj4>s+$A^pDy#zzza%3J zw{tnVN6TpXZ}jKce>s%$Eg6BE?Z4lxJX&`BzaM}9-PicvFY>4Dzd^h1bKfW|Eqrg_ z%^Q_$O>Vn@8MrHU;Gy!|6Mr-|ML*q2SNsWHvnQGtT+bTFvkag$OBwZ^E2C587y(%g z8dcB?7`agyBcMsm6__X^y`V=u*wFWJW7c|Ro`j@ zqGkL<`|u~(H%z&Ptx(At#!H|2 z^b>r%kxdln*%K#sUaVUd5&Rl+KW`UqF!x>(rRFc(%G`T<@W-{#CSgW)Pj#d8py(>` zGRc!urUsQ+Yf8(Jg(sk=8>dm_#H`=EHxcu9Q+AiNa1}R0kt*P2mbYKKsZ;H@p#-F% z=2<4NK=aYJp=?`GBY71}c%&C{FfB`1CY}gU+Xr@3E*5k(C4_xgEO5ER7EaT8pOP1) zLj;u13z18!DmhMEqFI@Ifg=}lmhojj%TGrp#S!R2+#E2?>630Lfzr)WDCvuyYOZb4 z0m={&%ReTMU3^CTzoQuhM7shedl^~Gibs7qE>R#skqxznnk zt?&3Fc%SvQ*I3-WUFDCs%5U!e8tbebP+E$$5Z@Tjh(_jbuBGwmC}Rq|=}vc|H;onM z{+(>dzyc`)z%H@Ebx;E&^l9lDB8tFVCPQVo9mDL$?wKAO`7bkMRc zRISBb5iVhp!|^|#MOVXLJ`8Np_G_?=K?Z;sPV2P3If?1f=JNM#^yf!VtiuX#ISH-j z-O*a|ogB~gDd=obr8d|af|gW!P{|AwH|H^sn5YBx{9kOf7?t5z9F2zwO zBv3&UAde`ciAtOnBAw%IXx(IdV<6Ly@^5Y}BMI-XhK6Nwg!w|v3!fg9dWK>7mc?Oc#! z8$P%}ud065>L#QKdyy4s-M1_WY|+Th3M*()yoPW9eZR4EMHa^T!nlq{Yfbkoq@6^4 zzd-P}q2U1{(IkgNBvflDo)zf=u^m@Xrqu}=rAVzeciEiNt|sgIp7Gn_r#M$kn!*ly z_@lZ~W(C#alf-80tu*oVQR{YThjn0QJEXE(p-%A6DsK^neF$B&*O>F{XS@jUhY~_l z9|z&Z?4o{TRS&oR-^|m$CE!?S)-55+KmMdLT>^%~Qz?r^c_wE`Mm5#LxK3~5ts3V| zHOS*1+a7^<8UhM5Fc?0wY)USE;8h(XTyq5aaEQuGKHjty$(9Y zzOkYrDWdbEEeJ{M4_gqB1xE6(z8aCZXJ;+w`KMS5_cRID;t3>6!BRx3-0PT~XhnOd z7^=nRA%JrtnWqxaIJ0`n47SMupemz&4C)!`8rH>otRNAxNC2%VSQ;54NM;V*^=w>s z>iD=F!fOjMkRfb7AQyUGA*Em{oAWZYPur-au!UzWfy?YhE&yeL;xnM#=%)=YJC5ARafkio!k4}+M0<-v&lrFYedTj zXsIWMXG3u$(+mRs;f5`y^SsFhhJP$`E?l`Mm6R$K4FbmC{teUm$AA4dG>FWP8ITEt z*?~{$4AktRR`cqvd3){o%dlE+YY|+dEHQzflj+hL^q_{^S0fZbLc=E_F{QBwr}Jh| zl+9ovn}M#si7tRKqSg1g*bS2IJmd9_2b*=5S)as1|m zn990N&afpI$0kgtkh#dx^&zAJKsq=JdSJWhthvMa;In3vr$k%eGVR)ImO? zon;D#V{!O%S!qLnxke?>#K@ekZ@IMhh$0n+;uQ{Tep*A+r@pqSF>1eEjiK2ahC0n+ zmchMYp^_jlG|xn-*W`3b=1mFn8dFLnR^P5AHZ=;NlZVthAK0VyzBhXWr)B|8I|{|i zSCrk-2mL4!=ULOo%VROlP>EvI6`D$N@Wd_#@uKVSnoN+d$_by&NJPjzP+#B=qK5WC zA(I*e2~%w${Z*K#5|}R7#uIZ4p&K5_z?t4i#JZ%VYTw+VSIrAt(^_823X}F`c{WaJ zx+)c*z}0jpZir-pp(TrTR43qo%V9^Lcu)IElnz(|d2-1TI_oITh%PGQ#YjSyjeW>7 zAD@#nA+gN>2(;+ukSGM_L5YY=NKVKFV09Kx8jkNCif7JPY65dQm59(rhhB$A^OER46=t3?=ea@c_uHqx@1sQ1wDnjilN~)bMdRZ~f=LjEA7LxL)&J%rv%6Bu& zQ0w#;?XN0ETTE5Fn63ERvNRisO0K5a=F=h7I*~OdY5n`np0YXL-3GGYsPoW(7uDpk~o>^xuf( zY-PY!5@IoQ-KVK(xb8kb!w5QB=7^B_IH&8Ec?53q&iUex!vDc%*cWoLwCsySSHDqu zyoJ6nO=c*$DP$sFph%W=hsS1D%p6e7)u4zuv#afBiiFy7T|yps*i~_DWc-<#YxYFD%~I7YIh~kcu-DS7HVK7+h{e04>Y_Nec!Ti5`eMSr0UEd>@R{}7Az}PgeNp1CL0U-(~oM^7GfKB z)u0r)*>XVdr)aTom-{um^11+QCHDbB?snB_6bN42R^?EP!-G z+R)3b&f2O}cpbKb3PkV(;!px@C<3hj0yb!X8L$JZ&dJKCVf^b{R*OTp5WGOgIHD?i zcW{DG39$V5Kl=yI4^9r&I9U(Y)q4Bz)iJ$(_?rK_d$RZan)a==<2S-`UB`wlvt zhmC(zghuN+K($je5F_6|E6I=<3|BIVUvOez`X2_?s3NVHG71Gs6CnVKbnu`80>YsY5S!Q^)(+zA$=;*{%HJ;X2-skCs8-m|UQb#83eYFnNBd4EMKJq$ViGR9C6Y!6pDDD|# zth15t@WBb&@8aL!p*@U#r-1Eu$&lco+iusf_9?9k!TtZ^Uj6ak()zD|^zZ-o?{9D4 z-v2+xKQ~^>j;{PxY}=d5e)OBQcHRE-{{{OWLs^shW6FWf{eO3B`~Cxe|3BFJ`quvU zS^jDJ-_QEC`g57ucWD2C(nwyG#Q;J9Rnj^IK__AW+6VoD0S8F~we}!SzK{^m41nv1 z&VZ>%DVIfHrISBIlw0;dj+25)`U&hU7H0agEDqoqmGayXKM((-OpjTCLLI<;LwqZK z9%jWvR^PzWa^gKV&@;Qm0z(F?)S8}lZsGhmBL~y{F(MFE)7qUN1&Es>E_{ij4-h9< z#o1#eL~Oo}O?9_e@ch^nX3e!v4_@mOA)Go)A(-!Ou`rX=X#YveY}NA{Pg{R!5*B!A z^XvjZjUmZtgrAR0p1~+KaWzOofS2<;hoA@|fqMSUYQ%Y@$YZq|lF52#$faO4EMF~C z3#R<$t{4DlLe1qTbwNyc0_hvGhMdKPzklp>x!TQ_i!wb81B3sQH+Q34Pp`bW8)10& z>y>A>4VcZl&khIMD$CEG<+j?*wE(yFbUqciEY6y9xINv&wT7tIyevd5;W~mbtPnKP z7i%(`-TnIOoj=|G`rh_hU#!(-o)pPWDlZG!toiXI5jt!$9S$ZF*g`G`1a4!8O54k* zv~8&Lx&U5Q*$ZZ~@cPOOxAdF4f@nshS~~h2#iIa;@ngumt4!)AZ(2(x_2{8DAY}o4 zR!mA~RIhOJbN=HT>dH6_M^Om%xXNY}gcgq2-JGQT+H*Y#jJ&%Sf_uS-jS~@EN9m z4ML%*ve_E%30U^sV$l~CW7ct=e7qCs&SjvESFF|Ucng;1@lKSU4#irUxW4H;;-K-d z>BQe`nN|GdaB}hYB6AF1)WC+e#0jNUD36R3jwEopN3lA0DcGF~s8Bu%6kRe^5joJ* z$yhZ8*dVJZ?Doywc3G)Xzyooq^S^^9)8yUmw4B=(=inVRm6hbM)3_@v-F>PRV0g2f zH?w);%CuMxv>|Z~|G@4p>Y7*-qUABpQi>l`+X^DCUCe!ms9RCoeW1wW6}nxDFJvhm>C5JF-O7>GcRjItyP{vniYi8KZn>1+>D)-4iEMrw2woOCi4n9mle2-iF zOobt?>aSTQ8dtvc#5SBBO)H|@_2=rxVD+-a2Q$h91;Y8Bf4V5`t-ehd_oIEhGuZF=#CSYdv3YYR{IGnonAM|yW! zG=2la@3I<1TxA{X|6W#u?ayR2=-8s|hr)KmYVetSKi;K3usg&(bAfX6IfpEMH4mNm zHNAA=i}KWoU&C7`Rh>l!jw{L8r`VDiNw)$u;dyiIDvI2f6SN+Zo#aqVv6pXj>MK)c2iA`HC zurZV6_NOpee$egIyDF}%@88}jZ|{`1cginSVY$6iA{mfzfB&oP?u*-%Cz7;?1yY=J zywt5(;nu8hYgX`#a5r{Ji(kbA5xW;H_bj_Y;CH>8AK~((?gx+mC)jyb2~E1?voDj+ ze*X$gdr(ZfmBOvqO~p~r%f2Y*Sojmrlg<&XPn?#f=4LckJu;5g zJlETdsoRXH+q9nBjHxe!w2%6?5qq~0d%v~e8|;Ue2Cz!R-m-YT_tGM2k!Bz>pxjcU z8z~D1QVa`#PA1tnBaG9krW&Bj;`f}RcHi!Yw2L*XleNBxC>yuAf$@%Ra|3U41An)< zF1JhZ#Vo~bZs6~2MQ?Kh|7R{~^wxBnL~$GNavSh+8}M=)@N%0(aU1RM<@oh}=hM4Q zqPR_>_E{jh~C-?#BFlS|KydwO^&%W7u}kRZj)nflNNsMq=nz=L3*1U^V{OH-@gJA zGe0Tw(URmC-}v-~iq&BuZQqc^)eU>f=Ctk=&Bg+UTqK+RzbRGqJGYkjF0AT2Z=8aO z^?W>*buH>9Y35Wi5phAlN(BbEc%^JGTlod0d)WJq;;nT!c8-&YJcM_Ta15~Q-|+Lk zKhqnL1IF2$SLIa=_B9;od((yAzz3<{A->5yfsP41iELuk7Zj5u%j-CuRI^J-)mDBU zC??M4Nkx?_1EkU$amDytjxXG)S91xoY4mFu5FLjdp+sbcS-o^_y5Y7-wy(Ec^Xkjr z0yx?a+y>ajDqF!J&F9(<*y*R(5-p^QytLZZAnJU^?V%{M!WL@8W zyMzb&z8i!;@7x<6Ek60S;Ql`9j%X#5`+UhhP?Y!_Tfk7Ei~C#Wx0-Af<1xp8WnzX8h^bmHWBL zj8|V@et$JV^eLBDcd?oTT4ho7t1Hg#6E3ChV#V35uz>p2hhKdq-_6RZ5x)qua4 z`)*C{zF(c)|6$wx9A0oMnfJxZvN(X^^2)|&RkG)o-4XhSzZyxjPK*Dts>>38eLHx4 zJNCMgWx;i|>t$;!ex0F~54OV(x`u;WFM4%Y_E9*rsa;C5`OU2l1W+?`JykLS&g{6^B9|vO_R$b zt^(8-ht})ra&;{xRXG)RhQm#8O6(zi@?h^}KL5+!vurs1TYcxDIbf4>XkvHL$ch^O zzAP{LB9Z#%H?qnm3;y{Getse+WhI^0Q}et1{vQ0iS59YHF4LoO-pIa4{-l1)Wg}B+ z1}4xKNdk`!l#k$zzNsGJ)xR$e;Q7;JoaI@QG-b7y%#u_1V}aM(zIf`tfV1z5pZ(v< zVv?Qp#jf|eA}u%f#Cy!%5q|nTJpKOUh5As}hVBYEGx>cUW&( zHvo$*-!*-4VII(+o|NgLFH-;KXGPsqb5y+Qz8I^=Csk6^u*$l@B!g$K3L^Q_B+KWO zTEM^2BV4>prp!}&NimkWO!=jW_0q!m{t_8+_upR}ygYe(bnvgQpB)|Szunv2`~KkV z-m8}4IQa!Z^KfFrvTzzn6{dQQD zmstw!Q}eV04k660ng*}XTA4SB;EiLlM44AAex;G)My9;BM67>kRK7;+EUjI+;mwAPhWX_!Fr)CfFqf9@lRai`H@%J zJiBL}p}6jgD_nlXlvZ}Haj)4UC`SC?I`yMgjs{O2z z<0iY5eeoI|y)I@+=C}6%opTTwE4RAt(-+{QkO+v{D*#Tp+EkE`OPQc zTl2^xSAtB4*UM*LVrtE`gb z???GQk<|;?oR=wv`@fVhQ8~>TF^asiBi2$mN#=R8HUir-T=1c)Aha0^_CMbL>)ZW< zr@OD8pS;~YK0Y{kdvdh<^7!e&(c2dXC*Qx?7vGu|wM}9#FKd~KS~gHKlWS~VF{{k>|ei>x} z^eoKGr^JE@a}kjp-?0lrs%3ZuOar|4kN^FD#E3o_^4ji(eT|0nh20%|*_+M!>_J2ukOxf`9e)Q zbwxon&t(nvM-V_Gj4B%Kz()fCcDNY|r{n#U-C}oHEs7GPB1(tsXFT#oeUwtv`_P)zNYo`4o*9XBvQyx z*O4!WFA1Z+7c@oAX7HOkEe{OL@f;wjH;4j1dncvss?CMRLHy zg*Cq)vPvF6YdwxuZiyl5>rsC!u3qm5?99ON&a5Wj1R-Xw>s+l8j|g)tKOxEA7}8c*5)9Ux7}SS29T# zM5PSEl~8&s`A_|&f^-EO0ynCC)rXaw$f^dJFqZjdB`5PDRVoUOXjVxOSq}yK*k#Hu z_gSTctV}s8>#TtWD>*JNWwj8KWZcvuE0jPSidT@@d6m^t$nkk8sa6(^ZJ;L0Eh+kV zY(*WLD~XXKs2;E+>AaK=sg3JCc!iQ;VYN;}VV&6NL>qYg;S!@ic}378IxDyU6dUZYIrY3(Wl!H~cgN2=c7=-~M9)yv}p zu_<2c9qL0+zdMyp(ud8iV>mna7vH}Qlg7F#_xwfP@hpYn@8Yt|Qa1^xh0;2@mMHEw zg)z@AB_I1?AnTF-tq@i1y#z-iZ()vgMe2eeYAT5_EeYVU!}$cebeb&0sT7ke$1S=L zBiUt)7`6C6_mUz-$A#_{SZEYcibkR*hi5}E!hq~iUyLXO8~+aul#$B_Kb%X<#Rhhy zsf^+E8m4iXjFX}fJqf->fuc8SWIap95^sL%ZLZWe_#t^GpF*R`mrA2w-w~%}naiZm z0u*#TQ5VUqJ}*&U7;&!nNXVk8GFdD6mJ~~gD5`nkE9c8~YJq1A_?PptaL=nf_{F`2 zhF?8|mU&jto|=_;HeQfTq2(A-vyLq0^Q>-qu2LL%>&KtsA$|ZK zp!8ZiRCFl2Ao`IBTPEXkP3|AFpGIN|nqu8#c`l|PPf1p(X~}o+Cf=K%>5UC$wT+EF z{K4!7f58TTUy$uKHgGeH&y(Uz3N#$xMsnKL9(H0qXusz%o#LS(G)?-e>YB3$?7oBi z02l|5A60Q^|El73JY86^{@6MlX*}?=Br8NAufWt%Kctb8_5wesV*!prdq&U$lJiuG zc|ns;MK6_dHjw{0Px5uslcUeWFlh?(ETRmKXl-FOv#M;$ahZdVhHF^51Ea_)9@dy{ z(L81xPh??xhAZ$LXdJYwBt_M(l0Yg{Fs6PKoNi+vj@2e^k_%bbyOx?~s|64a3s9(I z#a00LmN5{|vr8Ef1*9V-MZnRbZsg3px6t#y$_1(sXIb4y&{fTsV7j976V=P9tn1`V zdgtZKvN;F6Tg5?gunBK(VA!n8LHxH|3hG)`%`VMjH_ywf90ro&zSQ0$vM2WxFE?3v{iH9SQ=jRRwVt1{jn=Vms&oHZ zjLYc^Z=%V#Dj~?)sQ134AX_H}+qkXlfx%U+__u85@|@Uf9L0_1D>OqSNJsper-T1b zhoLfi$qN4uaEnfi&taf0d!*Bo@zR`HhRK<=10~40k+25j z-%70h+*^ANN1&~wjbS_RP(Xr$1gv-!vKlY%9SToK_g-9q50rCzjRJ|r%3Z<6$x8IH0_01E^K43y6@yt0 z*M5|xW#P0Ih#V3xZAYl#V4JORu2v%?T3GTprU+d6FXH4(EXHAluv0FDi~m}wQavJ0 z7lZU^(*7&&bxaz94%F26xOAXpsMi$X!}%xRa2^UBP+4Lz{+H9 zme)Cqs>EvW=BpZ;&+_H{Nb71u>uQGW4_;H_MC(JRoof4$YsNcVd z>g2!NeGlj_+fDup-m>(UOV57HR@3h^-1Q@7^Vn~S`b(@E{SIy5_ZX4;dH)6Rzrg7A zM-Bg7692ok{ouiUKmPZ@*4^9q-_P;S#0FtVFM8yul0`I>_w+vfX59CEar(9Y+X>vo zRtRi8y%$EXQk>Oay$4$GePDF!DMo8P&5G2U1IDC%CmZ+Y+6qgx!mjja;K;1|;sw0+ zqAVm(XiNWrdA3zwyo6tLs!wYy=*=RqBT>?Qak?G;s%d(9H+-n#b(81eGf2)zBJrt9 zqE?f?MxH`j?P1`_Us@jF5RNG5G#f)C$a76&-2p zzni=@L7U`jQx9$!Px>E0484k~{!8%0V(6~m`;`Jp|6tys@6`CCk*5DTY)6Ii)ZRFe zqCBGZ@X=*4qN~MoeoXn_a{gc5{fH{SlJkG--n~D1=l_Gd+uOJ2|L6E;&i}R(piP{2 z3+i?hRpU(fYby!y&epV-_)CE4*$16FAd@p(oJ zYt-pUxlhfK8Kze#6vK5B@Tm(dR5e2NOkp+EFtP&4Kgo&=5*CZH7!>j>0jrQVV#+w+ zIt;NXaqdP^h>}qSL@pCty|m2pq!M*@RtzcX5e=WB$;KDp&zw&t**jT_fBe^fgOO2r z>2T$c`L1>B)M9#C=GvV?B=iiZG(lP$XR=L6O$N9^V+bjdshQCHlt1Yer5OET1eD>? zw!|)(vGP)2&z3T!hgtjCtATNj?_WqoEkB-5q|tC0-xzpRA3L73t|i>&e;( zz1>ABPGL;cOfAlnO9?9~hvK_@E>oTWB%R==)aE)m(komMnJQA!B*YBvSGBl+AS*B; zqrn#53rRH;1hTBYNh+i>J*4nc%wd5o%j+BE;p>MY&CasMgs>Ap!gxl)2!)Lul!EPE^6+21=c=*+|m-5A5zraxH`cS>!^S`trH~5!z z@$DlM+Ud4B$qE8{k@b_sOZDM5Cy#p5WVRz-Bs1+4vj6`CiXBAzao=*|b;GW8pSx-p zt9ITRu3``7#O ziYBDJNM;~BlNlx$QrD1?f#F=HwOH`ciE%hKC6X~3afDlx|571hB7uO(x(W87O^a+I zCLl}thIXP<`2&$;L>Pf(U3s#g;qMly!%%wO?#ep5=RFtJ9nX`bmJjY96yq|5d+nKg z2M*4&gLgB_4-F5Ehyenf;%8j-$`hlou1t9IKDc?Y5A$_ES8i0j*d@^FWFqaM_n_By z9cN#vDR3V=GDs7~AQw24s_ZO-^K{9iqNC(Frr1v!%#43Gx~_PA@^tVg(^cmbY4l5{ zC}#rWakFM&1u#(zcO?JvD^;p25d{n*&wiGv_{;IDmqVp0Q9?8@3b=TS#*K@z$WxyF z?Jhd}t6F1);w=P&+1wYmF?b6inOolUA<;NE0kuPjI?fj~&p6rOjRSbxgF$KRvp#lh zL!tTc`+KFVP+esG3=_zp^3ou=f*v3~Dl5)54Gne>N&#LGGjLSb7$7u1!(gVl@lao# zXAophI&nQt;0BV_;;Kq!Gs?C|1PISu4kU+HP^&d?CL|MK3^v4PiBbipNhO}lAX1&h zMiJa7hcF?VGb*Sd6a7TtOKCZtL#H&9HKUeNs~~boIa^yF3W8;=X@*MRVFDb*v0^yi zI4MBMnk7|}jk6gfee?h{y>Dm2@Upg{k-pJbdAKgYmZJA4a{&kH=JNpKWO^j0(#~z6 z+=vM8H02)B7TkkabSnhVzDvLgaPm^JECK~`{Dfm}knhI%yv{D=j=r$q2X|`brE!URbAh@u zH4d;DqQ?zSU^|0Cn9gTd*h}IvjPPruPyM>c{&Oxz>wQMpl{~&XHRjIQxVNfuBF53f zGnIaUK!^2wCMyn&g=Ufz6xIx`KuCz8I3AacacTcTGdpk1Pv;VXJO#je+*I2s2> zZw`*$zWU+i!T$TxcQ2Vy`scWuo}ygAl+aY%ISjIveja}?CV2;fl%iO zT)ZK(Qx>T##tY;h&7ExKhiI#k_AzEqp`GM(p5>{m2A~ANMtrgRZ*TXWKZ6)LSmbAW zfOfTia6A(KjEo1*dG+1r>mI9t-59@6y<6P6Sy$styJvDd4j~5uvm!Yo>H-qU;6}bE z#^MwOH>~3ddme`Q{NUwxC*Q|-()p7v;=q;`NNX!U^*eg%M-={k>t0b|h5FXfk6IG? zM(OIe+*JF^FFyU~{kk8&%lG3ZyS`=S>Iat4exOtLgNsBzR03{;_*;V(~4T4`YS3d_xHRI!)e@#8Pnr?nkENvi+-5 zCE0#pDj3_pmh)ydZ&Z=)&LU)yf@4dHfkkSLbw{qF$vzHDt?3u5Ywea?_bS#$mjhC@ zucI}vmUOlH@~u#8n+M>BV?_J63F~4j_|OV(?mBNBElX#I_tj9m7?UqyC@Ofx>>$bo zv}_`p2PnzU;{-e1&wGS9g5Gaddf~EV)hpj8BOSH~1ySEHIg9%m^y+jEmy2g#wz$#t0lB#smb8QZ{c)MNx( zBzi~l0{(D5Admxw(jliN*?kZ&2hxn|hj4Qb)8)+Fe7J5>Ngc?tlSkrPaYCP_HRJ{Y zSk>$GAAb^$^~H(GlRMwNe)LG}SRb;X@396sVG{lLSJ0g=KM!n<=>3{_$V` zt=bw9+EZ^GAW0}G3jZH226Pb{oykV?aBqDC5JZ4Mg8oeewL$Z9*_^93bvo3!Oj7WT zqZhqQ7kGP^Pw@a6iWhwENCZOU0K)-cAak=QRa<9h>tZv|_S?Jn|M>R)pYFYVaQ}~@ zxBdU$15+(TuAKrsw(k%BB+_JohB*41W6aUJ^5?C$pf2?Oyd{`o`aSjfE4awbvWkof zBdci!Mk|%@y5r~kq8S4> zhH4Tc5XKrE$pyJm6WSzcMIF9?+L5*}v3QA%paOvHz*9Y@39FS;j@^kJ6s=7%il1gl zbMBM!1g$chF2|e3+%&lX_)zqi2Mq_}|0$Lm^;MI0s6f6Dqf-Qh1&bZB`!vA_B#M1f z6X2eKSHbL)0M1#XN$I>a6p&n1t2h`$as+sgqD1PTghE>)(PX;b7pL>aFg?r_jdj?E z>bahe5h8u`3qy-Cc;Jp$dm@ucR$@3Du8HfBxUv=*({uY^N*_xw{$3%fsP@K*I?H9z zfT5!*XEZzo(x6twUyy&1?-F1d&6=YTcuwe#F>W&$;P*t69g(0Npof09U(|bo4FHOA z--=*bBc9eDe!*yf>yfJ6ik}mi#4n68x1(C>GZWiCC=SrSSuI^#({Ok`n91WEp2T5Q zPP1BCb=YYP;rYn6GrM3bjBS+{)tFa!m)Lj7i%>56T7xg>bHk5Nu)rqw5=c@9^CgJ{ zc51)@FaU=i!pG$07~F%Vh1v^l2mt7r2Q1M+nyH0M$OyI`W`WCuEl6r0EmSj5tPY!w ze{|$xN0FSde$t;Cr#CmFd@hv0Fjk^nA>LR_#D`+H{@Pzza|J{wWlYqaOlaW;3uG`dl3lf`JHUcrqtB9piq#)@tDLRH(W~V39rJ$U&{`&5aFlD64@|B$S5ai#Hm2lII8o;Ap)=MPJ>E z)_T0lC?Ua{_uhs_MZi9L_zDIV$g4IA6mXn_@(sD{N$?H+3- zSLrCL9<}&*C%iqZ2NSpz(zinT_b#OMZSP1Dq8Ba)xR(mJ(j++sN0pNa=*aiC{|uo8 zPz(S7=+XXD2V3_u$@w;E(|#FCgoX!?-MTcxH0PSPfHh0ji@Tau@xQdM)&N)w*A4$q z4ITo6JsRy6>aGLUp(Mjg5C%SU-zj+_NLy_@Xi?%J-1Xdw7z=gzb9HZ7rcHY^KbjXN zXem5&l(7Q>WEdk+hn}cYE0swK7;Kskk?vG6D8=xLB-eLe46i~P&1fQ<@%c!F5~x;0 zk^_1?7*_Q4Ozqb}U`2_qzp-2lf-q0>4B}2jZ{_u7)Uvs1RFMYEP4DD*-bf<{)nx9} zV)wMHnqwqFz&chlNKeS%)h{tbRg0a);FW5^$vm0W2Ah^`B$(}E@s`p9V61G*=5_<# z_+I8SCkaUh@HHid7Y@MZ%At>X^_9N$Bs+Vi5**Ns35h`Pl_39n%hH|xjp=KL6mkkw zgnVWgUiK45A5kk&3N+au_`<)CpYmGg&l1R$d$4sZ&`+CW>)3*6ieAiWBD8>j*) z3PF2B84%Qvh1M9LtyAoU3z)smO(I%Yv_%3>i#O<$X#h~O>I@*ps0aE}bwJS9)G|S_ zZ;qh?jp_yu90m41P^ZAy0yn+c7o*axrv~P(jSx1Ek6-wp6;W>; z!rWxEs!ey59N**QFxZq59uil=D?`3g%w7Pso>FkWZ7Ojqv2}QIEy-dKugBR8j*}q-FpETNY!KM;hKic(jn<&r zQV93Wbhkr~2q&0&0FZNqJ1){W8tIoHbw5N2#W>>}1Pj-{jSY>by|F>eqI#)ITRGzh zuS!zHAVj04C@V3r^)zd$q(YFlO4hY&s*X62G3RZE;7FFZ!d*wRXYF3<1iQAl2)tX! zKg*!uO}rvmj42M)4g(_%pD`)F(k5aR1o}+*%w(F;i87kSI~!`qT3U_7K$UH5XlP6b z(o?>Pn;@G(WfBG5-4`0R8(lyYBO9Q0<2W==JdDBH!>PwuJh~DRdjbCY?`-d6> z5IzT(U<5rrom=8WH3}ZWX?ba34a2)b1sLiV=fSbH!yvbSAj4OB&d@Y(Dhu;F(R;>@kNtIkeO)g*)s?SO?3)DlWV3>WSG6fK=?9fQ1 zPNpaBfTDqbD{nUfh1^wh3eY=MUB$N^8j|?`lyT$JRz~wyPreTAGG2szi5HU?~fGXj!IM7ydGtfU>R{uAqeTwtCx~ zSMmxqZuJY*qcUpwTQVQKMJX)PwScc$k;0ZxC&9F|rK5F^HoY=TVI<>mlQeT*E7WcP z25~2_za8_t#RwQ6wQOEoQ1^3;-yTb(5W3oSEestksP@p|Nxx*%N@|F81Tc>d(D+Dq zH9Gv=Qg$fL6(R*2#%5Ltt~0QP(z(wmZ>I~T;)WG^hh#PEEJb#Wt#Pq!8eXl7Z(*Pi zmZK>fOy^cPJQ(SO=TwcuM8&eD{MCq%M=X5lT7qQ<(^Bx1gR~n^9Q_JkElOd0BI+o? zhdp*CwXhp=W~)J-t9w1tBH{^7%^bqwThY^Mn{ysGffZaLj6pa+9)OZJ*Ze~}!ifp>fvq_3-&s?xmYMHFb2hCoFU#IM3AM`(hX^yxhFyhhZGj>8kWI&o!Xh^{z4b>$R zX@rTlqje1a6M1$4r^Gm!*G{>ROWPL?*dIxjTLx6E@V?Pu&|IQZ#hK%b74Mnd#XnDy zTpjXRfxjK`HeJ*9thaD#y`5$?W(Tin%UV#g!@F9TgYlK-upp9bSFbditd-vtVF;x1 zu+%%A%VZ!nHja`jku>Er8xw-i#s(hOOy0G-TU%ReBW|~*Jm-8N;AiKvq21;or0Js# z)^6(St$(sw`g-f1urgu?!|67Kna_NN7vHN=<1wK%!Z5_zy?euZ_x@>Z1eeisrI!Hj zPVy2|64NN(pbLn%1n>ki9cMQC1QdtnRBuXu*cxtqy*5$~CUAtlKHeXsvM4DoIi=4; zQ<`oavWb0#0Y#V=6w%BXseDz}#cGK8@6@I(2rfqeaMjF+>qqy2D{~vzVE5L&|~s&9~aQ4K5}LWkug*)A4A}r_ul)ERkob#SXF7E~t$lBO&G*$XVUvr-_#Px@MOio5*hG#w{z__CRn+AUBGG7}{;#e*?A@IBfm*d62d4OvKIe2@ z_a!1FoVUAaGJ{jld+rBy)Gw0R!zJSgUNJ*4whQ+SEos|_a_TAV-s8m8j=iU4sBlJ` zH=0$f`PQdps7=KO5Z86;C2@HXURV;87cPnz7-cAo#p~7U4*C$=1`*WB+B9~QUf6{f zu}9H^e-D5A@ux73PnG-v%O>*Vro#B*z31+xmTAXP!Z3>qXkU4+bJI5TSa-M42!)Q- zA!GkJ#SA%=R9m9w`~3Rc^G*zwe|;y?TgW_6|CdUiv3`n`PxUcHMvAlSQWlCvABmne zl$&BD3j{7CALB+@wWh+MHm2)7>2fw~n?=*}q&Ah~h4XE`BU zp>hH$m8yPBjLbw)P1@GHp?Hp=D)U*(dcu;WGM8rzO)7k?O|?p1oXaH3K`k4Krx3Dj zX>it1seCkB)rNL(>gW&u_^xWXU8`xhS3`jXoO^svRZ(ds?>h9f$dK>F@v|>z38}m|OY4(*5`JsCL>) z;;io=A9oy3c65&;hFU0bp+UMGxU9~DrKJb|=r9wza4@*Ljt9Ukt0Kip+XJq56;NOF zGk=2^br~Y9Td1tUBdoDecDHx?;>F%!U&v-W4CAwTvd$c*$;_c8ZFP&BF=uLPwMc*1Hp*Zp z^gvv}MNg3xRm`!YN+jFXFfDc<>k+NZuCeTNVI}7NV%wwpo-JBulzK~ogP|=&9xQ{f zsCne$sl8=k`(Ap`<4)j?Sxw9BAShQnCokA!o_CV=SEh&M)nRgYex47e25Jj23ZR{} zc36xJ`DERi&~4UdGSArGZ*jGJDGcXa{F%fN|I-JP+1te-W`VVbE!+2RbqA9|>+E1- z9{F@TI3(+ruzww5crLn+yMHat`N+H1^O=7k%;wnD^zIF;Z6AloDhsRj<}d`Q z%cOsCT-ahv|>|G$2U8FLjMXnVyK9yvSbTh>Gvd(9co4BrGfM zo=lhLIA>T0Sj-^k5#WYCnUyHYY~I{L<4{8t6Z~t5Q%|!O!So8t8^o+cb}OCsAy|hf zWNnZ$`rBTQmN~*-(^<1%=I&aVSe@hgy;q3-Cvv}h0%*H&8&Z32QjGeQn_J|A2q^1O zYjcr{b-aLrMJ9v_j@XlW?qGJj#3xHyL~|5E@zF&kkdsqLTASsDH8{*oeUAnjau;iB z5qWK~KH8#4rkEzZI4L*DjjfIuh9raj>u`AxO^W)8uL_SxMSKoI;wp59Nb;seh2RUm zgUqIWR-ROMDth=gTV2ruD>h^V(y-Q7TJEP+IprCCbE51K-|7o|&n3bR4Z%vtZbK_{ zGQGs#MbCsWo!9|O`US;RoXNdzHDzUpb+n|OYxab{?RMG$6qn_eiIqVXAN55zx*Knq zJ{}d+(tQO*CbhtGE2V0_+aUVGKd>#yiY!@Ghp* zeT2K@6VJ>i*vW@&3mePib|Rkr9IoXaf**hCcO;GVy@av8wLIXa$PTd>aejA_UnL7n zjUU>cd@PJ@L{p6A*cA}|vF>eJ1 z2PzIRn-?)vbe0RuWYb}`S&~(nIaO;~4(y)17!WurXSqZo1?*hr`dVNBWXooGJJZ{Q zqmBG+(wi6aTBZ+a@R_R&4`?w11Q>Voyx{%Paj!6pc%*_V1ETpiH7h@<_ja~Q>Y&du zOVb9|Te6^H`qtzI8BHCTOt&I!HIe2U3hW#`EV_rG2Q&IxWsn(AWD9LZW5SrchF1mI z_d+>oD-8`zle*+rqb}2-$3d}HpSpZNjz!*k-Qy>_zo^Th|4o*g@wXEtgIHj)Ph>~V4K2? zwi*`U7pN-qV{7nuCzj{ZC)z!BQgCm8iU{?JO)Mglqk| zG!QdJx2YrKBIFcTf#+qgOy}NI1Kb$@${)G$x2CT}cSLQK=Cp@v@f3rOQI$2QNg5?p z%i6W=mzc@SF70WwAi6*dmo4CGTHY{NQP^=>Dp;fOf|v0^j^WGrvYXrk<>}O}bWHrw z*|*w`mM(4NyG}>e9>xogg4Bs2*M&eNI;j0A!I@8BuPUVvVeb?GrD~8|Pk?nFy^U!M zNp%~}sD^Yg;L02tvT|g^{#&T~m=$Lu9YSE;n@_7UNyk{x(v%7Ulg{~29A`$JCZ~W` z1)g9puOek_OT{#csRWp-te!Gl0_M-=3+3^!?MXnAh3Em~7?uIQf&?-etT~^K0oY(9 z#t>t=j^Pf)ILnRXv>Rm2dJvx#ye*Ry4iUQABMHEO&}`inXpAi}jfHroFSIg4L;2M829l4UFr@Qse~V3gu-v z8;Tbh0uqbwN|PqZy!S)aobze|(D7mg!e40Q4o@0S za8OxazLRHq8*>apJtX8ylN;);zZNU%eN3BB2Yz^1GB_{!dH`Gyq43ZOsK>nkzw~J? zrzB@#mw-*YREGx&DTJAs}Tm!n!^J|1y;)r!ohhFLcEYHTn%%mW_UAvUv_aa`NM~=F>U)QQBM*n*tFR_!fm=~O)aPhKL1D)5yxh`Q~jeAvFHE4s7zjW}J}V zEc2HINeN1hg+mA)8Ewwg9+|k@tmegTG~wGvzSlk4$zBv(Y)mvhrnNG(wy<1n;p_kn z2r|`fkUfB>lI}1uM95a&J5pGo4xA_j?wC1@IW=%4d*DIbu+4DlLRq=I6w3Eyz(|RX z_hP{h;lL=vSQ02gCO8=KFlnZ8Ks3sOszw}Pht zbnEbjxh8#G7S6qZL&jN-I?1P04+NDTkm6v#fM7yAtqSe@1npg!2uX)m zmK3^8R@qsG2&hnz(@G|pS8aRd_w58Kb)=l_Sl}bn&BjbK1rXwIU6t*7^65QF4lto{ zEBR+gAjWBS)~$r4xiT{_OEc%yo^CHwQ;Y&-M?F-+q6vyMJ&5K)vSZ8feGU+C#4mMjCy4 zbnvgQpB)|Szunv2`~KkV-m8}ABl5OI}m2;&4z@*2qj`?L~UkpJejtc>`!v_@5bL!kz$8xG#hK#N;C z7PJEv^E}_Agn?`#<^=*TI6~b1oa++6zzi9%*aL(SI>1yqi3#35q<66~ZmWlFS)tD` zl64ayt-y1^R}0K)pt7hG6!atsq%o07;2Q?>t=9~k5(DB22<8ef3H}vcKZLjI$GtECUK39x zkHpieEIH}-f4Z;(rhKWFXd&i**NTJVzlf6q#H&`;xHNf*6w*rh@nC5H z3SYgVcZAV9>T|4!jUQnRtW5|@7a$%$>#oXKl_BPG+xnh#cB!ZN1Q7XQ8N)gkhsoj! z95~}3CFlE-7tf7U3t^q%GpAZmGMjl(Eqm<~%2OU~e&&SZg-qd3Fq#V2*BzEu(gzmeZJ(|iR_v94?C zkZ3&uLAY<{_E^cIpteI=V|J%y&)j`A=Vlap!mUSq-* zRv1$}u|UBi}DGow}JpV-~tOq-ISf27KP1$|MyD2gSR4cN4N{X3Y z;~<>XT7jj46*k=EKMGm@1|;(G^yihl37J$OJNCaT_uo?L1y$!T_!pCRZa}EMW8vHp zucle^%^_K7oy_|q9oV;~CcpOR{mHzmT$gT^A>XSQPY6iJhRYgVZdXt~OI=aWRFy2~ z6LgI$dyrKlFH(en3@jbB?fk4hTfBzl+^iQqUv;-5AW-zQJ~?y>pMS-&{kq=zz*qBn3bP>$0*g715c)$;#!#eMqeZnXlx-s(pEkQ*t#48uE_U<=@@E z{fc3pnvg=$P=;@MPo~*aM(P%Ex%r3=(oRFB{vmaE3$E}iH+xyf} zwz^Q>J$z;hW_5Bv;7^WqF)5y+CL{{1AvUYzWhSpsx#XlcmEK5^B@}eR5=XVEouMSY zay)Q7=aW`&%L;;Ku4-ACVpl!72JHwu70;V#zTQ`+Th!E0&1{kjSzBNZ?wmAz6!yK2 zGXy#?ZiGLYXJooi_HhWFHKDz~xJPm97^jo;muqp|V#PDgoRbzQAE@imBGacO#ORyh zm{U@1N&9ScPWyRqIzHZs9GM@5^WtaSmq+WU_s&Gw*c0$;HGisQsyj|;C+a$U?3F0! zi1+r-2tQvw92>__77_MfJht$}}BP$wF` z#T}S3Je?*#CrRbPE7}$^ZetKT0v*$rf`!x_V=}7MF88Eu0x|0sMixGsJi%9AN}0;E zMe6_m7Pg$Jy2eI`C^&%+b(kC#z}FGR?S*Gyvp`2%jVP%nV3pNr+QSrOHtMLSx*; zArkbIxP}J5iw&I|MOH|?ZpE&+6X2tb(Cy()R`k^3-`~2oZn*eRQJHn$pyo_WFRlzX z@7S!}UKuBt^^M9XL8+YJb{fL~C6@=aS{DA?9`A^r<;}E`JwEbmTV@PDUpp@aGmp(4 zKl5q?y7Skr(kLO$n`ZWSXDQj7(ht)aA{~%$z?h54Bpc)1!elNuI;#4HWDggfk=3a? zk4m1&cOaq94&HHfgmFk&b=N={9I*>UFN_qOS&WleJC#G9*>4}BOJm}g2`VPIA{Go;{Aqo5=PLZYlNQ!;Yl~lECn=Jt!V9}VQE6e$IJbeQfyw0MQMkW*ERg8s zGg(>p*S@+q{wqSVz{3)U^(}z`zr$-+|{hBP>~yQ#ZtjF;X?8fYm=Zr;-e0aSn%KN&!(`O%L?$s*uA;OLU2@<%UX>Qscv#YvFCdtGgBh%2m(C z_FcfQ$7Y!Z+$S^Fx%}9B8o8)?O;aTA3)+iM;u^vVCB`CCUs7hwdwam{(W)EAxGBL* z>owJ7!?BgLfiaI*J`LeyZMCsKmc$Cn|D=#tkKtNeOVCPKQ~xxQhJ{WfHmR)535zxg z4r*n2mmD$FWxjIzcBIyj5(qk}a!gCTNr^Z+L}axloH+rwGHtxxYS_`bkXFR_*g3e^ z2fefvwsFQ88=#j2 zrYjS>!;|k4xZJ3}N23v_E#$;gKT;?t*nF6IzwHogz1rDu3M+L(B#>=wwKBBv!XH`# zaQN^hpyCz?Jv&ooeq>TK9w{b&^%sL6Ldn~@k+M(OSl*!Slh=Mvb-m;F+*b4{0N?+Z zW^n3)jDK*RGps+Bi>1(SU2=)#4h1=5{E}(zkw95$pF>7|)LhzN#HG`PooVfYNk%^f~WXcN8fxvT^QaYpNp&049A)IOC0k{Mpekj-@FS z7;5Y`l$Bo|r5hbNifR-TyNG8@MPSJ~F`K;4e-(VPxGmXhUMBjt-6wU%fm&K+K~yIJ1Ly;7ZR_!5I3TsuF^zOC>;Gnt*ZJ z1K75Cq6VIUZ?3{Crm|pX6UC&M)o-j-@WjO^akiNu)fa({7IPll2q^7FR@-H`Y8}fF z0aQ1&fR%t{iWxQTG^wdFSYU4Us^=0b85cn#`Xp~l^{Vc+#UWJ2W9a7E;ztN z_kZ)#yt^jE2kyYm+_P5vVwJXoN2g3(ID8oL_#!#u`qsw0gv<}JR*W1U?kM6guS@GH zsMFfUiN2d*p=>vGMumSt-u8v6uI+?A_*-=#UKPeON`VDpduvPlbDJa*|Ev`psgowG z##k#Qh(5TFr%9D!0H=|p11n0@IU$$r#5XN>E+1{@1`zcAr#HWF`QiN^c+K)#usF-o zp-h~yoyYReItPet5v5+;5L0M(1uoRcm4udOhY7`jh13Pa47$UGLIu8Bqg~>$(Rw1U zYgu;&0Fxytn^+8Mqh{EV)RgXRbF;S!ienw^)eUxbu5KU92CaxGT0>qQYUJ)Z;qSWW z0%Ex@H*VSqDe#u?B@}xivwmWmzwgv4)r6B{P}OZuYtaff*J;CWwP9COqN6`E?f zby&fdZGp}HerPGu79~@m=Iu_S4NS$hZDKJXWsNo9B8CGDzFS1xwD9NB>1w7>2rjLB z)rS5Nr30kyw>wzd(J;|o@3}#;LV2u0A5FyfVbGRz8P287#g!d8J}!}QvHMj9-B*X4 ze96va4Ff|c;&6{wA>QkKg>E@7!pU{FZrAH+X*|Lx z6vjX&(Md=eC5yIpo0yVnnJQc?uH>moRQsS&D~p$QugqpLA#>2FRGqmUxl_pMALQv1 zdZEpd)pdea<6Br!TeXKo@ft`b}-+@T!OkYZ1d$rfhPRRIJ!z9)E6$aQaC2j=FV^t?e$3LJ)=*B;-#b~l7Md#vOGPz?x^i?h-hBc-JF-GT+ci)+ z5F#})TF#B+iodAJX{$D*TTkr+rd1bg&LbxrCx1F=xsymn?|ZXcU`78RpKnB9_?tg2 zIn2%E#d9{Vw49Md5tYh)^5S{xK?&f6IUp3Ee=sVS-D~{onvIn)sP$BivnddulH;tl zwPMs2(TkE}N-AgWK3KVeOQhaZt1N(by@_Ro9voe3+O&&(`fe9LLp(SWjUB6A&e4|_ zauJE|J#+v&36pt~?ZE`iEcn7oI^V`drOH^~nyKVf@>DdN^qHMxE?NekO~a*caEk;lgY{b@^ zN{W<0od&4A(TT2a*E%H8(^x&2FNhQzLx2YqKd+l)I;+>AK}-pPuC!JHt_cKdR^DkS zz*G+nv=j}UVi(ay!dTd<4&3;>RBag}$58BBMqsRl)dR%{i=T0m4Qk&h_-%L)n@GrU z<3W%yL7+7HQ~Wf*wF$~fv@?ZoFgCS_feoAtPA5jx9IOOFT9e*CG6uvSFXZB<(NH`q z2D2O(N2Zyo%19R55t0$%ZlH1t#mxd9kb@(agXyN|{h*0n= z#OUN%A(0YQqI-ex%Zx2r*>p;!2!{NYT}pXGebVm{%OVm@wW<`N0i(W?-BH8Z0`yY~ z97=Jj1z^RdbM#i4fIXMF==YZU-wLwD`!Xg|OvdTTTxDay3_}*P&6K>GdL#BnjkNi8 zWYr73Hi7*_c`n39QKC>XE=)1BBhxQF)-k#>g0!F!%_kR6srf&Mc@^fw5sD zbsy2YV)RgjZ|4hg%8x?lBasp&#}>$;nhNUY7>L&e&7j6|5(3|oo1q?;GeZ3joecHBEUEm#tGMM2XLr%#G+#pn;ekYK#t(f>E%Y}glNApu~|^4?RHJ3ifojYoGM zol=gQ(L+YXH@uYIr9f~xAD7@YX(WHQ`+WFS1WI zlU!FMtpo1Y0?QXc2qVfJvI<&Q zI${fBuWfiC8m7|lza%)%bg7)V96kvCW~;=ixdV6&RK~fe^Qo*7cNRdT z3S3HM11sWa^mc}LNQJ(I#Nr+&>zyzc8e+tao{BO9iO3b0puY3q2v`S9>MttAC zA1B#UcR4ANCGwg0$S9vbnIxTDlsKU`%KI}-a&YkgkvO+Y#bg-ZHJ8Jz zd$j7f6FntdsMZ$9U8)A;4wny|mUUAgGDLMOww+W97h$HA#vbI%O~~kEOaW4g9Yzd!?l*~APSW8fa%prj=JPnA)Uoqi+WD?y^LeG9ZuXZGgnfo_x0BHx^2URu*Z2p zaXl&A`C(KE3BTP8}c|eB0 z^q92wfeBqY^DG9C?N2tu4^p&nA%w8bE zU02A&jaR3$&(h9#Ds26@?}8Rv<%U^#X2DaV+QX4XHarGFP#iov9Be;q%*lMT;3MU1j zWHc(%bPmYcGnx9)T5g9fr1a`Gvd9P>XNc*K*n)C-VH?@i?waWD@Tn8#5`Gu^ z+5XIXWMWxfwLFS^Y&kAp`M=TYcs7dH$NPhsJUhbx1^~py3m+Z@L?rU1bCiT$!y1a7 zOR<0Obocf1lefFa#|J0J!zp!1Y*6{8Y5MXa@w5~g;7t_-+w^;;QgFr|niB$;(98UcZ z?^^G~mg4(UIIBl%e}LB4M(XXMDbi=r^s@m9j-pCo_|2-&h`Br263W>$g#AAb(#>$m6d8e zGUIxh73q5p%;A`pgY3l3@b(1)zsfoOp2aR^_x2ttXLul946D8}2>WovNs*W3#e9am z`}%m_*>x{V!g{QsPHR$&5tO@yS+XKhk2EJwJi0yJ2}ns}hza;!#Ma+m**~PiB7$su z10$p1b|UBABd2DBe=s=~no z1d1VQo|HyiW%AOBgd3<*Ozs_$)rv%%!o7^W5$pb$XJ5FS1Mf_lunCL*qXFIDMt^?P zvqJpVcYL-FPr{JCt8l-4kKBEBC??4?Lz^_Eb&v%Ch!;t+bb|D8rO&EzK2xq6xG0=L zm>1pKxMfzZOpa%(IoSib+}sogZ(i8r(78u?hT|lgJ*9rW6>Bn^-TnIOosG4J%bPyF zS<`iyCq-g4?Oof=+np7wr;2ZlZj25$s%u%4z6&pY)hEAc+}9O0%&9GGcw!LUdgrZxAh=IO7-70T($_XE>#&uy04)G#izO{*k0 z5wQTYYU3C6x(M3W2&mVqv6wf`i3BkY7@%od$+});TrKLeEgm8x{zdmiD40Xqq(kml zTn97Jh{7K-k|@_x*J{qPrXqz{*~Jqylr>D??8Z!|xLv}HAL2X<4iIjYEg+lDWj<3C z5Gf=Y(M(ixSLfOI+#1s~J3FVLZmI&RmM<=FqOft@kUAOmC&-z0tR%81-f!0P<)Qx==~6v^m#_ z{zwHaqR;9xbnkj!AI0<o5ByFM-GYGiXb{W&LHpOVv=VQIbMuauB?Du zCi2!P*u@QToTYLgClg42EY4KS{dqahQ*l})#rPbO0~ia@*-k@5vAqs0$dHW!^n-ha z3O+==fNBB}MkD?|je1Q}9g%RwBu~z2R+U^3M%D6li>(%(V;f4c(z)YQOz}cOi4@D< zKmi%PpsfVQKE@9(4NL=^q>+rAzL@26<(eXs9^7rvupLS7feP4Ux9*s|Q%l`kl-1yN z%x@k^EkCSy0WlL;{(UOJ?gF}2xDeFUP`7;@I(vCqJAP*!*L|lX&#E{5-IEujb5oXz zW4!H1hyv%`X>Fx4!M$IM)_B-!BT9WqYH_^(S6Hm+DeMuAbjl72C^1}=qAUhiu=#dR zUbs0uJ~?*7v9!+Y&|xMEND36%upK>-19Xc6U95pBz%z`AA;cO1fy6DtwYU$%R{6~E z4zhqF9z9yY4rwVt-rJm|h?lg^G{yE@vlY({yRkrx@S2IL8Sw^M1`<~vf(2K$*d3*t z$2=0~9kWnzBlw@0zI%^Zg;K~(l?nvgL~A_QEoNoSH7pmDrM(UZ8$^vHxei2B*>u{^ zri+cyNExzChv;h*1;}590bgV@5AfH!2^!RK8*MiL9Q5ZJTo8|;C;kF@ldR`NhyQsNMv?Xu;$Az=}*fFO$a<*s(z0C zz8&=zRU)pBj>O|uVaLFx2PIS4Wp#5c6f@Bfm(y)uRJS) z)imAqc&Ud{`QAE>poEhf zJ*h}&Lq#e#+-_WgGSyLnBI4?UvMO*vh<1dVix_W{=&mXT)G{ay<75|cSia+pptye5 zv9M`gQLc)vc88V+ll!ovh&n&56)b01PPX&Am2Ii9k4e5+U|LauX8?yoA771F@%j%# zFRpSP%aPCy6;%N=y1KNIgszC0aZRag-wuOw9nr|S+FRXs?2yGv^yFHb zDTC%SWeBL_W(^f<<{CgfgJX-Kv6i_;eqNSP+|skLysDswRmRnt<=obd38uSIcN}hw z5!H6gibdxW4*J5)OCcm|uWOATM60TY%;NRm4p9}reEASx*UGxy7Khl{eJ9owHrW-S z*fpzF@wcMbTP=PinyDW}q@r`0(mLr>nJTJpsq>oE=ESn;5n4gAGf?V)uM92O(hp%|3s#}Uq>}ZyRk=ioi)b9L zcEH35e}kQ*#lkTP?KnWphlK_H_!EsMwy1`MNO*R_bA~b1E8<(NEJdS|G$u_&2yFOa zqw5s1qB}tRhE(_{sE4i6*QHDtm%cJ2*@_(9I?8J=4uBY}1&@jw`%&*vwbVa3PEwV5 zXv%Y7#uQ|jp}E<|)5j{zCTCVa&aOI0SX;0%MkopiuK?C@#JAEh=jTzdxpg1c1!gzI z>AX>%&J1&cm5q2vQGE#BSI6Q7^YSbk>nxZzFLWjhG&_ToVv1s-WSCM-mrc3Q|DD>N zipg1T-Qi(k`s*V5&$+~)CccYsk)h0LTU$6~HiH3vm(<5PQD;qqFOoYA(;;2VN^E}4 zi3i@nV1d=SihLJN<{kw|>e`7Iqc!HeMkOM-47UzI*4+%nE-i^w5X`Fm5~DMn7bfsn zFCmiLx+@t&TB5J@;6f)?pS25Bw)UW$30$or$?ZEPeW5RohcS4;f97NOuyI> z>4kQD@4VUpzQ>YmSIo*h8!t?nDYDBX%dxPW3ReX0MIE&fp%QcmZ794d878mQV4aOih)lc!_R5 zr;jN6>C`9i%tGV<=XPM$$T*=45;zji3dEmsGna-!RZtd}nGW?hhGY{JRYNfaI)@$7 zt#!`Vi`{>FyZhqR>z5~Q4-bysayh^q$|}|Ou2-{W03cgBw=CAp5RW67qHVm!=n_2@ z8Y?5tqOXi!euz2f0LnX1^Fj=-8hz@b=cIvh4kF~x1W6b6Q0z>#b}X@1#ei}Ul(Py= zL5ZU8fPN+?gU&WP{P)+#`*x;TB%RI427(cu!L5VF4kgDHmJm4o1^K91XHA$>AG3>dMFM7q+wLs zys59)fPk9SU_8WhqC5|X0!~Vm+g2{;wK~*$4y`r*f9$>Ma@7rU!TSZJUJK$B|Qir7!*0Z!~QoCn({IgyvTqJVDd zX4y-9k<=&@stPIhe7M+^>Qd}~I5eqaSkusP$I&_Hj@Z1m{lQT-v?2!3sfArR_r7FyQE)@KEQbDWfT985^2n=iIv~<#tu|@3JCN%lnUbCRu%VV*eLZIV*Um) z-ldo;;lVEHN&GfB$Q9S3N~uwmwPvngI-KAMs!iGnFs>iZYF_OTvJIyLWs12kD9_kb zEKj%tG_baq1w9Tg&DJI4xSYyd(_Zsr6ax$3^%&q_0(*(p1a!eym!Vz7TNnG}>q{Rj zB4gI#Frn_=@-wE-Z>^{{NZ!XLf26e`0{2=~@wH8p% z3}4dHx(d?FceyfnOLM&omwww?6a1zgyZevM+uU10JK5rf3YxW01` zLAhhz3zf+}aU~s|a`Uo;|GQyEH;TJ(zzJMi@uUH1$`AUk#$+P9=$X@3)Y27Qda5^q zs)9#D-BTo1p+oC>7kauh6k97%@oK9}Q3X-nuN1JIw3=#vtgc)|^|vPQ%dIe%^F2|R zjeEwx+2zog&kmcaeSXcEOnUVpsHnAS3jop zWlvuuW5WY#Mt2K;ot8ehM=aYKRNKl|?*})y3YgmiR#%t$h=fZCA=M-X<}7X;Ad`eK zH`J#5*v)P)&9j(p8h!uT*joepVM+x;ER& zPS%hp2k+ogMW2%-U{Kwk{yDAqq8>Wostuh~x}i(6Xm?!T`qN!{CG=vRr6GEK8~~QO z5Yu7|u{w@3(6Hl4fJ5jMzMGk9V_@$`{6Z#0v#MCYR(1(IEzk2%zW>wEEML!jsNwtS z=B95k4n1?vqHyRW~l|^!1jkPEg6UH(sTLWxDO6|_;VhXkx3@XCp zrcqtFPLsqya*$QX2_rLgUV^Xb&JDGxbOl?^P>JL%778GfK5Z1WuG?>CtWg^U?5O?7 zsYY%rrN!a~)_Ji!=&m@VC~oJ{AfqQ zt)C_su^4`db=OjXKM`E6(%K*~X_gzXmp0ACaCd+I@bvKI!P)Nd@$TQx4xc@Ke)jnA z;K}~UkRv7#x=@vUEFUziAZ)_q*1;tyO9_gFLVQxJ8Uf(*IaYc0X3VvLNjmhZ0zyEF zYv4U4r@GHf;x;pq+U&GDd1qpRA1@xEif;>kLW%NhRz9R|4OM@J0v80Q(>twkgY_J;Dq7DgM#WLA5BTB}H)_g{ z4KRbcHxRoRn-J=e+PTF3FWmkWS&RPCVz4UJzj zV8{c0tfk=y%vCF#pwkL}@d7o(4|uF$CsxNTd6oxeUuVW3g(YKsCkta;d^>4om7(qFBkqSAp68;FfZ=Jn{|$l(Hy7SD{c z?6@f*Ot@3XG;vHHAQxD;>x`Z*pbNVdGZoUJv6kOyn*+EQxIV6Xi1-V5 zq3S2{T;r-X_rp^;t4sn8t;~#I715sL4n^d0+FF8BugzhztHult{B9vPN-v1}LSrJ4 zRFoee{{PKqpQ+bqh5AJ})!Kt3ds&G;C+#)LWF>Z!)?$yc5|0wK z_V~d*!Py$4OW5HE8iIzYbMGIra*E{*Hf+W!1_` z9P;DV$_ug*-!}(l*GyL82mccW1yokz2|uD(Y*~q?{DVFdWF?+8UuP&!S&8TVL#@Bd zN*u*T&LEPq5`W{zxGo&KDl2iU-}0-+1Ja{jHwPvcem~{kU*upv)o(m1#`yF_;_{f= z-^&EWjz-b7Bl}U0jGx%S{YP}I#tzH=-TR#L;6KB0STJIEd=~E+@6jF|U5sjY_-Bt^ zPLFakq@@2vx#c}??moHgH6R37`2BNtDy=|!*z{gkQvwmBs@B;0i>}tsIVc($-uJ2H zcDJ8aGf3#9rIcSfQUFWVTChia{ughK@Uu>dpfCMZzaPsyhX%V|gSO0JX!$7K6+YVw zb`eFaz?1!CiMtt3@!^Hraq#TYbliZ;$LFd4;W#orw*1K>@p9yJc;}V(PWyo)vqf0nX*MpcC1(JXN#mEVI0_aYBYDS)mL=lbLi3Ju~j zeb|Q;>hR&0fnYiDy$RUnFWqg7usi>&L)6ot5CSw9c|@mmJ7j;N)=kDvn+Nk|QX2UZn&IM zgz4mwD#}Y8YG0j*lY`UKCkLRbojrefaD05Ye{gd4-NEku!7;R$CxTVEv*Uxmy*NBR z*gxCb-TUs~Z14HA)8pq)pwU%=Ch{Y?UGK@!rD8=6o?er*ZB76lzD{sv(Oc^xx|^Ai zeuh$Af4cqi>HnF@(JOhOHpXdHZ;XDbHo)-)6%zCDVV>6gz3;R0{>i<+490`HddqKY zZf@SccTfC@V#UM1H@CjLe_w2V{>A;xt*!g_H}8qftuME~{6hR`^F7Zs`ezRD;(ywF z=Wm6R`>V@8>#8roAXq9~ig`{SA6s%&4=DWouEkT* zpNHIdLRA2Wdh$I};toW^G`T_`Z9d~D8=D)5#HonRF8$N#RE@#koh^b@25RWYDZSSH zNrnX$W0baUmXgf|c*OJ?FDKJ}#g56}w;GVZdE$`R?eCt$r;$ zgF2pnG&kfw`It7a{`k8HedkZN{NMWG-WOYe{Qu&M?JsZT|Ht@~PBl}Z;oUbDBtrfR z^+0nUPsEYa&VZ1epq1UXyT748#XEz+hJC-k_bi)#zjv4peyZ*~a9H{ZdT6^#CqmBQ zdFzcl5poY21P0PX$lb`#s9`5UKC;hR)bK>e18CH3M@@vhMu$enEk6-*;k9vZ?+IBb z;?|2q$TECrtsjYyb>yjU)<}fhcb5%q#EFovy*2kt4vCQ8;i5LoyNQrL({i_184@8M zV}sD5oCx`C_yAfT`aH(hh*kKf3y9eX5oeEx_Bh9}g<};NR|6#H!{|ksMX;{$s_0g^ zmR{^3!Dx)6!{Y9b{53Eshnf?a6)L3CmP%}Ewd4uoY1mtzuh*ui5;E;A6xn0@Q(<6(I=_E9w z!qWgKF<~PZ&jl}Q4dllXT=UX3d(z?oF9)Ad`KSQQgN?DGe;74Gf?f>WO%O|)KB{>I z)n#TmD1?({NMT%h-Gg*UYzYU7Su2&lz$;e5xXrO0UCR+tP!}-_}1Pw24 z1}kT03%v$=c5O6a5Rujoe0PvBbauRbxe0m^$;u&3*W2G!us=<>81Z;H&rN9H1J-gW z!N%R`kR$Sb(`}&m(M^(UXw^8$CL%D_sbG7PNb_6+;3Efm({j^enAvaw0hy8gV(t*NtYv#sNs2Xb3rmXS*@Pcw^M7Yhs7HK}%MT-iBc`sqB8ziNwZh zF1}&|xG*KEo|k^u5w&6xp6DjDdP~rE*Sil5mxwwsslh*KPPO|mSPd8!XVjMN#6-JL zH4QL;rT_*@)sK7_d9gV}FXC}8JdN6Lo!f<|@Dm1u*oIJAx2l>!7h(wjOu0?T5 z$oWFV<+6{pBz`n>b6}lB_3vVDNz(Or0gRPW`E-~cRi^5Kf)V>FQx}AkK<26F>HUGv zgr&)Izh%xG`e7?48C4&kIUOOSS0Xk{g0)3lIpZa;_O7-O&u~4_ecN-{mOGbj$|_Qi zl1jrhU~GB_{x#{rj5S$_9%4_zEi)}3?`(MioSPgEbS%K}d=0)en5t8{7W=;G29+U! z^)3xM0_?AO#X~{Kz`tPfpV1&%)Pf&<8k+=KjS50#aK^guju}#qw50%CkuHe#3O~>4 zrHJuwD_?1r8iI6LIAvsJ9{gXSjpShHUKVA0M0?J%4s`U~-Ba;hau%rKW@u7_Yg4f%`f+YKLBp1e-9d z;z)dx;@S^AA)<$?7#<*EL;OcS{Lz7q56#zMFLaJP5RhT04~XW`pbrG!u7IO&oWW4U zKD;x%d0Zb+Q_@krd2 zoo-(fyY=McQrX)W{YycWyI>HNYwm3nU7 zM3Ip-a)DZgtcnjJ$la@Na@Lp)&*n_spw!29JaQvu)9b+Y)LXi;14jL^L zhSjOlkq&Fg$Br$h&He3;rp5nl@n2k8bynC=0a%Y;?!xY~Se1*`r$uuYMZ34G6zjhA zY0+eqhy%C@$nVAiuTteeD-RrLS{K?{ie*-zhYMAkX|D+D%ir@}ZzRnV>5Bns-`g+{M{?BO!t&5JBlrpki&RsZWB z|4iIb?6m4<45aD&@;2)ouflM<%I{&7ZKa2gxz5G|WeX3-i5~)f+y67p{fDDW6!klH z(O6;b->RA{EQk%&0_6>0Co7Lt2nhfUbo%DBzB-NR(f025b@b&H|SN> zPg7af5cXA?1LV22B(Oyzy~v%YMSzE`?ES{k6@8u7YOdSmgU%w8l_OJms=Vsv{g+u_dV;l#aD5z1pERY?BS34N}1+D$HAWrqr=D=ef^Ch%aUz^*6Th z8|UA4p5ZM4$3nAiiCO-~KXs~0gW(vYC>G`^FC^@P8&o-18t9GMz#{%~05BX0ouEgi z8$G}VXSK$81}cpg#Ydb%JueNjiwrsH*>D0>e3hjcnnKdTT?Z3n?^NyLkk0qEASAKh zZ9za5SjoToYD5B`y|tj{A7U;1)1ewX6suOuz6pV=@kl#>ogmW;1K4_J{{xPw0GKi4--VPH?*lP zrLLMM!a87IHk2Roy?I*ZsVx`wLa~ z5dfr|A_xb?ElX1DFJ*O^fIZXD6cpKMnx_@i@OH{NkC|b#{Qiupb9x6NQC{Za;P9yb z`R3+dH;$mQdfTR#X_Lpv%co+hs!Cp9PcV)Rm`<)Tk&f2~T;)}V`UBfdXZ0OU2%ps( zJSE}^07RiHQ$h>oQV02nOO0yk;0MK}Dvcq)UZW&*F|?=a*^E|oNRbKy@f-&>Kd&I{ z(_Gv17%i+i#%9|ZroDPG<62yt1%a`7HcXxB20_saD%(Xlk-&wbQrOk739US!uj?we z>q#(sgpyfkgAsB}o$!+l+ufi+%~2LOE3_zAG{$CnN)~I*TU_2Y3&}p*NO_u$<1J z)r1erB4;l$^fs^5Ks>b^0;xIp%2;7_2^J=A&$m_yGW; zi-}a1(j1}c^$b(gI{iiatBTQ<+_@mdF+N=?DjiNpo>yV2^o6Pee~{MXO^QWFO+va7 zb9Dx!?j0LDVx_{ce*K-SE{9lH?h;@qi&`ucFrqR_r#Xo5fVUzP#O=_NoJdGGWv|Or zSBjpMsjUfu$)X>45vVts80)ifF$l{MUcOwCC)`P72{_cKL3AiOM>TW!{9*QVcpPO; z0YcA|A=P5JYEWGC*c`hqn9TN&(5F5WW2y!H8)Ym-tbb4{6TQX?G96pEG(;CUb#%;b z%`yjqGmuCwc1(cN|d1J~K z_MZ3hbzQ2DR7D;Yi}-BOXMw@5=(7ee1uIca;r3Fcz&5&1js9>ap)!QRpLVB z^E6kP;m7p^j$kTo2PZO&9>wTXNg&^3p3&J=t9-QZtrp_406wTMwJPuo@?CyHZGg)s z)|a4nU~**vy=KMe6(Is?$Rbs$fjF6`HDT_7Xt=B2j;RCHgHTr(t65eo$PB~qgK3V@ z7N}XY9Q`+9Iae8Qm4sLfUH55fJFdFV&t?Q2Epuz#qIW%AKg}a>gLlp+e-!>NKEpnd zlci-}NKxf-R)MTyJ>G#|n93PSZVH*m7ATTc)#0((6|)TL>T*EWRL*8d5{a@I`I{q) zzzET~G`yovczC_l(N^@L7}1ZoRtU7JfdWk@Q zQn#>PB7Smzf?5=bI0*6sgIarucpNt1gx;US-w|Xq5xc?fUhTa^JPIDWr2-Ry2&qm{ zzCZpkwlF2Orn=UZ(xD*W%YV+usz z1mZ{nZ6E@z_yI0vfE}-gsZN>7s9yYSu1YAfB&Sc&D~^~7-yWPIPy(zy{$u~($-(Kt z8fWUkqB^aQo}W&L#zVi~u4C;(n-&`P|Mz?K$3IK%|C^g%ZU*=Nd)xOmZ}0yfl2glE89q%jvpV8xSP zM4Vf8L5^fjCH(|`Ef#0`tjG`G*$KYABYqzIXE8ouB?|QbzlHc({5(kWi7LN>r^O_A zZn0-}^99BXmSbmn#=C{{#_Wl@PJ}DmK;K ze8KZ$Uzju3gdV&wIYLyRI$t#ByPGfUBn{rbY?-Zoe&cDIH*LlOFKw2-0$5|navI|6 zLz`$Yj7?k*(h}g=Jj);|f=HmBf3+HMzR~1y`fZZQd1%R{aWx!gEmI4o{Ble50X3oG z@{^_@COm=sjag0J;ym0xZoXXQC(K2eo`!+Z|MKNll(3}S_-kwmPibhh=y7dwBs z_r>SiYl&E^icIEmXRNMrRj-8sB@sGoGaU{l6WBsN2Q>V~9+kG2QEA&!=|v8_tkW0l zX5sZ!DQ@YPTY_jtq*^-q9nGVFiSdsn^R6k*!s77TvqbRiIi2W_T%B6ROXAdZ|o@k@z2;e@Yj}+q@yB#VR+#qO#clCg}O{U<73l_w``eJym51K z@ph3pHX9mbLs#N7rBzcNSt%UJ;Pj7TeeP1UJC#tOgcK;dWa}bwq^Xy(YK^dsw5H}~ zUv9O_N}U7V5SJzayzyizU++$fxodT9w9!*pNe+9R`@+)Sr$zyWmc_iD&1-LF@2qqQ zLWDgn;?rga`w8aJROX{LvmWwg>&UyPO1`f_E|W4m0e64$xT@Itx|p;6^efXyWqA4ZrZ_mb4#?v|7+crxk7m5YP-bnxJv|kI34)-Nm@g)+*eyHk{Fsu%)N`KTT$G-qsZeGx?PG-WGTKem(At6l_#sW0ZI>Tdz^^!9rE} zom!iYe9O_QR-x^8whFE0$3QWOlZbTKrWe1973Md$w(w*>l9}Lbq<5!9<99IpE~`Pr zRo21&Z)G*u{zz7XjxE}LC~QZp1|P}y6I}Wmc89oUuA$s~%pr^4%tI%BOD~=Hq&#)v zxA4}96)hzVZkX6G>Xc0x3==Uh3AYaBEh$ zH7f*0xEnjA#cyJQh~0~pdzO76@P}T`_i%aA_k)N38|*x*geKkc*{8{8e|!a|Jt(H# zN)gxyx`Sfon6P?-L{&)Qrs^o@WnUC?to#WGN|%V&C(a97bTgW(9vMe#p6hMK)NRJp zZCcN5#?+@l+HaEEh`rm0z2DpLE%rl916Uc1E(IRZ$M7iJg2}u`FqyZrI@~75+}a9mZ3TZc zMfBEIAa0Xm{x`4uZF0=5x#-qhbekM=o3!v-CoTM557OJ@nBNzl{qYr;nE6SYkCr6I zgvO_rRICn*X@`a^u5Q@VHmCKVa5fe=@4C>{@BDh=yRfSBto8~fR`bzFRh6h} zSB*g26Cbp&mXaSX8RU-9!Koav3o0pqMM z%i_8M`x=h)t?9xo@WD9zAhzT$fsP4Z66wULFDNE5&8j$^bhk@M)mDNYC?+oEvZTtD z4W!Z=amDCTjb8avFXswoQ=4Wf5FLjdp+sbcX|;52rsK9rwy(Ea^Xk*z0yx@t+y>ak zDqF!L&Bxjf_|XrsC0a-qX|&qbAnJU??V%~N!WL58-afJ@1B6aH#axKzqjvgfBB`@{QQgin_FA= z?{D4{n_FLeasLbPr_J{YsuJ-x_#Fj}(nk~WO(IU=$-YvvV<+3q`to^idTt{%KZFN zmFZ-`KVQJlkJO|nmDhZ1e|OvO!Owfebe3jnd|b?Hl?eG4{bQzTHKuN0{E3hf9vx^G z!Ao;dJ;s}VA`amBV>wE*w3c;I?#Y=vhyN__cAJRDVFR3eB7P2kFY-xxk%-;kcTHLD z?osfVog@78J9zrt>FLq#Sk7u#(1rdbG6bcc9hC*xEcBet_3yCUs;U7MTfMFm@yb4+ zK|LzQi$sjWpAYk@F6XFsRf!ns$ET&tD_CXIp-kb~^PEWjSf<&$)C>3%J;KFH)tFgo zPv#?)sWCU2IE@zG`&Y<^yMKRr@a**L_~36Z4v!D^&-QlrzB@SEd;aY7`1zAW$S)mk zrLHqv-u<+i$$E4NB$P$4jr3Cey}2{SW@;0DcrCL`zi{FFc2pKu=@|N_?r8};LfB0; zZ8V{^vMusPixV?xK`v=E~kgu!^JIKp) zbQvs!o;NefG;D5nIZG*Sn720!y3B0LHYSjpRz%t#x9yL-()QWs_8Cg+M93{q%+52r zeKPw5c~hcL^Y*6vtKa7Nl`6}045xs^eSY#PoqdOpaOHkls!^R@sYJYhM=$c3OvC=} z!;|Qyq)Q5Pe6O{QOPeoRTV*U_WmV*f_)pVrVP5{T{VgQnnSB(HOCl5E?ecK)Nd7Ek z`An%X=#AgPlM7Y13*KvJ0T$k)GQE)d<2zxRE1-aonb z7y6#Q#-Hr}(1-J1?4CXquharB^W>x_GKjnoMc%(oOGVCplpg_75KKzIbwawtI4NaC&xny!-6r z@xk%g(}UCRp6`pVZI8wvv6mH<8jDKRP%xB>I`k)5aV=)B!$b|yK9x31Je_BC+OKfK z2xwJ_-Vl8E#r1Gqr1@3xN(p|Pr4uz;j4~xIi{cd+&qqqkRLReg2D|h6vM4L~c9o7* zUt#neIMIjaj@B|18)7J}(lg{PtIJ}Zjm3E>^UBKn>!VMkGr5$l)ReHV0)=C zeyS*uQtS!|ELA+}K1+N-goJhEF0l)ovMT%VZ)Yr((~(yLv#)9E|J<7uRh6D+3sFqd z8o32}+;IC`_bg<*4r4nC?iXehw}_SWinF*q9ffn0j$VBgy&$Z$ufdx5Rjj#_#viE5 zwQmw{hCALR*XlzSdM`VLsydMiyvW6n$P0r(n{n7 zNJW$m>CbrJ4HJ}7^!0%=tD&e0t~!I9B*aMOkVFNXF;A;YQJ3?o7Sm#^G7`_lyk?f| zS2HzAC+SFlnKM)43l*?7eoyqp-n=XutcVXi_T_o>#W8z7Ct4ykIqFU1%|T37^eqSD zV^Q;SF~tV4e%#IOyzg?p$mP`cPd-!EJYm;si^mx8fSk>;v@MJS9xj~u{g{^O0D9|j zsB%jHSz<>0zPNh5BZe=K%~;IH9(8z>%O;ruu9y&6_lX2!kd9i?byFCR2r zAs3}%Wi)9~s*y@(H3*GrUQXmlHA)&2)^cgQ+5%5_GyH2%>9SJE@q(z7LaY)>Z!Q1n zdt*Vm0uF&YHIC||QcYA@flL^wY@<|@c|O)E3XW)2DiB!@1UuN(m>VaoQ9??lniW-A zLx-gr6<4ZUh>0B4l}K|f5C`Hp}!GG92o(@DyW{Ie#7z45% z`MwjMYFwA#W#lc)fv!kh5JYvUFrY;O7(1L#uuG?MA=fP zg&`-34~5F>GF6q9Z!%v>L{ZN3P&r?&Qwuy}z`2|ixqn{m!7u(TL{#&X?iG|R*k^`QS=z;v322GBL>ulm!RI^cf0ksJWy0P>?M4*g%3 zypHD!C(s{zrz4FAej(Fb2V$@?+5(D>dt@ zf6ZmKZolN|^Ds=B0zHc;gF{+dn9Zy#>S9!6Af(|MHr|0zq$Lk)M7L-jGma;+uszEa z*akWW?MjYOwJQ~n3KfiL7y@Vd=!+A*iEH^vIR9WxRJa)6JxXxf8W89a!dr>+J^$98!4c>xX(QMU zJQR?iAOTBWg|x!Udxyf)qDZ-?J5xZ=9TihOod+la zq1&M)?@+7rvtl+!X)mr)i8Pz4@c04#A?Tg2>0g2#r%WND`*c8qJ&(4x% zs(d2PRVMlZT-Jh(QW^e+KB6?&N{+wCo#zN2AbhtzFeB(KOD;~F;dV4~M!w?087UWC zE>P>WqC=~dh%_H%^D(STu0U1e2hjJq0;{Id>qb`MaDlbS+%B(o7?slL@aC%;o6qv) zeNXFZMeAyY?RQ>N>*My^kx4V2EfUJM)F;dVx1AEC&8VN;M0E-qci#h&WxFYC5G+fw zTzV!kTTRkwxJx2t^Vn~i`b(@ENryJ@M-0dP=zkjVzrgF&dkz0x692ooegFRFVf^pC zt^2p}zaQg|jSj+)UUbS+C5vb%@A*CY&3fD<>}1iMukRfm5?e#8YVYw8#}uXw&=$^K8pRJcD0M zs!wY$=*=RqBT>?cINxsmYG``C)qJP}cIA`iGf2*mkpR^tVXN|o$W!R6Jq%oa-|`5D za73`TCc@K3)pPss*rWhaG66N0!lqz51BOO`w zLz<5hAzyeuIvuSPD;f&{l|R}ad2St1q4LBH3+1W3^g=~>MD6jT%YsB#3g~>V^1tQ$ zzuJ0_D!`KSfAjOt?}z9Am!E%md;WinKlc1@I|16ndAHDh){q1E^Yf-Cz~7Ien;RcJ zZEU-jTkbyjXj|nE`KPh}=XIKWRQ-SJ-u7l=|KHoZ)&D=rACv#*>aecDy3&zkd=f=| zrAmkn5#P%zd4hO#47UgNZYgHyBp9nvI+dAm@u=4`h+sh@Cv=a&rg>4D5I?Y^b7;#{ z<|&%jF@{KTbc$pIoX1%qAyi|YkNXgHJ7dg$=mY~_wp9O14D4Rp954f}CF0&-bDMsJ zf35kZx}4z!>^w#^&j8COHaAf!cKy?Ub>c&Oo)Oa;ee|^0r*6p*)5|r8;kpg^H1!qA z3XyuIu$X!nX^!NdquHzs;&F+DFb<4_?I1}0RR zAgzrz*}9-E8?Ztn2r5!zJE8eGztYPKG5qroD8r*|iC(f}<)y$cJ0{84a`5nQ5r)4o zd??-w2V%IkHTYsvyg1oET^k}R($fddleHoGyYsO)hcQt%mAI5w3RYAN#JAa8 zjd=o)c7m@`pX=yKFL6cGSd)?_A!cyBs>CY@vjQ_Rnrxw6lT-si7|Z${St6b3AqAjf z77J`yUf(DWzj+|W=|x)G0M@LiAV3CsgE5fB_f92-^!^YKv8YuGBjB=dkWh~owkY*Z z@tu{hEM|6nZcG$K3LD;@&t|F|VeB)Kbs1Y|hQR;W6od%MDKEeM(Iy(OAQjTkpNCc# zqAtMeS51LDRSmUIILtzCT6A2*cP?zai0ILQ(h^M0#2n&Cf=jZ5#DIK+;9qrd4WKMP ztFmzYAHdUVn`^^?*oSytbfAL#4Hk)qLdGTDwZY^dRE`I(ww54IufZ~hK$H8fF3g4m`_PqJpXa+sLb^)%_ zg8=i5vY_WBMGLzA=&CMCd7*GXX5Jcfiow*?k#64$-*jR(_?LC@^*1)S)9-bX=7ja4sz-}w`o*tK zzv)foY)3qmGvgL=|9uLz4x-=jTlo>Y%}<+e?&@Kz`tjC)6?ZVF{`YyU!4e7F<*w}c zLVNK*4(Y(1d4+PCC~U&4aHswVE6JLLx^{R#Gl^xRXiC~sIRoJ-XP9D0pN5bz>j8v`8mn0Wd{3}xo+udKIw-g066@jQ~1x_|E=9~EP`)?TRB;NrYEcs+AG(eTiU7$DF&zQ#qb z0x=5f%7nM=!O@G~ux~f$%AM+lT>`C=6Xg!Q2VZU1arTv-0)K-?26@65<^qROnO>xD zo-UbGbd)^DF@9&K_WbzSk|^l|?$_EVixq|q;(qM8Ye$W7~o6T(DM+>s2-&vd0S zDRLM_mj0~9;`@{5&jwmmqLgT06mat9wI3Pfkf%8RX$xKcWo4j3@fL#NY<|OS4BvuS z=9ZQrA{vJ$pmqpx$Jv7B87CXGIDp4J7?goNOYqY!5?UC+zgMUd)kW6NFog^XFZJa$ zd;ub)()?n>(qIRn6rhQifvdX05TW@6hBM8rkNWyDg)n>4iK~%>8%SD->r&2Uly4yg z2+vIQ6$e;QuN816q!VEjHbiKNLWid*EuQQk#wL%AVz^NbVM;dVR8U7Y{)qyZ#>Hq3 zAElwJS+$gU1(8e2+1mO*5Grd$Gt>ePQ{X6)6$AQ4G6yAVCd)b>X3x2>x4Lj5M$*GGoq&Njht+(hN)C>NZsZsg))cNl zNQi+r85OWwa#@zeHQXN{=@1#XN3*6`O3*!CAtkenS(qa{HI>$3W6kqYQ3#|He%eP9 z4Bi&gi@cu#_(Of!e+_p$o$*)=MW61W>a`r{t!l!`)0{{-CZv%fkD?On?(ZL-9=<#{ z+dV$s{rlPBv&YZR9v>b&**|GS7-`=&=)qjN=$p4?INY6h`vMx998Ov@6f#zf3^-S> z5>H>8oQh}9Pay;w_@cg4mBI-3(Pi;~Vj+2>k+lxFWJaD4Xs$7cuoZ%^MnIim#7Q87J7 zxq?ZdW09%+qP_%fmAT!14!emSZ4N&4P?o^_<#_UB^Uh&?`$2zvTEUw28D=bi5&eTO(r&C$0%sD?G%zr^f5`DQI zi^;r1*)lG!0sBhHDW59m3+l^Ni_NmH4+MrnT}rrkLvE+a$0{E!kbew!vXvj=tqR)5 zm_vnjlJj|*jaAtPB?va+)7}3#+k0{dQFO4#hkJl_wSRCj6#s^d2hVx+{pafetAW`V z-_T!oxOJl{M;q>!$?rITEC|etOF zM=us%v;8nuSSz%I(63YZnnae46YyWMC70b_y(-D>16#q^{k53avw5wHbaxgZixeDN zQVc9obF4df9c}h;U}{6ZSY2zs?PE?-Ud+)_J--sRO zMYi-kG&m*g7#3%$Q?3Z|H8r<*^Ao7^ld$*NGyRLQX~99)5pAHD{+1irr+h{uqv z%j7jA6%x50*NtFG^0BH_IZeT8rE^|)!n9wsW8lWnU1A8r$N(hyI9GZ?8zimhgHNG$ zq$^AuUScb#0Bk#ORgY-GdgZidcj5*`8=H*grd`k z!y&j%=szReW-!3-h$cHiq9LG%j<;WQJHZwJO}Vc{V_HL=)}MdDaDX>MUAq-uCo+j& z7-()s_mnUbyFX|SFuyrHy>X`D@qA+@4|jMHM`bZhE9KN-r!h3oM>d|h1zTZkt2ESO zUZE|q?~;a4F8htaUohuJ7^2|dP3}p^QwRGci3Ij)zyZ()j~^n)WW@;lgSLk%h;C>g z&@&G>qJuP32b_>WYy;Q=p9x#Q)IeJ3ZlG8lb{&7|*oTiIIph3fUbkLv?nXOZD1l+5 zMY{&QahQk?#cusISy^)hP$*_TKY`(!hCF68xDP>8V&bH=D2#AG8Pd)`d z06qPSK$D)|s@iT!LycDy3zB;-lQ`;zPiZsZmAdq3;Hy#248r??yW^c*t6fdWTs--Z6l{1mT8KI8c zsI|Ru_pUfnWnU{2T0;uO8x37%8KMDrTJJ#9*L=ljJ;7y^px|x0v*uCJV4po~f{_L4 zx{U&PRYML` zN}dSP)))_3lz51Dy>vpxn!5a@zPBvXrURNE&vP5K)I4;wu>&Gx7$(ugp6F9+tmGJA z*bE;c-Kk{I7~?NwX70WiUxhZB;Y8J=%b|`X(7gzm0f0OhR?PKG@7I3AiV|OcYq{t* z;ymp$2s{letrg-SeWXPml-=)^WN)dO`-TX~Za1 zEp`?QS!xKUGC8X(JT2QuFx|)DEv*N@SlO1%{Wf^xJC)76EF=@bR~Hyx*axR8$3B|X z*ZS6@^x{xwIG`C5GJ)VNK@Rwqr91zL>FdT6at>64e0CT?`V)sAQ7=&n)W!Ezkwcks z&^Wcq`Qs&GkkJtbP=zC7pe^S)Zf*~gUPrz4b&V7aqCKP(2>30#L^23-n+80Ybl~o(YY8V+2KL^k?wE(RlBDeF}^mtaF{- z6E8E<^DDS=~SK0_04w$KMvWf0ZPp*nIqN*JP$*$dFt#}u9Kno9gq zY#p9lN3vMZ>rpy`<75C4%tDI0cL{I#t`3{*4cDOHQWNo;>F&lJ5mYdJ0dUSW^tc$$ z(MZ1ptos2o+skTL0Phu}z-xWau$b71XW>I8e^a1nU7kbjn;!`pyGvKUh!sv8GJ8a~5P zer8O>Ituhq`^?lhr4wa1i+^ljP-|&5q(v*cd)J_2LX@8NP22?B42qLz^zK9$?A8-8HVBJ43Fo5tnAO$1t@%h{lC%RMc5KfCL z2W}YJ4m4(HSf2;S){cbSf`bfinK?t(yr~@6zYdV&Cc?2RLgD~2#(c6Ab>0v90IZ%J z54op35~79W!tab7_qS6N^q~nOcXkn*95&*G*R%_HhvL}5HFEbZ*kn+u-M!0+8qN|p zsGWjq_)#&NIVgK~?@CZG@7@&~*byqucm2&qd73268?NebEj;8JUV`vW9IJ=L55IX3 zS+u3~vvhn8g{@lA61>_X!oFE$b;22Xcsa(s9h<#|0``W|u#uScf3DMc<;WDV!YzT9 z7vmGG3n%s19A?9yXz-8(C#vbJO+;0`b0w-*DQ2PYHCbhoKA-d8^U${*6qTrOjtc$} zBOTzZS|5nhQeHt>E?^TX&`L53)I+akn0uwNH4vTj&`7CHrYG)zyoP|QU^fDV{8jS` z(0gTF#n%BElK8*0?qNUua3?wtjQ0o`!bf51UXt!u;|u~tBu}l zS4Hr(3=LyciSDX~rL6gdmSu{4B3vdLP}Wt%6_jw^R%i8PsjgAu*1u3mDyx>Ck@?^Z zrLY>WHTbF(DQpRKB<7_p9j$+~nU!G*BNSUaysUgl0z&zSV<0IYG=kgu zF2EW}=RW7WoiDVC+bq#LAgf_#HL^F@8&}(=;Z>&o76uAoMVg|F)Z@cq7=p_qK^`M*kfl>3%fCAwi@KQz}GiM zL_ET&*+W=-EqX?6^Ueb=u!5_EF$xFB15onjhJR>Bcrn6_z{@wL131O}_lY2bx1<(4KH^AG&jX1_QuPwx6l*Jb68p=ec(zw@k-B3EJnwN->rqTAiGa9J5tp z0G`PH4Va)&R?cIB&OvuGfn5Rbv~B6@y{tg%T$l@*2WXrhS`XUTBtu=j(52=BFQP!J zGz2P=Ab!El3w97tW;CGQ*f-dZG@n5;0<1U(hdo4zE`%J_bAbARB{vz<&x%^@2rhST z+(!n6M<=q6(+LIw*VYXvFG{7x{rQYE`&b>m0UIU2f{iCTMhj!A8<$Au+AWYymqJh- zPYyb4&Mz?`eenGuOmoORff0{JpRyAYA_K;U2jg?YVU0+#U9-|`vetfA#34}H!&2=8E|b2vd-qsg3t1P_ zbVLwBckkkH&E#F%+T7e+8*;xDB|2vd0Y7`M4ctDDAWt7{ux?jhZ2ljor!O}D4;Dx4 zU^vsKu=APE@Zx)27(gbpMp%Ye`~364=b!(dwIN(aFST9*ygSJXP)Tg3e1py*-V)Fg z>~y@@>=RNPnp1-*{dse+`Ni5$JD9)``r>52KUR4`amizPP1J?`tVcGnuR)*))Pf?K zIVF{^>ZV=|G5?*)_65P^2mr3T8FC5f1h_JDkxlLc&KT_`gDeI6>pWAVBF&wkZxIj< zA+oH+p@Uwo1J~5fW;vuCxLf~%1H%hPhi6CN+q6dF%{`QZ5Hskno z)i1DYB2R8;kT2eQ{%&fSb{r-Qv$%lvWzd|vcCp90KO2ou=vW;x_Fq!WkVi?qC3>OH zFX1om#9;Z?cOqYFG7pphrs`*`pJMS-b4-zu;v&6Lxu(&3qNj`Hrdi2BfoqbFfuo#q zQ_Z2)_R|UJaxQM0L(@xH+2V0Ty%>2t&-HqcNf|`#MGyE;vJ*Wub-<72%=x#XY;537 z;3a^1^-1ng^g`8dL(vH5`XEe=%};}_9URXYgbq}iyyLW*Wdw1B$_c1cx&SgUG8092 z>00v!;t7VT%x5j@2}?FsnYv(XQW0uxx>xezT*)*8wQL|BL&&zH!8t>v3es#<8@R!# z!$1GefBk_W*K%4I&FQa7L+$d!x+1YDcem5mdw8C(H2GB`P1cU3%_F#I+ z;=jR$Qw(!jcVck+nt}919wCsRLM5yvdcmQnC#2V5PzrW1WEVbQTcLKto;^(=Swjyk z>u1N@cW|U|H&Ojhi=aDvr4~bfIy`{Lx}}vl=2kwi%=dd{R6A`Yan^T`k2?-1H@e3Y zLoJkeWl*|3ysXZHrR59Z(P1a{$^+rD&;xM=7d=HzR58bn zYLV<(!;IL0tVgsq`^K{Kg_D^3i))Wg0$a4nC=Heb2SZzmJXjWD(eTLoQ+tct^}Y1q zi#rW>%xYS02SK^$IeEb*^Q@D!zcD==uMU$V@bkPgHBeiKQ2_0%mB(Ui$S3R8gl@AT zlLf~9q{Y?psW6;(@n;f8{7>&p=3o~$F$zW!A-J$3j5b1 zM&P1*zx&tWocFwY1E2XP!fc*h&FtQWwe9^7S*JnRyhps0R~&|*Or`Wsjtg6ii@vyv z8y{CA-67mG5P2LJ3NyR#nrQL|DQ^%t542(*dO>(bO$IVySFGtl#~)DkVHEv=wOd(c zsq!+YD{TxQT-OU#qX9tyfT?dJO3g&vE{-OAOhNY)Y@I-VjZub;E)Ni zf+O~%oc4Y`YrwTQg7SRieY%PFQw zFHVaMa%1abh9Sw|`&Dy!5KW4{6<-w|kB<24H;Jp!9U{q_1{H!Y_#QHw{#koc{i&GY z-)wb753Jab5lF*YUun4?m&KH4_|>VlM|^EA@I9XhJ2V6*A-fH&(984^zlxp>V>)#M zmP`Z9Rh-Ga?sVm3h;{U&pBwgs|GWLP11K)bEfXt)EPj)S=ICy`W%f9WKU`<49kj_2 z&%%AwE(1cz1L;GeZ}vK(^FuIBQ}|;HGuXWFZ;t8<+qlLt<8O^w;d zrlUtJW~SS^!*oUwFz((%8=9z#BGawHZ#A$x9EULk#ar(%x8Pk&srv|b$tRwjPh%$^ zwJmHcliQ1U4s*DcdkFsV&!i)1EC~|E5@&hZ*}Z8EeCU*}@k#hFL>Fn@5E12*Rrbo+ z47!etJMqM1txshRk%ySam-oSmw8XHhiP2{#z|ak`7;=8M%&z4EQ{xA&CtnOV7}XFS zRW|WacWzy}cT5^GrL{p0HA5mka%0SgqK6TOUUK^o-&yxTC+D+CSwMu)hR{jgiM4P+ zm=IJ}N-Lo-ek!dlDYTxhZ4Wp_UC(pF^cxt9hK$$>kPw^%KJ;x|L!n-$khtYWL+HpX zP=s{XE@d(3w*k%Bwg&-OBDVE(_?d^L)FKW&U>yu_w9#VR;VQ;{BMv}pDaQ{5ZKV(Q z#6ssiN;5&;fTw#$O&5U6n2fu`fTN=4AZm_eSuO~|a_9uX4|NHcE46OGI0ddBSmQR> zWU_!zvT=#t=JN$@4^LXrmw96^#Ti;Ey^_c(yq#Qf#7;ETF6OPk;6TkGcJm^pipg?; znQVB>Hj`;-m{a#={Tta+XUZQozk+uHFa?fNa?;XEU=+INB)OCcSw+uhjSf z4LM^_DECn7%c+ zK}J(YCey7*TTP^eh5|Q753BBB=)sKsuQSLjD6)e#V=!TCUc>X8?0Zc)>Eu^o_&zT* zK`gZCUGW61Pf5NdJ^>%LWjWdn5uZ~#5MF2*UXjyXyN_n`HW0iOgLH1h)t|)0V?%5B z%Woi6B%7jtqa+?ZfJojBMSM3dJ&4QGZ-s@zK&-S9y|Dwe9>6v=H`;1ggrA_Qki^#D z;Z7{iB_Y~9^iptdfQkqOi)}T&E@NWXo-@&S0eYmd7?}pEY^POraAUEbcFw`Is(U=( z-t{Q434lB_uQMF3Qwjpg*;VEaNO!irQ+?5ibIK=$aSZ;bapbs12u!P7fdIzqQUQL5 zQv;I9q;{X^`tFJc7TzFRtu_$TNcIA~;L8XfSLhnF|M5~`HVGH|^JySvjBZm!$VJF0 zz5>t7;F!*XsWxz9!YhB|#^0L07Tpn*Q=8KruESFdI!0yIpeSjSR4r@QwqIf~(F<7>Mt7&Ref57ejAyV5i9M`zz^J6gK5k@q?s zS$h~SJZz*+47e@?BGEzdPX*3=0(;ddeF%G}0Vs8cF&rXvwMP+rqpaFn0N-2 zm|!}Vd^r>mrnJ6mnZkz#VmDuK?wm1haD)tYE#3TKS~=Yv1rn``>JpT;QCg1XKtKyI zi3Nl)T73YORI%7~?XVux-u8DPOIV#sN960t)4;fZEJaQ*u25DKvw?V;A|SE&wyE{b8B&8)GVBB-z|Bf(!KZ5a|z?eq`*9@lBoI(nN(tqUgV!*U?CL{GVzdlY<*c#BRVc5#C6P0E4*x?Vck`qP1P9gi18B78X3&UkW_{H%HDPOJhx*6c-@DuO)?Zu~nKa|8CTPNizu0>1bYUdL7?|o|t#& z7Xng7BdqTu2rpBaJXaa`eBo2I7q8ga3-;j)u-V$t24O?E(v+F)PwxYg7qz55_!A zXO0kX7l{V5Z>?C3m3n6)8m+dAeg_m?$0tpnP4nbf3Tt4%!3t0M23ee&GjdT2DX$#l z8`0O`jON~9;mDgq2vt}cv%tORAF4|&)P=Tk1u2wo%Ycy*9dE^g@4|smrfCBf zZ*b1DqPB7hl^9!Xm15i0qEA@4f9RTRnn1}!n{jotf{lu6by;D*E&mB{8}EtwlMv}am( zJg3tfY?x+?AHZ!$<#kC>1r(=4Xgylv#WI8!7mnh%x&}@PbXL?Wson3SaJ(md<2RS} zmP=6`fCY2hI7KGAU?&`npk7JGm&LJyeABr!qjBWjDCabG>`%L#pkk*wPYX$_tWzFJ^b z3zbEssMum*!1b^stOvDH>7zwVOecnt*onbG4-3A+QwEk|Agv2kQ}wMLT%8+f4^2b< zg{rB9LT}v<`^Ipd`ZDtKi!zJ+N`))<F<#ihwhq>z@{j|WQwQ24ru*%4Ons4lT0 zHok;4ur?qpU4VE1t-CB{Wr~=~ZR>m5`AIX)M}Wu=%h;@QaU>Vl;J_I*QgXgKefq>o zwI-}HyyjI4lCv3Dtb%F)ayENXTol2t72u8)`6(3FKHze#L6gzE1TV*nG7BEms;YAZ z%?)ZtV>&EB965t?x==Yvj{E|r7oXITepgEnd`Ep(PqP&~#ip*QN22uz1mV7$+v6mU zg4zygjp>!HcN-+uSkP4N;s|?iv2@`zt_!zHI?98_n7mA*w;B`nu)>()i7jSCY=J>A z6~2j3{XlISaRH6EC;`ubKzd9l-t(SR! zYy$h%^yJsRd3!SNYS*QoWytp`#uEY(vf;8qm)kXz&(c>EG*!t3y@IZBZ4Yv46IX9=l$E)sk3K|u&PiVoZxZHe1hpFX7^)SqoPDe%FR8B}t@YxS4!^2idZ|r^gC|g}9?;ahxf?1y& z5crc}T}+Cns0fJyYlzKCb(N}XR4zFwPNz3gWC;bGu*A`Q8fPepuM7{|!1-hp+@ge_ znd?fGw%ApVu0cBjPsPi6nyn|=bc>oAs+qNXr78!^!Jm_%kH)??afUz##*GL^b4aEO zZ6Al=SsU8>i+>cyj&V9ke|aO`v{>=1Gv~BL$~V;YXp!mj0%G*-aO^3mx1@VEdZ+!o zaXLQSi5!{lh4bQP-KR(EsQ1oB*|-x3Yc+qUWvV((X)o%!`8X(1&=Kz)o)KZlP9G3i zDypPDgJ7bPGW$#CK&h-|L4B}P{yO}qBeK5{zqDF^5+aLPY;JQFUzAYNmK7eb&J}YL4-8u_U$|x=lP;_h#hnH|+7R6y{$xc@FaEvF&(|#%A89JH?%Sw26Vr=J%gsA3YqwX%Y0UaY zWt5;)PUChO!vH0h2lZOy;oKhXh@Rukbdo*Z^K4sY3_ri|8Z~Afn?1f3)ClzFZ(OBO zLR{AM?BUK*vU#N+rZYr3AmM;97n4ak!n=jdT<~;M{SL_jrv{JUZw-2V=Oodf8l0qvbl9i%E`K55Gt25m69~ zi7#X@9!Sd79=uzi@w|v>Iv!{0T9)CZ+P&f*x_$8d8tXm!*Ib@+`w&H>d@SCzD!xiJ zExy)1=$ue8_ZQl!dSMR-Xu$@Lpwd*0nkx7c`K7+jby{;JJ2%s9bodb0l^R8}PghD# zZK=xma3@wM)7zCTSu9?grCBj;m1sMa&o-*yO>@mJKDg7$JXme))$nnd>QUX(TMtx{ zzREA*P#jZ0R8Z3cy}LT(aMBW8Vrsde5~bDnX3e$cZ6T<;76Z!F&qnTDAgsscmayXuN?PBV zM;xDq@Uphr*dI$`HOv2uA+H|8wYZj`ldz`$7$gk`ok(m@S({T9Z4?~T%JM!rVyMe} znE?iwP==jP{v&6eQs~iyprV^L( z3ilYPXk#Y@xxv{@ByAo=Te@S{#?dCzJ52}SxXAC+IIwWrc;k!>Fh~M3m5Ke~sn-%N zH~Rm>;Skgoa^mS9DHIfJKFqvdcL=s#nSPK0%C6`$4P>?g`PwQF$><%S>1hi{%9@ljmsp!-I`q!iP0RN+MZOLKV1@s@9 zb{XM6X3cI}2)=UpW)K^k6F2{OGBMSOOli(J5O@w#N@vtO6eC?XM0CjMUR0r*vlEL_ zY*1a#Sr<*t$LMFwFGP-Z#F0@m8l%=x?bv~1{_FM>c;k(P{JGIEo~5ZNF!b16D66nM zN;f)k6xFCv>>{2q6@ew|#B2&)|4s18;4)}rq z?k1}dO*qS;e|&Iq^!(Y$0b(At!I>Sr23LBj3&zmzRFx1!-BsbdHf@LeTF?JxSe&UX>!P{*dKl=*99B>o5D>7VT8u}<$ZAGJ0H~e>0stNQ({D=E@s?B zytET5h_RX#Rmy1#v$h&u^cC;aX1|jQX4C1j8&Dr_8mqocJy^nri8tG2+FlzrHVOrV z&vz+8Q0EvCTs0Goe+!0>BL6WI7B3+o5vbVSV5br!=rwmoxWm9DPsg+7E^wJ)CM)-y_h1!8-1Q~X<-BohB-6dYxeCY;V#D&Y5TAmvw6bBa47Z5w>4i^d)_-c)IiN{8piM*&()foUx zmZWszFszH3;YLzZy0^>C!76Bu^|V(%*x9?fy)zrMBBmG(d3mUjzw1P}>!J&Y<-Yv5 zX)mN8Si)ye?1{|!(lvkIsdTCdC&!?w+n&~96mG85hT&?_>=-!as1qtQ)pF}_f-l+apH*VEFs%&LMy?Y;S8nb~&MZw4py3=)R%tU1`9>rtlA zF1e;VEb7~g#guT)qQ|2R?V!G75G&YP@ZX>X`yScKGIia{4v<6S>%b)(v6Mt$TWAlp z?T1D@vIpo`mvUt95_l8B(dm0$PgknE+QMO6ZLi0tui-xW9{NXPdi!crj3Yo{40IBm zgrZThXlu8LX{na#!o}iRo$ExkcN(>}cp3M~Y^EfcgU*%ynExSv3TgGDI)6kB+ALXJ zCumtrLv?Z7#)cu7{|eO;-Qm#==G&N0P=AJPzMLq~M0goTS1E-0!iDz#Z|_@|+c>f` z=eM7tg5g<#Yyc!B%k8EtDQJSjNXr4a)A~7Mn2z&!0r0F{t%PF)n8?0Ch1g8?6 zWxbA-bJIAw)}*wH1A1>CUqd`N8;u=fFX!mXx5ZT?zW2xh>?BO)ZMFv!G;_umR?_*l zwrWAw-P)os3k)fd*if>1-lOout!!%x^VGJsvTb}7ZKGRTVw@lb8BG&GoDcJJW0_#n z�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 diff --git a/typescript/.x402-vendor/x402-core-2.28.0.tgz b/typescript/.x402-vendor/x402-core-2.28.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..d567f017e423add06b778209a1ed7f875dd3b5b0 GIT binary patch literal 422113 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

b^f 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

  • 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 %bo`A|%qFR@9;;D}s56)O_QQ8MK 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

    R_$s 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%0A~ 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�)3Ri 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

    ^wH(WsSl)X;wJ zxo4=Uvf8OC9?XTo_=qnOEmfJUr(RDXz1Wo0fO95W=tpqHP`y1b3UEih;8EciD9&`> znhFv;CZjl?3wLD@OVk64mIy>F@a(Nv?n|-E#nTP8@5#Sq^NgQE_KtqQ1*MiBUQIukHSwNM+gpvcHsnKy_m~F zpNuFsoFmc4tWIzX5gi`&pIFvY7weFKY$)Z}rf(zmCirTNy+|Dpp6Ki7Y7

    @T@sH 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

    iqV5!&^juX1#n|l>G`|^|Kh$%cx8n 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

    Uww$LN0o@V3dwnmRFkJ(P!K2uPqXDNhre@m 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

    132qT7gbR1y5 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∓Hru(B0&oRWzeT*gBd~TPA3B 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⪻t2B172gI4 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 Tnl^qy+;a>h{#Xz3xZjF+$?xsm{ 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]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

    ~? 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 z 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