From 1af67098f65b119afdd7034dbdecfc61e9d6087b Mon Sep 17 00:00:00 2001 From: benk10 Date: Sat, 10 Oct 2026 20:18:12 -0500 Subject: [PATCH 1/7] Add isolated USDT execution fixture for E2E tests --- .gitignore | 2 + CHANGELOG.md | 1 + README.md | 19 + docs/usdt-fixture.md | 79 + shop-order | 8 + usdt-fixture | 7 + usdt/biome.json | 7 + usdt/cli.cjs | 55 + usdt/contracts.cjs | 220 ++ usdt/package-lock.json | 5104 +++++++++++++++++++++++++++ usdt/package.json | 20 + usdt/pins.json | 12 + usdt/rpc.cjs | 89 + usdt/rpc.test.cjs | 47 + usdt/run.cjs | 265 ++ usdt/setup.cjs | 54 + usdt/shop-compose.yml | 26 + usdt/shop-rpc.cjs | 6 + usdt/smoke.cjs | 117 + usdt/wallet/Cargo.lock | 7338 +++++++++++++++++++++++++++++++++++++++ usdt/wallet/Cargo.toml | 17 + usdt/wallet/src/main.rs | 119 + 22 files changed, 13612 insertions(+) create mode 100644 docs/usdt-fixture.md create mode 100755 usdt-fixture create mode 100644 usdt/biome.json create mode 100644 usdt/cli.cjs create mode 100644 usdt/contracts.cjs create mode 100644 usdt/package-lock.json create mode 100644 usdt/package.json create mode 100644 usdt/pins.json create mode 100644 usdt/rpc.cjs create mode 100644 usdt/rpc.test.cjs create mode 100644 usdt/run.cjs create mode 100644 usdt/setup.cjs create mode 100644 usdt/shop-compose.yml create mode 100644 usdt/shop-rpc.cjs create mode 100644 usdt/smoke.cjs create mode 100644 usdt/wallet/Cargo.lock create mode 100644 usdt/wallet/Cargo.toml create mode 100644 usdt/wallet/src/main.rs diff --git a/.gitignore b/.gitignore index 72f59be..3e31080 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ target/ __pycache__/ .marketplace/ .shop-order/ + +.usdt/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 5178deb..b4eb8ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- Add an isolated Arbitrum/Alto USDT fixture with a real Core payment/proof smoke test, controlled paymaster failures and optional Shop USDT verification wiring - Run the Shop's marketplace on Synonym's staging with our own Paykit Server v0.1.0-rc11 behind a Cloudflare quick tunnel (`./shop-mixed`, profile `shop-mixed`) - Run a paid Shop order on our own Paykit Server, Lock Server, marketplace service and Shop with Synonym's staging homeserver (`./shop-order`, profile `shop-order`) - Rebuild the Paykit fixtures on the paykit-rs version a Bitkit pull request pins with `scripts/follow-app-paykit` diff --git a/README.md b/README.md index 0ad76fc..c5d8a56 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,25 @@ A complete Docker-based development environment for Bitcoin and Lightning Network development, featuring a LNURL server for Lightning payments and testing guides using the Bitkit app. +## Local USDT testing + +Run the shared Arbitrum fork, Alto and gateway without spending mainnet funds: + +```sh +./usdt-fixture setup +USDT_TEST_ENV_FILE=/absolute/path/to/private.env ./usdt-fixture run +# In another terminal: +./usdt-fixture smoke +eval "$(./usdt-fixture env)" +./usdt-fixture fund 0xYOUR_TEST_WALLET 10 +``` + +The private file contains `ARBITRUM_RPC_URL=https://...` with historical-state access. +Requires Node 22.23.1+, Rust, Git and tar. Keep existing staging VSS, Pubky and rate +services. See [USDT fixture](docs/usdt-fixture.md) for versions, app setup, pending +payment controls, proof verification, the optional Shop overlay and simulation limits. + + ## Services - **Bitcoin Core** (regtest): Bitcoin node for development diff --git a/docs/usdt-fixture.md b/docs/usdt-fixture.md new file mode 100644 index 0000000..11c4344 --- /dev/null +++ b/docs/usdt-fixture.md @@ -0,0 +1,79 @@ +# Local USDT execution + +`./usdt-fixture` runs an isolated Arbitrum state fork, Alto, a test token-paymaster signer and the real Bitkit USDT gateway as host processes. This works without Docker on hosted macOS runners. It does not start or replace Bitcoin, Lightning, VSS, Pubky or rate services. + +## Versions and state + +Install Node 22.23.1 (or a later Node 22), npm, Rust, Git and tar. `setup` downloads Anvil with a verified release checksum and builds the gateway and Core wallet at the revisions in `usdt/pins.json`. Alto and viem are locked by `usdt/package-lock.json`; Rust dependencies are locked by `usdt/wallet/Cargo.lock`. Core is fetched shallowly into `.usdt/core` to avoid cloning its binary release history. Its published 0.8.0-rc2 source is used without modifications. + +Runtime files, test wallet databases and process logs are kept in ignored `.usdt/`. The foreground launcher owns its processes and stops them on Ctrl-C. A new run starts a new chain. Do not restart/reset the fixture midway through an app recovery journey. Use dedicated test apps, seeds and Paykit peers; a chain reset does not reset their databases or VSS backups. + +The upstream must serve historical state at the pinned block. Put `ARBITRUM_RPC_URL=https://...` in an untracked private file and pass its path as `USDT_TEST_ENV_FILE`. Only the read proxy knows that URL; Anvil receives a localhost URL. The proxy allowlists reads and blocks transaction submission, wallet methods and node mutations. Cold startup and new account/storage lookups can incur provider RPC charges. No public-chain tokens are spent. + +## Commands + +```sh +./usdt-fixture setup +USDT_TEST_ENV_FILE=/absolute/path/to/private.env ./usdt-fixture run +# Another terminal, from this checkout: +./usdt-fixture status +./usdt-fixture smoke +./usdt-fixture fund 0xYOUR_TEST_WALLET 10 +./usdt-fixture balance 0xYOUR_TEST_WALLET +eval "$(./usdt-fixture env)" +``` + +`fund` executes an actual ERC-20 transfer from a storage-funded donor, producing real receipt/history events. It does not overwrite the recipient balance. `smoke` creates independent disposable Core wallets and checks first-use EIP-7702 delegation without ETH, two sends, USDT fees and the approved fee bound, pending/manual inclusion across wallet reopen, proof verification, changed request binding and rejected paymaster authorization. It restores provider/bundler modes and removes only its own temporary wallet files. + +| Command | Use | +| --- | --- | +| `provider-mode healthy\|unavailable\|expired\|invalid-signature` | Exercise provider outage or authorization failure | +| `bundling manual`, then `bundle` | Keep a submitted payment pending across app restart, then include it | +| `bundling auto` | Restore automatic inclusion | +| `mine 3` | Advance Core's history confirmation window | +| `reset` | Revert this fork and clear Alto's mempool; reset matching test apps/peers separately | +| `wallet address` | Address of the disposable Core wallet | +| `wallet send ADDRESS ATOMIC_AMOUNT` | Quote and send through the real Core engine | +| `wallet refresh ID` | Reconcile pending execution, including older receipts; Core may retry the identical signed operation | +| `wallet proof ID BINDING_FILE` | Create the standard proof after execution | +| `wallet verify BINDING_FILE PROOF_FILE` | Verify receipt, token, recipient and signature using the recipient Core wallet | + +`USDT_WALLET_NAME` chooses a deterministic public test account; `USDT_WALLET_DIR` chooses its local database directory. The mnemonic and derivation passphrases are public test material. Never use them for actual funds. `wallet` uses a no-op backup adapter; it is an execution/proof tool, not a VSS test. App recovery tests must use the existing VSS helpers. + +The binding JSON uses Core's fields: `payer`, `payee`, `payment_app_id`, `payment_request_id`, `payment_reference`, `payment_endpoint_identifier`, `period_starts_at`, `period_ends_at`, `conversion_quote_id`. Use exact authenticated SDK values; absent optional values are empty strings. Proof verification alone does not check the requested price/deadline or prevent evidence reuse: the receiving app/server owns those rules. + +## Fidelity and limits + +- Real deployed USDT0, EntryPoint v0.8, wallet delegate and SingletonPaymaster bytecode execute on the fork. Only the test signer's authorization, test balances and EntryPoint deposit are initialized locally. Contracts check signatures and collect token fees. +- The local signer replaces Pimlico's hosted pricing/authorization service. It uses a fixed 3,000 USDT/ETH rate. Local gas/fee numbers are not production quotes. +- Alto runs with `safe-mode=false`: its strict tracing path does not handle this Anvil/EIP-7702 setup. Contract simulation and execution remain real; production bundler reputation/storage-access policy is not covered. +- Anvil is an EVM fork, not the Arbitrum sequencer or L1 rollup. Local inclusion/finality and gas do not prove real Arbitrum finality or Nitro fees. +- Orchestra operators, deposit monitoring, route liquidity, refunds and LayerZero relaying cannot run locally. They need provider contract fixtures plus a smaller live acceptance set. The gateway already accepts `LOCAL_ORCHESTRA_URL`; the companion service draft adds `LOCAL_LAYERZERO_URL`. Bridge endpoints are disabled in this baseline so they cannot accidentally use live providers. Use the gateway's deposit/bridge HTTP tests as the schema examples when adding journey scenarios; execute applicable local token transfers separately rather than inventing successful receipts. +- Keep this on a trusted development host. Control, node, provider, gateway and upstream ports bind loopback. Alto 0.0.21 binds its debug RPC on all interfaces; do not expose port 23451 from the runner or run the fixture on a public host. + +Ports: node 23450, Alto 23451, signing/provider router 23452, app gateway 23453, fixture controls 23454, upstream read proxy 23455. Android uses `adb reverse tcp:23453 tcp:23453`; iOS uses loopback. Core intentionally does not accept `10.0.2.2` HTTP endpoints. + +## Shop / Locks + +The optional Shop overlay preserves staging Pubky, rate feeds and Bitcoin. It enables Paykit Server's existing USDT RPC setting and pins Locks to the per-rail verification draft (`pubky/locks#75`, exact revision in `shop-order`). No new payment-verification code is needed in those services for local execution. + +```sh +# Start usdt-fixture run first. Use a separate Shop project and keep it for recovery tests. +SHOP_ORDER_USDT=1 SHOP_ORDER_PROJECT=shop-usdt ./shop-order fetch +SHOP_ORDER_USDT=1 SHOP_ORDER_PROJECT=shop-usdt ./shop-order up +SHOP_ORDER_USDT=1 SHOP_ORDER_PROJECT=shop-usdt ./shop-order health +``` + +Follow the existing [Shop setup](shop-order.md) to register the seller and enable its USDT receiving address. Fund the payer on this fork, pay the original request, then assert the server's per-rail status and actual unlock. The overlay's read-only RPC sidecar shares Paykit Server's loopback network namespace. Host connectivity uses Docker Desktop's `host.docker.internal`; on Linux, run the fork where the container can reach it through an equivalent private host route before using this overlay. Do not point the verifier at mainnet while the app uses the fork. + +The overlay is infrastructure wiring; a paid USDT Shop journey and browser unlock remain acceptance tests for the E2E suite. Reset only the dedicated `shop-usdt` project. Always use the same `SHOP_ORDER_USDT=1` and project value for subsequent commands, including teardown. + +## Checks + +```sh +npm --prefix usdt run lint +npm --prefix usdt test +cargo fmt --manifest-path usdt/wallet/Cargo.toml --check +cargo clippy --locked --manifest-path usdt/wallet/Cargo.toml --all-targets --no-deps -- -D warnings +./usdt-fixture smoke +``` diff --git a/shop-order b/shop-order index 783c665..7438025 100755 --- a/shop-order +++ b/shop-order @@ -7,6 +7,10 @@ CLI_NAME="$(basename "$0")" cd "$(dirname "$0")" # The commits the Android and iOS order-paid acceptance ran on (10 Oct). Another revision is refused unless set here on purpose. +if [ "${SHOP_ORDER_USDT:-0}" = 1 ]; then + # USDT access decisions require the per-rail verifier. + export SHOP_ORDER_LOCKS_REV=15b81eb0c25f693124d2d3ea956586f407170a63 +fi LOCKS_REPO=https://github.com/pubky/locks.git LOCKS_REV=${SHOP_ORDER_LOCKS_REV:-01cfeca14c7b5d385d8c3536c0cb4e1af81b458c} # v0.1.0-rc10 SERVICE_REPO=https://github.com/pubky/pubky-marketplace-service.git @@ -18,7 +22,11 @@ export SHOP_ORDER_LOCKS_REV=$LOCKS_REV SHOP_ORDER_SERVICE_REV=$SERVICE_REV SHOP_ # Its own compose project, never a QA lane's (a lane's cleanup removes that lane's project), whatever COMPOSE_PROJECT_NAME says. PROJECT=${SHOP_ORDER_PROJECT:-shop-order} COMPOSE=(docker compose --project-name "$PROJECT" --profile shop-order) +if [ "${SHOP_ORDER_USDT:-0}" = 1 ]; then + COMPOSE+=(-f docker-compose.yml -f usdt/shop-compose.yml) +fi BASE=(shop-mixed-postgres shop-mixed-driver shop-mixed-paykit shop-mixed-tunnel) +if [ "${SHOP_ORDER_USDT:-0}" = 1 ]; then BASE+=(usdt-shop-rpc); fi TUNNELS=(shop-order-locks-tunnel shop-order-service-tunnel shop-order-shop-tunnel) APPS=(shop-order-postgres shop-order-locks shop-order-service shop-order-shop) diff --git a/usdt-fixture b/usdt-fixture new file mode 100755 index 0000000..38f4c33 --- /dev/null +++ b/usdt-fixture @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -euo pipefail +ROOT=$(cd "$(dirname "$0")" && pwd) +if [ "${1:-help}" = setup ]; then + npm ci --prefix "$ROOT/usdt" --ignore-scripts --no-audit --no-fund +fi +exec node "$ROOT/usdt/cli.cjs" "$@" diff --git a/usdt/biome.json b/usdt/biome.json new file mode 100644 index 0000000..6aec24c --- /dev/null +++ b/usdt/biome.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.5.14/schema.json", + "formatter": { "indentStyle": "space", "indentWidth": 2, "lineWidth": 100 }, + "javascript": { "formatter": { "quoteStyle": "single" } }, + "files": { "includes": ["**", "!package-lock.json", "!wallet/target"] }, + "linter": { "enabled": true, "rules": { "preset": "recommended" } } +} diff --git a/usdt/cli.cjs b/usdt/cli.cjs new file mode 100644 index 0000000..a9c80da --- /dev/null +++ b/usdt/cli.cjs @@ -0,0 +1,55 @@ +const { execFileSync } = require('node:child_process'); +const path = require('node:path'); +const { rpc } = require('./rpc.cjs'); +const { setup, state } = require('./setup.cjs'); +const { run, urls } = require('./run.cjs'); +async function main() { + const [command = 'help', ...args] = process.argv.slice(2); + if (command === 'setup') return setup(); + if (command === 'run') return run(); + if (command === 'smoke') return require('./smoke.cjs').smoke(); + if (command === 'wallet') { + execFileSync(path.join(__dirname, 'wallet/target/debug/usdt-fixture-wallet'), args, { + stdio: 'inherit', + env: { + ...process.env, + USDT_WALLET_DIR: process.env.USDT_WALLET_DIR ?? path.join(state, 'wallet'), + }, + }); + return; + } + if (command === 'env') { + console.log( + `export USDT_RPC_URL=${urls.gateway}/v1/usdt/chain-rpc\nexport USDT_BUNDLER_URL=${urls.gateway}/v1/usdt/rpc\nexport USDT_DEPOSITS_URL=${urls.gateway}/v1/usdt/deposits\nexport USDT_BRIDGES_URL=${urls.gateway}/v1/usdt/bridges\nexport USDT_BRIDGE_NETWORKS=\nexport USDT_FIXTURE_URL=${urls.control}`, + ); + return; + } + if ( + ['status', 'balance', 'fund', 'mine', 'reset', 'provider-mode', 'bundling', 'bundle'].includes( + command, + ) + ) { + console.log(JSON.stringify(await rpc(urls.control, command, args), null, 2)); + return; + } + if (command !== 'help') throw new Error(`Unknown command ${command}`); + console.log(`Usage: ./usdt-fixture + setup Install pinned Anvil and build the gateway + run Run local services until Ctrl-C + smoke Real Core first/subsequent sends, fees, pending/restart and proofs + wallet ARGS Core test wallet (address, send, refresh, history, proof, verify) + env Print app endpoint exports + status Health, versions and upstream read counts + fund ADDRESS AMOUNT_USDT Send real local tokens to a wallet + balance ADDRESS Read atomic USDT balance + mine [COUNT] Mine blocks for history/finality checks + provider-mode MODE healthy | unavailable | expired | invalid-signature + bundling MODE auto | manual (hold pending operations) + bundle Include pending operations + reset Reset this fixture's chain/mempool; reset test apps/peers too +`); +} +main().catch((error) => { + console.error(error.message); + process.exitCode = 1; +}); diff --git a/usdt/contracts.cjs b/usdt/contracts.cjs new file mode 100644 index 0000000..e431087 --- /dev/null +++ b/usdt/contracts.cjs @@ -0,0 +1,220 @@ +const assert = require('node:assert/strict'); +const { + concat, + encodeAbiParameters, + encodeFunctionData, + keccak256, + parseAbi, + toHex, + getAddress, + parseUnits, +} = require('viem'); +const { mnemonicToAccount } = require('viem/accounts'); +const { toPackedUserOperation } = require('viem/account-abstraction'); +const { rpc } = require('./rpc.cjs'); + +const TOKEN = '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9'; +const ENTRY = '0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108'; +const PAYMASTER = '0x888888888888Ec68A58AB8094Cc1AD20Ba3D2402'; +const DELEGATE = '0xe6Cae83BdE06E4c305530e199D7217f42808555B'; +// Public Anvil test keys. Never fund these accounts on a public network. +const MNEMONIC = 'test test test test test test test test test test test junk'; +const signer = mnemonicToAccount(MNEMONIC, { addressIndex: 1 }); +const executor = mnemonicToAccount(MNEMONIC); +const donor = mnemonicToAccount(MNEMONIC, { addressIndex: 2 }); +const tokenAbi = parseAbi([ + 'function balanceOf(address) view returns (uint256)', + 'function transfer(address,uint256) returns (bool)', +]); +const tuple = + '(address sender,uint256 nonce,bytes initCode,bytes callData,bytes32 accountGasLimits,uint256 preVerificationGas,bytes32 gasFees,bytes paymasterAndData,bytes signature)'; +const paymasterAbi = parseAbi([ + `function getHash(uint8,${tuple}) view returns (bytes32)`, + 'function signers(address) view returns (bool)', +]); +const entryAbi = parseAbi(['function depositTo(address) payable']); +const RATE = 3_000_000_000n; // 3,000 USDT per ETH, expressed in USDT atomic units. +const BALANCE_SLOT = 51n; + +function mappingKey(address, slot) { + return keccak256( + encodeAbiParameters([{ type: 'address' }, { type: 'uint256' }], [address, slot]), + ); +} +function atomicAmount(value) { + if (!/^(0|[1-9]\d*)(\.\d{1,6})?$/.test(value)) + throw new Error('Use a positive USDT amount with at most six decimals'); + const amount = parseUnits(value, 6); + if (amount <= 0n || amount > 1_000_000_000_000_000n) + throw new Error('Fixture amount outside range'); + return amount; +} +async function balance(node, address) { + return BigInt( + await rpc(node, 'eth_call', [ + { + to: TOKEN, + data: encodeFunctionData({ + abi: tokenAbi, + functionName: 'balanceOf', + args: [getAddress(address)], + }), + }, + 'latest', + ]), + ); +} +async function seed(node, address, amount) { + address = getAddress(address); + await rpc(node, 'anvil_setStorageAt', [ + TOKEN, + mappingKey(address, BALANCE_SLOT), + toHex(amount, { size: 32 }), + ]); + assert.equal(await balance(node, address), amount, 'USDT balance storage layout changed'); +} +async function receipt(node, hash) { + for (let attempt = 0; attempt < 100; attempt++) { + const result = await rpc(node, 'eth_getTransactionReceipt', [hash]); + if (result) { + assert.equal(result.status, '0x1', 'Fixture transaction reverted'); + return result; + } + await new Promise((resolve) => setTimeout(resolve, 200)); + } + throw new Error('Transaction receipt timed out'); +} +async function transfer(node, recipient, amount) { + await seed(node, donor.address, (await balance(node, donor.address)) + amount); + const hash = await rpc(node, 'eth_sendTransaction', [ + { + from: donor.address, + to: TOKEN, + data: encodeFunctionData({ + abi: tokenAbi, + functionName: 'transfer', + args: [getAddress(recipient), amount], + }), + }, + ]); + await receipt(node, hash); + await rpc(node, 'anvil_mine', [3]); + return hash; +} +async function initialize(node) { + assert.match(await rpc(node, 'web3_clientVersion'), /anvil/i); + assert.equal(await rpc(node, 'eth_chainId'), '0xa4b1'); + for (const address of [TOKEN, ENTRY, PAYMASTER, DELEGATE]) { + assert.notEqual( + await rpc(node, 'eth_getCode', [address, 'latest']), + '0x', + `Missing contract ${address}`, + ); + } + // Locate the signer mapping with a reversible probe; check the contract getter. + let found = false; + for (let slot = 0n; slot < 20n; slot++) { + const key = mappingKey(signer.address, slot); + const previous = await rpc(node, 'eth_getStorageAt', [PAYMASTER, key, 'latest']); + await rpc(node, 'anvil_setStorageAt', [PAYMASTER, key, toHex(1n, { size: 32 })]); + const enabled = await rpc(node, 'eth_call', [ + { + to: PAYMASTER, + data: encodeFunctionData({ + abi: paymasterAbi, + functionName: 'signers', + args: [signer.address], + }), + }, + 'latest', + ]); + if (BigInt(enabled) === 1n) { + found = true; + break; + } + await rpc(node, 'anvil_setStorageAt', [PAYMASTER, key, previous]); + } + assert(found, 'Paymaster signer storage layout changed'); + const hash = await rpc(node, 'eth_sendTransaction', [ + { + from: executor.address, + to: ENTRY, + value: toHex(10n ** 19n), + data: encodeFunctionData({ abi: entryAbi, functionName: 'depositTo', args: [PAYMASTER] }), + }, + ]); + await receipt(node, hash); + await seed(node, donor.address, 1_000_000_000_000n); + // A funded treasury matches normal token collection; zero-value estimation must not hide a new storage write. + await seed(node, signer.address, 1_000_000n); +} +async function paymasterData(node, params, mode) { + const [operation, entry, chain, context] = params; + assert.equal(entry.toLowerCase(), ENTRY.toLowerCase()); + assert.equal(BigInt(chain), 42161n); + assert.equal(context.token.toLowerCase(), TOKEN.toLowerCase()); + const latest = await rpc(node, 'eth_getBlockByNumber', ['latest', false]); + const until = BigInt(latest.timestamp) + (mode === 'expired' ? -1n : 600n); + const data = concat([ + '0x0300', + toHex(until, { size: 6 }), + toHex(0, { size: 6 }), + TOKEN, + toHex(50000, { size: 16 }), + toHex(RATE, { size: 32 }), + toHex(100000, { size: 16 }), + signer.address, + ]); + const op = { + ...operation, + paymaster: PAYMASTER, + paymasterVerificationGasLimit: BigInt(operation.paymasterVerificationGasLimit ?? 0) || 100000n, + paymasterPostOpGasLimit: BigInt(operation.paymasterPostOpGasLimit ?? 0) || 150000n, + paymasterData: concat([data, toHex(1n, { size: 65 })]), + }; + // viem expects bigint quantities when packing the wire operation. + for (const key of [ + 'nonce', + 'callGasLimit', + 'verificationGasLimit', + 'preVerificationGas', + 'maxFeePerGas', + 'maxPriorityFeePerGas', + 'paymasterVerificationGasLimit', + 'paymasterPostOpGasLimit', + ]) { + op[key] = BigInt(op[key] ?? 0); + } + const packed = toPackedUserOperation(op); + const hash = await rpc(node, 'eth_call', [ + { + to: PAYMASTER, + data: encodeFunctionData({ abi: paymasterAbi, functionName: 'getHash', args: [1, packed] }), + }, + 'latest', + ]); + const key = mode === 'invalid-signature' ? donor : signer; + const signature = await key.signMessage({ message: { raw: hash } }); + return { + paymaster: PAYMASTER, + paymasterData: concat([data, signature]), + paymasterVerificationGasLimit: toHex(op.paymasterVerificationGasLimit), + paymasterPostOpGasLimit: toHex(op.paymasterPostOpGasLimit), + }; +} +module.exports = { + TOKEN, + ENTRY, + PAYMASTER, + MNEMONIC, + executor, + RATE, + BALANCE_SLOT, + atomicAmount, + initialize, + paymasterData, + balance, + seed, + transfer, + receipt, +}; diff --git a/usdt/package-lock.json b/usdt/package-lock.json new file mode 100644 index 0000000..d058b99 --- /dev/null +++ b/usdt/package-lock.json @@ -0,0 +1,5104 @@ +{ + "name": "bitkit-usdt-fixture", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "bitkit-usdt-fixture", + "version": "0.1.0", + "dependencies": { + "@pimlico/alto": "0.0.21", + "viem": "2.57.1" + }, + "devDependencies": { + "@biomejs/biome": "2.5.14" + }, + "engines": { + "node": ">=22.23.1 <23" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", + "license": "MIT" + }, + "node_modules/@biomejs/biome": { + "version": "2.5.14", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.14.tgz", + "integrity": "sha512-0FabLIjd4M/dm8VFI86RMaLLdgepzbdfiAL2R8cr7V81OYYrP1w7Z73KfAwPK5h9SrEBXTzNG2y+mBwPo9xRnw==", + "dev": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "2.5.14", + "@biomejs/cli-darwin-x64": "2.5.14", + "@biomejs/cli-linux-arm64": "2.5.14", + "@biomejs/cli-linux-arm64-musl": "2.5.14", + "@biomejs/cli-linux-x64": "2.5.14", + "@biomejs/cli-linux-x64-musl": "2.5.14", + "@biomejs/cli-win32-arm64": "2.5.14", + "@biomejs/cli-win32-x64": "2.5.14" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "2.5.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.14.tgz", + "integrity": "sha512-UnzaXO65L4tsZimFITFP2M121GyhDcWFrT3pL5ZJ5U4XcS/0L5VHYytVohdCf/gnDUFHgl2I9xnt5bV/J1kxHQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "2.5.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.14.tgz", + "integrity": "sha512-kiy8qA16K93J7uvFfWi4LgjqDpnRKyePAna6A0Y4jxyUga35SYpIZ2cNWlhy0lsfgqRenCpfymnJWEZ6mgpRgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "2.5.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.14.tgz", + "integrity": "sha512-vO/9BaU1n30CiFNLx49gMTMtbCAAqlo/EqFoG0BU3deQInTbJrmXSmTQ9e3FoDZIKQnvSLDVNL4lx1ci7y1T1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "2.5.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.14.tgz", + "integrity": "sha512-SJ9PrZkBnnH9dHJDnxk34vKs0GB2dbsioaft6/hPhWJ7AHpwYH83Isnhj0FSRpFkGgpVfJ1lds23ApB2czUDLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "2.5.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.14.tgz", + "integrity": "sha512-VHZRa7CCQBUWKxNwUvHJeuW03WFRgN5NWO//SDGOitc9QIeNyfA42V9zlKm+x82xFSG9Bzi5fi+hbhm9anO8yA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "2.5.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.14.tgz", + "integrity": "sha512-2kI5PrMgW5dcEZYrstLPmUmCwkUwZY39rP4BN93Vxbwcs2O57LDQOktUZZYPvvspN5i0mhGr3TJtF5sU26NUWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "2.5.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.14.tgz", + "integrity": "sha512-pHgAFffmZtaYoxavEsWEYNvcA7NwOIjLyqw2HXyLbt16xYryX0L4fMV2u0G9ag6LNYPIoqWaWqzUcnc6rLGGXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "2.5.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.14.tgz", + "integrity": "sha512-oJWmBhoHsnhUKIke+0gXDX0mltJrWHA1UyHsrTlXwX0TL64ilVZAo+TYZm97baecV0esBdpzy3k96q+09JaZUQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.6.0.tgz", + "integrity": "sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + } + }, + "node_modules/@fastify/cors": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-8.4.2.tgz", + "integrity": "sha512-IVynbcPG9eWiJ0P/A1B+KynmiU/yTYbu3ooBUSIeHfca/N1XLb9nIJVCws+YTr2q63MA8Y6QLeXQczEv4npM9g==", + "license": "MIT", + "dependencies": { + "fastify-plugin": "^4.0.0", + "mnemonist": "0.39.5" + } + }, + "node_modules/@fastify/error": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", + "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==", + "license": "MIT" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "license": "MIT", + "dependencies": { + "fast-json-stringify": "^5.7.0" + } + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/@fastify/websocket": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@fastify/websocket/-/websocket-10.0.1.tgz", + "integrity": "sha512-8/pQIxTPRD8U94aILTeJ+2O3el/r19+Ej5z1O1mXlqplsUH7KzCjAI0sgd5DM/NoPjAi5qLFNIjgM5+9/rGSNw==", + "license": "MIT", + "dependencies": { + "duplexify": "^4.1.2", + "fastify-plugin": "^4.0.0", + "ws": "^8.0.0" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.6.tgz", + "integrity": "sha512-SgC/B3/VZ8lTyOZ4Cwk6f1skWhmkNAaVfiX90qd5u1rRXGKk1//8FTUEN9GvOUq7rfWIqAYkA3CoyumYVpOS6g==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz", + "integrity": "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@ioredis/commands": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.10.0.tgz", + "integrity": "sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==", + "license": "MIT" + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz", + "integrity": "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.4.tgz", + "integrity": "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.4.tgz", + "integrity": "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.4.tgz", + "integrity": "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.4.tgz", + "integrity": "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.4.tgz", + "integrity": "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", + "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", + "integrity": "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.52.1.tgz", + "integrity": "sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-grpc-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.52.1.tgz", + "integrity": "sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.52.1.tgz", + "integrity": "sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.1.tgz", + "integrity": "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", + "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.46.1.tgz", + "integrity": "sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.43.1.tgz", + "integrity": "sha512-ht7YGWQuV5BopMcw5Q2hXn3I8eG8TH0J/kc/GMcW4CuNTgiP6wCu44BOnucJWL3CmFWaRHI//vWyAhaC8BwePw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/connect": "3.4.38" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-connect/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.16.1.tgz", + "integrity": "sha512-K/qU4CjnzOpNkkKO4DfCLSQshejRNAJtd4esgigo/50nxCB6XCyi1dhAblUHM9jG5dRm8eu0FB+t87nIo99LYQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.47.1.tgz", + "integrity": "sha512-QNXPTWteDclR2B4pDFpz0TNghgB33UMjUt14B+BZPmtH1MwUFAfLHBaP5If0Z5NZC+jaH8oF2glgYjrmhZWmSw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-express/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.38.0.tgz", + "integrity": "sha512-HBVLpTSYpkQZ87/Df3N0gAw7VzYZV3n28THIBrJWfuqw3Or7UqdhnjeuMIPQ04BKk3aZc0cWn2naSQObbh5vXw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.19.1.tgz", + "integrity": "sha512-6g0FhB3B9UobAR60BGTcXg4IHZ6aaYJzp0Ki5FhnxyAPt8Ns+9SSvgcrnsN2eGmk3RWG5vYycUGOEApycQL24A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-fs/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.43.1.tgz", + "integrity": "sha512-M6qGYsp1cURtvVLGDrPPZemMFEbuMmCXgQYTReC/IbimV5sGrLBjB+/hANUpRZjX67nGLdKSVLZuQQAiNz+sww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.47.1.tgz", + "integrity": "sha512-EGQRWMGqwiuVma8ZLAZnExQ7sBvbOx0N/AE/nlafISPs8S+QtXX+Viy6dcQwVWwYHQPAcuY3bFt3xgoAwb4ZNQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.45.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.45.2.tgz", + "integrity": "sha512-7Ehow/7Wp3aoyCrZwQpU7a2CnoMq0XhIcioFuKjBb0PLYfBfmTsFTUyatlHu0fRxhwcRsSQRTvEhmZu8CppBpQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.52.1.tgz", + "integrity": "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/instrumentation": "0.52.1", + "@opentelemetry/semantic-conventions": "1.25.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.42.0.tgz", + "integrity": "sha512-P11H168EKvBB9TUSasNDOGJCSkpT44XgoM6d3gRIWAa9ghLpYhl0uRkS8//MqPzcJVHr3h3RmfXIpiYLjyIZTw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.7.1.tgz", + "integrity": "sha512-OtjaKs8H7oysfErajdYr1yuWSjMAectT7Dwr+axIoZqT9lmEOkD/H/3rgAs8h/NIuEi2imSXD+vL4MZtOuJfqQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.44.1.tgz", + "integrity": "sha512-U4dQxkNhvPexffjEmGwCq68FuftFK15JgUF05y/HlK3M6W/G2iEaACIfXdSnwVNe9Qh0sPfw8LbOPxrWzGWGMQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-knex/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.47.1.tgz", + "integrity": "sha512-l/c+Z9F86cOiPJUllUCt09v+kICKvT+Vg1vOAJHtHPsJIzurGayucfCMq2acd/A/yxeNWunl9d9eqZ0G+XiI6A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-koa/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.44.1.tgz", + "integrity": "sha512-5MPkYCvG2yw7WONEjYj5lr5JFehTobW7wX+ZUFy81oF2lr9IPfZk9qO+FTaM0bGEiymwfLwKe6jE15nHn1nmHg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.52.0.tgz", + "integrity": "sha512-1xmAqOtRUQGR7QfJFfGV/M2kC7wmI2WgZdpru8hJl3S0r4hW0n3OQpEHlSGXJAaNFyvT+ilnwkT+g5L4ljHR6g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.46.1.tgz", + "integrity": "sha512-3kINtW1LUTPkiXFRSSBmva1SXzS/72we/jL22N+BnF3DFcoewkdkHPYOIdAAk9gSicJ4d5Ojtt1/HeibEc5OQg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.45.1.tgz", + "integrity": "sha512-TKp4hQ8iKQsY7vnp/j0yJJ4ZsP109Ht6l4RHTj0lNEG1TfgTrIH5vJMbgmoYXWzNHAqBH2e7fncN12p3BP8LFg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/mysql": "2.15.26" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.45.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.45.2.tgz", + "integrity": "sha512-h6Ad60FjCYdJZ5DTz1Lk2VmQsShiViKe0G7sYikb0GHI0NVvApp2XQNRHNjEMz87roFttGPLHOYVPlfy+yVIhQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/sql-common": "^0.40.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.51.1.tgz", + "integrity": "sha512-QxgjSrxyWZc7Vk+qGSfsejPVFL1AgAJdSBMYZdDUbwg730D09ub3PXScB9d04vIqPriZ+0dqzjmQx0yWKiCi2Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/sql-common": "^0.40.1", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.41.0.tgz", + "integrity": "sha512-Kpv0fJRk/8iMzMk5Ue5BsUJfHkBJ2wQoIi/qduU1a1Wjx9GLj6J2G17PHjPK5mnZjPNzkFOXFADZMfgDioliQw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.52.0", + "@opentelemetry/core": "^1.25.0", + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.46.1.tgz", + "integrity": "sha512-UMqleEoabYMsWoTkqyt9WAzXwZ4BlFZHO40wr3d5ZvtjKCHlD4YXLm+6OLCeIi/HkX7EXvQaz8gtAwkwwSEvcQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.18.1.tgz", + "integrity": "sha512-5Cuy/nj0HBaH+ZJ4leuD7RjgvA844aY2WW+B5uLcWtxGjRZl3MNLuxnNg5DYWZNPO+NafSSnra0q49KWAHsKBg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/tedious": "^4.0.14" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.4.0.tgz", + "integrity": "sha512-UdMQBpz11SqtWlmDnk5SoqF5QDom4VmW8SVDt9Q2xuMWVh8lc0kVROfoo2pl7zU6H6gFR8eudb3eFXIdrFn0ew==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.52.1.tgz", + "integrity": "sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-transformer": "0.52.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.52.1.tgz", + "integrity": "sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.52.1.tgz", + "integrity": "sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-logs": "0.52.1", + "@opentelemetry/sdk-metrics": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "protobufjs": "^7.3.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.25.1.tgz", + "integrity": "sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.25.1.tgz", + "integrity": "sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", + "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", + "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz", + "integrity": "sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", + "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.52.1.tgz", + "integrity": "sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/exporter-trace-otlp-grpc": "0.52.1", + "@opentelemetry/exporter-trace-otlp-http": "0.52.1", + "@opentelemetry/exporter-trace-otlp-proto": "0.52.1", + "@opentelemetry/exporter-zipkin": "1.25.1", + "@opentelemetry/instrumentation": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-logs": "0.52.1", + "@opentelemetry/sdk-metrics": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "@opentelemetry/sdk-trace-node": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz", + "integrity": "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.25.1.tgz", + "integrity": "sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.25.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/propagator-b3": "1.25.1", + "@opentelemetry/propagator-jaeger": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz", + "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", + "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "node_modules/@pimlico/alto": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@pimlico/alto/-/alto-0.0.21.tgz", + "integrity": "sha512-gLLGv56odFtd9z8Jo3yDK2ykjLsxOUqsICS8lV90C0VMVx/jSbC4lykbl5tg0tw+0g1CaxfaRjfkfGFbzNf63A==", + "license": "GPL-3.0-or-later", + "dependencies": { + "@fastify/cors": "8.4.2", + "@fastify/websocket": "^10.0.1", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/exporter-trace-otlp-proto": "^0.52.1", + "@opentelemetry/instrumentation-fastify": "^0.38.0", + "@opentelemetry/instrumentation-http": "^0.52.1", + "@opentelemetry/instrumentation-ioredis": "^0.42.0", + "@opentelemetry/instrumentation-pino": "^0.41.0", + "@opentelemetry/instrumentation-undici": "^0.4.0", + "@opentelemetry/sdk-node": "^0.52.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1", + "@pimlico/opentelemetry-instrumentation-viem": "^0.0.4", + "@sentry/node": "^9.15.0", + "@types/bull": "^4.10.4", + "@types/node": "^18.16.3", + "@types/ws": "^8.5.10", + "abitype": "^0.8.0", + "async-mutex": "^0.4.0", + "bull": "^4.15.1", + "dotenv": "^16.0.3", + "fastify": "^4.25.2", + "import-in-the-middle": "^1.14.2", + "ioredis": "^5.4.1", + "opentelemetry-instrumentation-fetch-node": "^1.2.3", + "pino": "^8.15.0", + "pino-http": "^8.4.0", + "pino-pretty": "^10.0.0", + "prom-client": "^14.2.0", + "type-fest": "^4.35.0", + "viem": "^2.44.4", + "yargs": "^17.7.1", + "zod": "^3.21.4", + "zod-validation-error": "^1.3.0" + }, + "bin": { + "alto": "esm/cli/alto.js" + } + }, + "node_modules/@pimlico/opentelemetry-instrumentation-viem": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@pimlico/opentelemetry-instrumentation-viem/-/opentelemetry-instrumentation-viem-0.0.4.tgz", + "integrity": "sha512-FlFIXU7CVgfDAn0ay2JeV3F6mO7pLR6UgP/DZMx/gN7RZ/HV2rW+ibk1QmcKAF7NGPk5II8vYyu02irb0u158A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.200.0" + } + }, + "node_modules/@pimlico/opentelemetry-instrumentation-viem/node_modules/@opentelemetry/api-logs": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", + "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@pimlico/opentelemetry-instrumentation-viem/node_modules/@opentelemetry/instrumentation": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.200.0.tgz", + "integrity": "sha512-pmPlzfJd+vvgaZd/reMsC8RWgTXn2WY1OWT5RT42m3aOn5532TozwXNDhg1vzqJ+jnvmkREcdLr27ebJEQt0Jg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.200.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "shimmer": "^1.2.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, + "node_modules/@prisma/instrumentation": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-6.11.1.tgz", + "integrity": "sha512-mrZOev24EDhnefmnZX7WVVT7v+r9LttPRqf54ONvj6re4XMF7wFTpK2tLJi4XHB7fFp/6xhYbgRel8YV7gQiyA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.8" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz", + "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==", + "license": "BSD-3-Clause" + }, + "node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@sentry/core": { + "version": "9.47.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.47.2.tgz", + "integrity": "sha512-WYEP2ZHkTQMP7Gg5frzrQy1475TnK5Qv8wgvHiTlNerYaEBCNpAeWjUltTgfCQ8Hbv1iq4inca7Kqmmyv9gLnQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/node": { + "version": "9.47.2", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-9.47.2.tgz", + "integrity": "sha512-faHzAQh6Tp4L4u/fvY0gMRIdA5OQdWciiIuk/urTRXKox2DwIO7OeutFZE48Be4aXdnRiMSBcpHEp7GygAIwqg==", + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1", + "@opentelemetry/core": "^1.30.1", + "@opentelemetry/instrumentation": "^0.57.2", + "@opentelemetry/instrumentation-amqplib": "^0.46.1", + "@opentelemetry/instrumentation-connect": "0.43.1", + "@opentelemetry/instrumentation-dataloader": "0.16.1", + "@opentelemetry/instrumentation-express": "0.47.1", + "@opentelemetry/instrumentation-fs": "0.19.1", + "@opentelemetry/instrumentation-generic-pool": "0.43.1", + "@opentelemetry/instrumentation-graphql": "0.47.1", + "@opentelemetry/instrumentation-hapi": "0.45.2", + "@opentelemetry/instrumentation-http": "0.57.2", + "@opentelemetry/instrumentation-ioredis": "0.47.1", + "@opentelemetry/instrumentation-kafkajs": "0.7.1", + "@opentelemetry/instrumentation-knex": "0.44.1", + "@opentelemetry/instrumentation-koa": "0.47.1", + "@opentelemetry/instrumentation-lru-memoizer": "0.44.1", + "@opentelemetry/instrumentation-mongodb": "0.52.0", + "@opentelemetry/instrumentation-mongoose": "0.46.1", + "@opentelemetry/instrumentation-mysql": "0.45.1", + "@opentelemetry/instrumentation-mysql2": "0.45.2", + "@opentelemetry/instrumentation-pg": "0.51.1", + "@opentelemetry/instrumentation-redis-4": "0.46.1", + "@opentelemetry/instrumentation-tedious": "0.18.1", + "@opentelemetry/instrumentation-undici": "0.10.1", + "@opentelemetry/resources": "^1.30.1", + "@opentelemetry/sdk-trace-base": "^1.30.1", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@prisma/instrumentation": "6.11.1", + "@sentry/core": "9.47.2", + "@sentry/node-core": "9.47.2", + "@sentry/opentelemetry": "9.47.2", + "import-in-the-middle": "^1.14.2", + "minimatch": "^9.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/node/node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@sentry/node/node_modules/@opentelemetry/context-async-hooks": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.1.tgz", + "integrity": "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@sentry/node/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@sentry/node/node_modules/@opentelemetry/instrumentation-http": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.57.2.tgz", + "integrity": "sha512-1Uz5iJ9ZAlFOiPuwYg29Bf7bJJc/GeoeJIFKJYQf67nTVKFe8RHbEtxgkOmK4UGZNHKXcpW4P8cWBYzBn1USpg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/instrumentation": "0.57.2", + "@opentelemetry/semantic-conventions": "1.28.0", + "forwarded-parse": "2.1.2", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@sentry/node/node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@sentry/node/node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.47.1.tgz", + "integrity": "sha512-OtFGSN+kgk/aoKgdkKQnBsQFDiG8WdCxu+UrHr0bXScdAmtSzLSraLo7wFIb25RVHfRWvzI5kZomqJYEg/l1iA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@sentry/node/node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.10.1.tgz", + "integrity": "sha512-rkOGikPEyRpMCmNu9AQuV5dtRlDmJp2dK5sw8roVshAGoB6hH/3QjDtRhdwd75SsJwgynWUNRUYe0wAkTo16tQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" + } + }, + "node_modules/@sentry/node/node_modules/@opentelemetry/resources": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@sentry/node/node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@sentry/node/node_modules/@sentry/node-core": { + "version": "9.47.2", + "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-9.47.2.tgz", + "integrity": "sha512-DKHe8lld16QB5JQGDyYGhinjaFCQrNeqvmEECfkXfvoVFCuuORRNoIB3jTi0IZumiFo/ShO5JMYb6GqtP2gYLw==", + "license": "MIT", + "dependencies": { + "@sentry/core": "9.47.2", + "@sentry/opentelemetry": "9.47.2", + "import-in-the-middle": "^1.14.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.0.0", + "@opentelemetry/core": "^1.30.1 || ^2.0.0", + "@opentelemetry/instrumentation": ">=0.57.1 <1", + "@opentelemetry/resources": "^1.30.1 || ^2.0.0", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.0.0", + "@opentelemetry/semantic-conventions": "^1.34.0" + } + }, + "node_modules/@sentry/node/node_modules/@sentry/opentelemetry": { + "version": "9.47.2", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-9.47.2.tgz", + "integrity": "sha512-yyA4TLpEVNQKaKB4K0p+kHK5Lev/yCpY2qe2tK2YeGWLVVH03B+t+C6lTOf4qgR3NsiFuoWSmP9ypBceCixDyg==", + "license": "MIT", + "dependencies": { + "@sentry/core": "9.47.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.0.0", + "@opentelemetry/core": "^1.30.1 || ^2.0.0", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.0.0", + "@opentelemetry/semantic-conventions": "^1.34.0" + } + }, + "node_modules/@types/bull": { + "version": "4.10.4", + "resolved": "https://registry.npmjs.org/@types/bull/-/bull-4.10.4.tgz", + "integrity": "sha512-A+8uxa5GbzKcS7kZ9Z1OcOeSyrvVmfHtZi3VIrH1Gws0G0sTknB2SRllxTaAYhycGn7+nC0Pb8VjxIyZiTM81A==", + "deprecated": "This is a stub types definition. bull provides its own type definitions, so you do not need this installed.", + "license": "MIT", + "dependencies": { + "bull": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mysql": { + "version": "2.15.26", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.26.tgz", + "integrity": "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.6.tgz", + "integrity": "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==", + "license": "MIT", + "dependencies": { + "@types/pg": "*" + } + }, + "node_modules/@types/shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", + "license": "MIT" + }, + "node_modules/@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "cpu": [ + "loong64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/abitype": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.8.11.tgz", + "integrity": "sha512-bM4v2dKvX08sZ9IU38IN5BKmN+ZkOSd2oI4a9f0ejHYZQYV6cDr7j+d95ga0z2XHG36Y4jzoG5Z7qDqxp7fi/A==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.19.1" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.19.0.tgz", + "integrity": "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "deprecated": "package has been renamed to acorn-import-attributes", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv/node_modules/fast-uri": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", + "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/async-mutex": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.1.tgz", + "integrity": "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.4.0.tgz", + "integrity": "sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==", + "license": "MIT", + "dependencies": { + "@fastify/error": "^3.3.0", + "fastq": "^1.17.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bintrees": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/bull": { + "version": "4.16.5", + "resolved": "https://registry.npmjs.org/bull/-/bull-4.16.5.tgz", + "integrity": "sha512-lDsx2BzkKe7gkCYiT5Acj02DpTwDznl/VNN7Psn7M3USPG7Vs/BaClZJJTAG+ufAR9++N1/NiUTdaFBWDIl5TQ==", + "license": "MIT", + "dependencies": { + "cron-parser": "^4.9.0", + "get-port": "^5.1.1", + "ioredis": "^5.3.2", + "lodash": "^4.17.21", + "msgpackr": "^1.11.2", + "semver": "^7.5.2", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz", + "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cron-parser": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", + "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", + "deprecated": "v4 is no longer maintained, upgrade to v5", + "license": "MIT", + "dependencies": { + "luxon": "^3.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-content-type-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", + "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==", + "license": "MIT" + }, + "node_modules/fast-copy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.1.0.tgz", + "integrity": "sha512-IuCOCDFM1F/s4LtG7Bjr3yUUwPHybyhqN74xk2cMYoP51vVeErMy8+6HGFchi/+45lW8uzhs6lBeEqks2GWt6A==", + "license": "MIT" + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-json-stringify": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.16.1.tgz", + "integrity": "sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==", + "license": "MIT", + "dependencies": { + "@fastify/merge-json-schemas": "^0.1.0", + "ajv": "^8.10.0", + "ajv-formats": "^3.0.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-json-stringify/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "license": "MIT", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.7.tgz", + "integrity": "sha512-b8mggfg2R+m2OAb3Z+2HcJxUgU+2cY1JQondBDyXLdrEKNPxd96MvnB5yWKZdupsuX6GdBaAZHZo9msHX/Bb7A==", + "license": "MIT" + }, + "node_modules/fastify": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.29.1.tgz", + "integrity": "sha512-m2kMNHIG92tSNWv+Z3UeTR9AWLLuo7KctC7mlFPtMEVrfjIhmQhkQnT9v15qA/BfVq3vvj134Y0jl9SBje3jXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/ajv-compiler": "^3.5.0", + "@fastify/error": "^3.4.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.3.0", + "fast-content-type-parse": "^1.1.0", + "fast-json-stringify": "^5.8.0", + "find-my-way": "^8.0.0", + "light-my-request": "^5.11.0", + "pino": "^9.0.0", + "process-warning": "^3.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.7.0", + "semver": "^7.5.4", + "toad-cache": "^3.3.0" + } + }, + "node_modules/fastify-plugin": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz", + "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==", + "license": "MIT" + }, + "node_modules/fastify/node_modules/pino": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.14.0.tgz", + "integrity": "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==", + "license": "MIT", + "dependencies": { + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/fastify/node_modules/pino-abstract-transport": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", + "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/fastify/node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "license": "MIT" + }, + "node_modules/fastify/node_modules/pino/node_modules/process-warning": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.1.1.tgz", + "integrity": "sha512-oCkNVj4OKnKEcocVBcDfiIugN1/cE6rgfT3nCtzeqZPA8+rIxMaQ0xXzIkGP8Gj2qUaP1UR7uhJ1VD8lUCpzCg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/fastify/node_modules/sonic-boom": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", + "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/fastify/node_modules/thread-stream": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.2.0.tgz", + "integrity": "sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw==", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/find-my-way": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.2.tgz", + "integrity": "sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^3.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/forwarded-parse": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", + "license": "MIT" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "license": "MIT" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ioredis": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.11.1.tgz", + "integrity": "sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==", + "license": "MIT", + "dependencies": { + "@ioredis/commands": "1.10.0", + "cluster-key-slot": "1.1.1", + "debug": "4.4.3", + "denque": "2.1.0", + "redis-errors": "1.2.0", + "redis-parser": "3.0.0", + "standard-as-callback": "2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.17.0.tgz", + "integrity": "sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isows": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", + "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/light-my-request": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.14.0.tgz", + "integrity": "sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==", + "license": "BSD-3-Clause", + "dependencies": { + "cookie": "^0.7.0", + "process-warning": "^3.0.0", + "set-cookie-parser": "^2.4.1" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mnemonist": { + "version": "0.39.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.5.tgz", + "integrity": "sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==", + "license": "MIT", + "dependencies": { + "obliterator": "^2.0.1" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/msgpackr": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.12.1.tgz", + "integrity": "sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==", + "license": "MIT", + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.4.tgz", + "integrity": "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/obliterator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", + "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", + "license": "MIT" + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/opentelemetry-instrumentation-fetch-node": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/opentelemetry-instrumentation-fetch-node/-/opentelemetry-instrumentation-fetch-node-1.2.3.tgz", + "integrity": "sha512-Qb11T7KvoCevMaSeuamcLsAD+pZnavkhDnlVL0kRozfhl42dKG5Q3anUklAFKJZjY3twLR+BnRa6DlwwkIE/+A==", + "license": "MIT", + "dependencies": { + "@opentelemetry/instrumentation": "^0.46.0", + "@opentelemetry/semantic-conventions": "^1.17.0" + }, + "engines": { + "node": ">18.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.6.0" + } + }, + "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/@opentelemetry/instrumentation": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.46.0.tgz", + "integrity": "sha512-a9TijXZZbk0vI5TGLZl+0kxyFfrXHhX6Svtz7Pp2/VBlCSKrazuULEyoJQrOknJyFWNMEmbbJgOciHCCpQcisw==", + "license": "Apache-2.0", + "dependencies": { + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.7.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/import-in-the-middle": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz", + "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/ox": { + "version": "0.14.45", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.14.45.tgz", + "integrity": "sha512-jpsQ+p0JZh9mKCxxzxz0d5qFHZZg2/O9xW18IpEC/dNXXPVqmDJ0c//9RMz0CILkbSGPA42+cbU0fC/ghwJ03w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.11.0", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "1.9.1", + "@noble/hashes": "^1.8.0", + "@scure/bip32": "^1.7.0", + "@scure/bip39": "^1.6.0", + "abitype": "^1.2.3", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/ox/node_modules/abitype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.3.0.tgz", + "integrity": "sha512-fk6Te+bojIFrMvMZrnOO+SxCB+RUksTGOzq/60ZRvs1L+BVzvi2bqt9L3W/17ZLdZsyM1FuYf65P5nlmoiH1Bg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3.22.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.16.1.tgz", + "integrity": "sha512-p9VOFMiHB/ZbJATetbg+99PxssTVSQRnyuPSQ67mN1+1KBOjZaZ83ZQzltnxPhJwSsC3nwVjJ10DVJlerbFzLg==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pino": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.21.0.tgz", + "integrity": "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^3.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.6.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "license": "MIT", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.8.0.tgz", + "integrity": "sha512-2jhTTU3Eilp/2DMT71gbcoqC35eQHasMJH0RHkYxwlxIv3+FR6Y5xAFZIwEGLxKkjZYEFlsiMNIdwUqjK2lLHQ==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-http": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/pino-http/-/pino-http-8.6.1.tgz", + "integrity": "sha512-J0hiJgUExtBXP2BjrK4VB305tHXS31sCmWJ9XJo2wPkLHa1NFPuW4V9wjG27PAc2fmBCigiNhQKpvrx+kntBPA==", + "license": "MIT", + "dependencies": { + "get-caller-file": "^2.0.5", + "pino": "^8.17.1", + "pino-std-serializers": "^6.2.2", + "process-warning": "^3.0.0" + } + }, + "node_modules/pino-pretty": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-10.3.1.tgz", + "integrity": "sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.0", + "fast-safe-stringify": "^2.1.1", + "help-me": "^5.0.0", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-pretty/node_modules/readable-stream": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.8.0.tgz", + "integrity": "sha512-2jhTTU3Eilp/2DMT71gbcoqC35eQHasMJH0RHkYxwlxIv3+FR6Y5xAFZIwEGLxKkjZYEFlsiMNIdwUqjK2lLHQ==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==", + "license": "MIT" + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "license": "MIT" + }, + "node_modules/prom-client": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.2.0.tgz", + "integrity": "sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==", + "deprecated": "prom-client has been replaced by @prometheus-io/client", + "license": "Apache-2.0", + "dependencies": { + "tdigest": "^0.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/protobufjs": { + "version": "7.6.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.6.tgz", + "integrity": "sha512-dYDWdjSl5RNb7SgPxGQcRU+GtvP7s2fpkrY0r432PcOIaZ0/rBcxEZnQN67iJhFuQiVw754JDoPruPCNdGsbjg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", + "@protobufjs/float": "^1.0.2", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.3.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.8.tgz", + "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "license": "MIT", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/resolve": { + "version": "1.22.13", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.13.tgz", + "integrity": "sha512-Dj/cW9zBV2aRj6XzCxuGIs3ESZKv02jixne3q6jFZYZ3/Tg09gHHviSMDL4kObh9pqSahdRHEnDoaP2gn8YLhA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.17.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ret": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.4.3.tgz", + "integrity": "sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-3.1.0.tgz", + "integrity": "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==", + "license": "MIT", + "dependencies": { + "ret": "~0.4.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "license": "BSD-3-Clause" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", + "license": "BSD-2-Clause" + }, + "node_modules/sonic-boom": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.1.tgz", + "integrity": "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "license": "MIT" + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tdigest": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.3.tgz", + "integrity": "sha512-zbRt+lT+/H4fRItHshczHErVCQnitJk8MfMT24MqFJf3YL7SJJPqGIGeuOdvxXxM/AHFzKBl7WoyaYwqO9s3Kw==", + "license": "MIT", + "dependencies": { + "bintrees": "1.0.2" + } + }, + "node_modules/thread-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", + "integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/toad-cache": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.4.tgz", + "integrity": "sha512-m1TdR/rvT7kgGJZhspNtXdsdYk0fddFpJJFlG5s+UkPFo6lkLoZ3YLOaovPYjq1R75NP5JfeTlSHaOsE09peCg==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc" + }, + "engines": { + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/viem": { + "version": "2.57.1", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.57.1.tgz", + "integrity": "sha512-eOV3fHnaMzkIFRefZg1icWztAKvBHg7RMKEH89ywY7hnyq1VxI4s/osXnTBViOsEZ7/LbbxU3w+JaIrbeIXRPQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "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", + "isows": "1.0.7", + "ox": "0.14.45", + "ws": "8.21.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/viem/node_modules/abitype": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz", + "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3.22.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/viem/node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "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 + } + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", + "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==", + "license": "MIT", + "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 + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-1.5.0.tgz", + "integrity": "sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "zod": "^3.18.0" + } + } + } +} diff --git a/usdt/package.json b/usdt/package.json new file mode 100644 index 0000000..71b64ec --- /dev/null +++ b/usdt/package.json @@ -0,0 +1,20 @@ +{ + "name": "bitkit-usdt-fixture", + "private": true, + "version": "0.1.0", + "engines": { + "node": ">=22.23.1 <23" + }, + "scripts": { + "test": "node --test *.test.cjs", + "lint": "biome check .", + "format": "biome check --write ." + }, + "dependencies": { + "@pimlico/alto": "0.0.21", + "viem": "2.57.1" + }, + "devDependencies": { + "@biomejs/biome": "2.5.14" + } +} diff --git a/usdt/pins.json b/usdt/pins.json new file mode 100644 index 0000000..37d3e7a --- /dev/null +++ b/usdt/pins.json @@ -0,0 +1,12 @@ +{ + "forkBlock": 513660679, + "anvil": "1.8.5", + "anvilHashes": { + "darwin_arm64": "56049728e25e44a61c7f2e49438023b0890cb45850ffcb7c882f90cd998baf83", + "darwin_amd64": "b919f69bb4231ad68beaaba9dc8f7d36d9d552cef1a76a8bf69c2bdfd974339a", + "linux_arm64": "5bdce3dade8b6f0a65d4fccf6908426aee4905a988b08dce79d0a72fe7498310", + "linux_amd64": "6c66ffcc55fa4249197721baa3098bc208014ea1d8aa04b2ed50ac6bccffb226" + }, + "service": "766bb4977fa6a103dc39f34910323fea1b07d82a", + "core": "bdce512c9d1025ba6cd71baa8c2df1a39dcb3d02" +} diff --git a/usdt/rpc.cjs b/usdt/rpc.cjs new file mode 100644 index 0000000..160943c --- /dev/null +++ b/usdt/rpc.cjs @@ -0,0 +1,89 @@ +const { createServer } = require('node:http'); + +const READ_METHODS = new Set([ + 'eth_chainId', + 'eth_blockNumber', + 'eth_getBlockByNumber', + 'eth_getBlockByHash', + 'eth_getCode', + 'eth_getBalance', + 'eth_getTransactionCount', + 'eth_getStorageAt', + 'eth_call', + 'eth_getLogs', + 'eth_getTransactionReceipt', + 'eth_getTransactionByHash', + 'eth_getProof', + 'eth_gasPrice', + 'eth_feeHistory', + 'eth_maxPriorityFeePerGas', + 'net_version', + 'web3_clientVersion', +]); + +async function rpc(url, method, params = []) { + const response = await fetch(url, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }), + signal: AbortSignal.timeout(30_000), + }); + if (!response.ok) throw new Error(`RPC returned HTTP ${response.status}`); + const body = await response.json(); + if (body.error) { + const error = new Error(body.error.message); + error.code = body.error.code; + error.data = body.error.data; + throw error; + } + return body.result; +} + +async function serve(port, dispatch) { + const server = createServer(async (req, res) => { + let call; + try { + // Test controls are loopback-only and cannot be called from a web page. + if (req.method !== 'POST' || req.headers.origin) throw new Error('Use a local RPC client'); + let body = ''; + for await (const chunk of req) { + body += chunk; + if (body.length > 131072) throw new Error('Request too large'); + } + call = JSON.parse(body); + if (!call || Array.isArray(call) || typeof call.method !== 'string') { + throw new Error('Expected a JSON-RPC request'); + } + const result = await dispatch(call.method, call.params ?? []); + res.setHeader('content-type', 'application/json'); + res.end(JSON.stringify({ jsonrpc: '2.0', id: call.id ?? null, result })); + } catch (error) { + res.statusCode = error.httpStatus ?? 200; + res.setHeader('content-type', 'application/json'); + res.end( + JSON.stringify({ + jsonrpc: '2.0', + id: call?.id ?? null, + error: { code: error.code ?? -32000, message: error.message, data: error.data }, + }), + ); + } + }); + await new Promise((resolve, reject) => { + server.once('error', reject); + server.listen(port, '127.0.0.1', resolve); + }); + return server; +} + +function upstreamReader(url) { + return async (method, params) => { + if (!READ_METHODS.has(method)) throw new Error('Upstream writes are disabled'); + try { + return await rpc(url, method, params); + } catch { + throw new Error(`Upstream read failed: ${method}`); + } + }; +} +module.exports = { rpc, serve, upstreamReader }; diff --git a/usdt/rpc.test.cjs b/usdt/rpc.test.cjs new file mode 100644 index 0000000..1c0f851 --- /dev/null +++ b/usdt/rpc.test.cjs @@ -0,0 +1,47 @@ +const assert = require('node:assert/strict'); +const { test } = require('node:test'); +const { rpc, serve, upstreamReader } = require('./rpc.cjs'); +const { atomicAmount } = require('./contracts.cjs'); + +test('upstream forwards reads, blocks writes and hides provider credentials', async (t) => { + const calls = []; + const server = await serve(0, (method) => { + calls.push(method); + if (method === 'eth_chainId') return '0xa4b1'; + throw new Error('private upstream URL or credential'); + }); + t.after(() => server.close()); + const read = upstreamReader(`http://127.0.0.1:${server.address().port}`); + assert.equal(await read('eth_chainId', []), '0xa4b1'); + for (const method of ['eth_sendRawTransaction', 'eth_sendTransaction', 'anvil_setStorageAt']) { + await assert.rejects(read(method, []), /writes are disabled/); + } + await assert.rejects(read('eth_getCode', []), { message: 'Upstream read failed: eth_getCode' }); + assert.deepEqual(calls, ['eth_chainId', 'eth_getCode']); +}); + +test('local RPC preserves errors and rejects browser control requests', async (t) => { + let calls = 0; + const server = await serve(0, () => { + calls++; + throw Object.assign(new Error('operation rejected'), { code: -32507, data: 'fixture' }); + }); + t.after(() => server.close()); + const url = `http://127.0.0.1:${server.address().port}`; + await assert.rejects(rpc(url, 'eth_sendUserOperation'), { code: -32507, data: 'fixture' }); + const response = await fetch(url, { + method: 'POST', + headers: { origin: 'https://example.org' }, + body: JSON.stringify({ method: 'reset' }), + }); + assert((await response.json()).error); + assert.equal(calls, 1); +}); + +test('funding uses exact positive six-decimal USDT amounts', () => { + assert.equal(atomicAmount('0.000001'), 1n); + assert.equal(atomicAmount('12.345678'), 12345678n); + for (const amount of ['0', '-1', '1e6', '0.0000001', '1000000001', '01', '']) { + assert.throws(() => atomicAmount(amount)); + } +}); diff --git a/usdt/run.cjs b/usdt/run.cjs new file mode 100644 index 0000000..7af8385 --- /dev/null +++ b/usdt/run.cjs @@ -0,0 +1,265 @@ +const assert = require('node:assert/strict'); +const { spawn, execFileSync } = require('node:child_process'); +const { readFileSync, mkdirSync, createWriteStream } = require('node:fs'); +const { parseEnv } = require('node:util'); +const { createServer } = require('node:net'); +const { setTimeout: delay } = require('node:timers/promises'); +const path = require('node:path'); +const { toHex } = require('viem'); +const { rpc, serve, upstreamReader } = require('./rpc.cjs'); +const { + TOKEN, + ENTRY, + PAYMASTER, + executor, + RATE, + BALANCE_SLOT, + initialize, + paymasterData, + atomicAmount, + transfer, + balance, +} = require('./contracts.cjs'); +const { state } = require('./setup.cjs'); +const pins = require('./pins.json'); +const ports = { + node: 23450, + alto: 23451, + provider: 23452, + gateway: 23453, + control: 23454, + upstream: 23455, +}; +const urls = Object.fromEntries( + Object.entries(ports).map(([name, port]) => [name, `http://127.0.0.1:${port}`]), +); + +async function waitReady(check, children) { + for (let i = 0; i < 240; i++) { + if (children.some((child) => child.exitCode !== null || child.signalCode !== null)) { + throw new Error('Fixture process stopped; inspect .usdt/logs'); + } + try { + return await check(); + } catch { + await delay(250); + } + } + throw new Error('Fixture startup timed out; inspect .usdt/logs'); +} +async function run() { + const env = process.env.USDT_TEST_ENV_FILE + ? parseEnv(readFileSync(process.env.USDT_TEST_ENV_FILE, 'utf8')) + : process.env; + const upstream = env.ARBITRUM_RPC_URL; + if (!upstream || new URL(upstream).protocol !== 'https:') + throw new Error( + 'Set an HTTPS ARBITRUM_RPC_URL in the environment or private USDT_TEST_ENV_FILE', + ); + const anvil = path.join(state, 'bin', 'anvil'); + assert.match(execFileSync(anvil, ['--version'], { encoding: 'utf8' }), /1\.8\.5/); + // Refuse occupied ports before starting or mutating any node. + for (const port of Object.values(ports)) { + const server = createServer(); + await new Promise((resolve, reject) => { + server.once('error', reject); + server.listen(port, '127.0.0.1', resolve); + }); + await new Promise((resolve) => server.close(resolve)); + } + mkdirSync(path.join(state, 'logs'), { recursive: true, mode: 0o700 }); + const children = []; + const servers = []; + let failed; + let finish; + const lifetime = new Promise((resolve) => { + finish = resolve; + }); + function child(name, command, args, extraEnv = {}) { + const log = createWriteStream(path.join(state, 'logs', `${name}.log`), { mode: 0o600 }); + const proc = spawn(command, args, { + cwd: state, + env: { ...process.env, ...extraEnv }, + stdio: ['ignore', 'pipe', 'pipe'], + }); + children.push(proc); + proc.stdout.pipe(log); + proc.stderr.pipe(log); + proc.once('error', () => { + failed = new Error(`${name} could not start`); + finish(); + }); + proc.once('exit', (code) => { + if (code) failed = new Error(`${name} exited with ${code}; inspect .usdt/logs`); + finish(); + }); + return proc; + } + const stop = () => finish(); + process.once('SIGINT', stop); + process.once('SIGTERM', stop); + try { + const reads = {}; + const read = upstreamReader(upstream); + servers.push( + await serve(ports.upstream, async (method, params) => { + reads[method] = (reads[method] ?? 0) + 1; + return read(method, params); + }), + ); + child('anvil', anvil, [ + '--host', + '127.0.0.1', + '--port', + String(ports.node), + '--fork-url', + urls.upstream, + '--fork-block-number', + String(pins.forkBlock), + '--chain-id', + '42161', + '--hardfork', + 'prague', + '--silent', + '--block-time', + '1', + ]); + await waitReady(() => rpc(urls.node, 'eth_chainId'), children); + await rpc(urls.node, 'evm_setNextBlockTimestamp', [Math.floor(Date.now() / 1000)]); + await initialize(urls.node); + const key = toHex(executor.getHdKey().privateKey); + const alto = path.join(__dirname, 'node_modules/@pimlico/alto/esm/cli/alto.js'); + child('alto', process.execPath, [ + alto, + '--entrypoints', + ENTRY, + '--rpc-url', + urls.node, + '--executor-private-keys', + key, + '--utility-private-key', + key, + '--port', + String(ports.alto), + '--chain-type', + 'default', + '--safe-mode', + 'false', + '--enable-debug-endpoints', + 'true', + '--min-executor-balance', + '0', + '--log-level', + 'warn', + '--json', + 'true', + ]); + await waitReady(() => rpc(urls.alto, 'eth_supportedEntryPoints'), children); + let mode = 'healthy'; + servers.push( + await serve(ports.provider, async (method, params) => { + if (mode === 'unavailable') + throw Object.assign(new Error('Fixture provider unavailable'), { httpStatus: 503 }); + if (method === 'pimlico_getTokenQuotes') + return { + quotes: [ + { + token: TOKEN, + paymaster: PAYMASTER, + postOpGas: toHex(50000), + exchangeRate: toHex(RATE), + balanceSlot: toHex(BALANCE_SLOT), + }, + ], + }; + if (method === 'pm_getPaymasterStubData' || method === 'pm_getPaymasterData') { + return paymasterData(urls.node, params, mode); + } + return rpc(urls.alto, method, params); + }), + ); + const service = path.join(state, 'service'); + child('gateway', process.execPath, [path.join(service, 'dist/index.js')], { + NODE_ENV: 'test', + HOST: '127.0.0.1', + PORT: String(ports.gateway), + ARBITRUM_RPC_URL: urls.node, + LOCAL_PROVIDER_URL: urls.provider, + PIMLICO_API_KEY: '', + ORCHESTRA_API_KEY: '', + ORCHESTRA_BRIDGE_SECRET: '', + ORCHESTRA_BRIDGE_NETWORKS: '', + ORCHESTRA_DEPOSIT_NETWORKS: '', + USDT_BRIDGE_NETWORKS: '', + REQUESTS_PER_MINUTE: '10000', + GLOBAL_REQUESTS_PER_MINUTE: '100000', + }); + await waitReady(async () => { + const response = await fetch(`${urls.gateway}/healthz`); + if (!response.ok) throw new Error('Gateway is not ready'); + }, children); + let snapshot = await rpc(urls.node, 'evm_snapshot'); + servers.push( + await serve(ports.control, async (method, params) => { + switch (method) { + case 'status': + return { + chainId: 42161, + forkBlock: pins.forkBlock, + mode, + urls, + reads, + block: await rpc(urls.node, 'eth_blockNumber'), + versions: pins, + }; + case 'balance': + return (await balance(urls.node, params[0])).toString(); + case 'fund': + return transfer(urls.node, params[0], atomicAmount(params[1])); + case 'mine': { + const count = Number(params[0] ?? 3); + if (!Number.isInteger(count) || count < 1 || count > 1000) + throw new Error('Mine 1-1000 blocks'); + return rpc(urls.node, 'anvil_mine', [count]); + } + case 'provider-mode': + if (!['healthy', 'unavailable', 'expired', 'invalid-signature'].includes(params[0])) + throw new Error('Unknown provider mode'); + mode = params[0]; + return mode; + case 'bundling': + if (!['auto', 'manual'].includes(params[0])) throw new Error('Use auto or manual'); + return rpc(urls.alto, 'debug_bundler_setBundlingMode', [params[0]]); + case 'bundle': + return rpc(urls.alto, 'debug_bundler_sendBundleNow'); + case 'reset': + await rpc(urls.alto, 'debug_bundler_setBundlingMode', ['manual']); + await rpc(urls.alto, 'debug_bundler_clearState'); + assert.equal(await rpc(urls.node, 'evm_revert', [snapshot]), true); + await rpc(urls.node, 'evm_setNextBlockTimestamp', [Math.floor(Date.now() / 1000)]); + await rpc(urls.node, 'anvil_mine', [1]); + snapshot = await rpc(urls.node, 'evm_snapshot'); + mode = 'healthy'; + await rpc(urls.alto, 'debug_bundler_setBundlingMode', ['auto']); + return true; + default: + throw new Error('Unknown fixture command'); + } + }), + ); + console.log(JSON.stringify({ ready: true, ...urls, forkBlock: pins.forkBlock })); + await lifetime; + if (failed) throw failed; + } finally { + process.removeListener('SIGINT', stop); + process.removeListener('SIGTERM', stop); + for (const server of servers) server.close(); + for (const proc of children.reverse()) { + if (proc.exitCode !== null || proc.signalCode !== null) continue; + proc.kill('SIGTERM'); + await Promise.race([new Promise((resolve) => proc.once('exit', resolve)), delay(3000)]); + if (proc.exitCode === null && proc.signalCode === null) proc.kill('SIGKILL'); + } + } +} +module.exports = { run, ports, urls }; diff --git a/usdt/setup.cjs b/usdt/setup.cjs new file mode 100644 index 0000000..ab50468 --- /dev/null +++ b/usdt/setup.cjs @@ -0,0 +1,54 @@ +const { createHash } = require('node:crypto'); +const { execFileSync } = require('node:child_process'); +const { mkdirSync, existsSync, readFileSync, writeFileSync } = require('node:fs'); +const path = require('node:path'); +const pins = require('./pins.json'); +const root = path.resolve(__dirname, '..'); +const state = path.join(root, '.usdt'); + +function run(command, args, cwd = root) { + execFileSync(command, args, { cwd, stdio: 'inherit' }); +} +function checkout(name, repository, revision) { + const directory = path.join(state, name); + if (!existsSync(directory)) { + run('git', ['init', directory]); + run('git', ['remote', 'add', 'origin', repository], directory); + } + if (execFileSync('git', ['status', '--porcelain'], { cwd: directory, encoding: 'utf8' }).trim()) { + throw new Error(`Fixture ${name} checkout has edits; preserve or move it before setup`); + } + run('git', ['fetch', '--depth', '1', 'origin', revision], directory); + run('git', ['checkout', '--detach', revision], directory); + return directory; +} +async function setup() { + mkdirSync(path.join(state, 'bin'), { recursive: true, mode: 0o700 }); + const platform = `${process.platform}_${process.arch === 'x64' ? 'amd64' : process.arch}`; + const digest = pins.anvilHashes[platform]; + if (!digest) throw new Error(`Unsupported platform ${platform}`); + const archive = path.join(state, `foundry-${pins.anvil}-${platform}.tar.gz`); + if (!existsSync(archive)) { + const url = `https://github.com/foundry-rs/foundry/releases/download/v${pins.anvil}/foundry_v${pins.anvil}_${platform}.tar.gz`; + const response = await fetch(url, { signal: AbortSignal.timeout(120_000) }); + if (!response.ok) throw new Error(`Foundry download: HTTP ${response.status}`); + writeFileSync(archive, Buffer.from(await response.arrayBuffer())); + } + if (createHash('sha256').update(readFileSync(archive)).digest('hex') !== digest) { + throw new Error('Foundry archive checksum mismatch; remove the archive and retry setup'); + } + run('tar', ['-xzf', archive, '-C', path.join(state, 'bin'), 'anvil']); + const service = checkout( + 'service', + 'https://github.com/synonymdev/bitkit-usdt-service.git', + pins.service, + ); + run('npm', ['ci', '--ignore-scripts', '--no-audit', '--no-fund'], service); + run('npm', ['run', 'build'], service); + checkout('core', 'https://github.com/synonymdev/bitkit-core.git', pins.core); + run('cargo', ['build', '--locked', '--manifest-path', 'usdt/wallet/Cargo.toml']); + console.log( + 'USDT tools ready. Set ARBITRUM_RPC_URL (or USDT_TEST_ENV_FILE), then run ./usdt-fixture run.', + ); +} +module.exports = { setup, root, state }; diff --git a/usdt/shop-compose.yml b/usdt/shop-compose.yml new file mode 100644 index 0000000..bdb0e40 --- /dev/null +++ b/usdt/shop-compose.yml @@ -0,0 +1,26 @@ +services: + shop-mixed-paykit: + environment: + PAYKIT_CONFIG: /tmp/usdt-paykit.toml + entrypoint: + - /bin/sh + - -c + - | + until [ -s /state/paykit/paykit-server.toml ] && [ -s /state/paykit/master-key ]; do sleep 1; done + cp /state/paykit/paykit-server.toml /tmp/usdt-paykit.toml + printf '\n[usdt]\nrpc_url = "http://127.0.0.1:23450"\n' >> /tmp/usdt-paykit.toml + PAYKIT_MASTER_KEY="$$(cat /state/paykit/master-key)" + export PAYKIT_MASTER_KEY + exec /usr/local/bin/paykit-server + usdt-shop-rpc: + profiles: [shop-order] + image: node:22.11.0-alpine3.20 + restart: "no" + network_mode: service:shop-mixed-paykit + depends_on: + - shop-mixed-paykit + extra_hosts: + - "host.docker.internal:host-gateway" + volumes: + - ./usdt:/fixture:ro + command: [node, /fixture/shop-rpc.cjs] diff --git a/usdt/shop-rpc.cjs b/usdt/shop-rpc.cjs new file mode 100644 index 0000000..cf31835 --- /dev/null +++ b/usdt/shop-rpc.cjs @@ -0,0 +1,6 @@ +const { serve, upstreamReader } = require('./rpc.cjs'); +// Shares Paykit Server's network namespace so its existing localhost-only HTTP policy applies. +serve(23450, upstreamReader('http://host.docker.internal:23450')).catch((error) => { + console.error(error.message); + process.exitCode = 1; +}); diff --git a/usdt/smoke.cjs b/usdt/smoke.cjs new file mode 100644 index 0000000..f480cf7 --- /dev/null +++ b/usdt/smoke.cjs @@ -0,0 +1,117 @@ +const assert = require('node:assert/strict'); +const { execFile } = require('node:child_process'); +const { promisify } = require('node:util'); +const { randomUUID } = require('node:crypto'); +const { mkdtempSync, writeFileSync, rmSync } = require('node:fs'); +const path = require('node:path'); +const { setTimeout: delay } = require('node:timers/promises'); +const { rpc } = require('./rpc.cjs'); +const { state, root } = require('./setup.cjs'); +const { urls } = require('./run.cjs'); +const exec = promisify(execFile); +async function smoke() { + const directory = mkdtempSync(path.join(state, 'smoke-')); + const runId = randomUUID(); + const wallet = async (name, ...args) => { + const { stdout } = await exec( + path.join(__dirname, 'wallet/target/debug/usdt-fixture-wallet'), + args, + { + cwd: root, + env: { ...process.env, USDT_WALLET_DIR: directory, USDT_WALLET_NAME: `${runId}-${name}` }, + timeout: 120000, + }, + ); + return JSON.parse(stdout); + }; + const settled = async (id) => { + for (let i = 0; i < 40; i++) { + const payment = await wallet('sender', 'refresh', id); + if (payment.status !== 'Pending') { + assert.equal(payment.status, 'Confirmed'); + return payment; + } + await delay(500); + } + throw new Error('Local payment did not confirm'); + }; + try { + assert.equal((await rpc(urls.control, 'status')).mode, 'healthy'); + const sender = (await wallet('sender', 'address')).address; + const recipient = (await wallet('recipient', 'address')).address; + assert.equal(BigInt(await rpc(urls.node, 'eth_getBalance', [sender, 'latest'])), 0n); + assert.equal(await rpc(urls.node, 'eth_getCode', [sender, 'latest']), '0x'); + await rpc(urls.control, 'fund', [sender, '20']); + const before = BigInt(await rpc(urls.control, 'balance', [sender])); + const first = await wallet('sender', 'send', recipient, '500000'); + const executed = await settled(first.transfer.id); + assert(executed.fee > 0 && executed.fee <= first.quote.maximum_fee); + assert.equal( + BigInt(await rpc(urls.control, 'balance', [sender])), + before - 500000n - BigInt(executed.fee), + ); + assert.equal(BigInt(await rpc(urls.control, 'balance', [recipient])), 500000n); + assert.match(await rpc(urls.node, 'eth_getCode', [sender, 'latest']), /^0xef0100/); + assert.equal(BigInt(await rpc(urls.node, 'eth_getBalance', [sender, 'latest'])), 0n); + + // All CLI calls reopen the persisted Core wallet, including the held second operation. + await rpc(urls.control, 'bundling', ['manual']); + const second = await wallet('sender', 'send', recipient, '250000'); + assert.equal(second.transfer.status, 'Pending'); + assert.equal((await wallet('sender', 'refresh', second.transfer.id)).status, 'Pending'); + assert.equal(BigInt(await rpc(urls.control, 'balance', [recipient])), 500000n); + await rpc(urls.control, 'bundle'); + await settled(second.transfer.id); + assert.equal(BigInt(await rpc(urls.control, 'balance', [recipient])), 750000n); + + const binding = { + payer: 'fixture-payer', + payee: 'fixture-payee', + payment_app_id: 'paykit-server', + payment_request_id: randomUUID(), + payment_reference: runId, + payment_endpoint_identifier: 'usdt-arbitrum-address', + period_starts_at: '', + period_ends_at: '', + conversion_quote_id: '', + }; + const bindingFile = path.join(directory, 'binding.json'); + const proofFile = path.join(directory, 'proof.json'); + writeFileSync(bindingFile, JSON.stringify(binding)); + const proof = await wallet('sender', 'proof', first.transfer.id, bindingFile); + assert(proof); + writeFileSync(proofFile, JSON.stringify(proof)); + const verified = await wallet('recipient', 'verify', bindingFile, proofFile); + assert.equal(verified.amount, 500000); + writeFileSync( + bindingFile, + JSON.stringify({ ...binding, payment_reference: 'another-request' }), + ); + await assert.rejects( + wallet('recipient', 'verify', bindingFile, proofFile), + 'changed request binding must fail', + ); + await rpc(urls.control, 'provider-mode', ['invalid-signature']); + const rejected = await wallet('sender', 'send', recipient, '100000'); + assert.equal(rejected.transfer.status, 'Pending'); + assert.equal( + (await rpc(urls.alto, 'debug_bundler_dumpMempool', [require('./contracts.cjs').ENTRY])) + .length, + 0, + ); + assert.equal(BigInt(await rpc(urls.control, 'balance', [recipient])), 750000n); + console.log( + JSON.stringify({ + passed: true, + first: executed.tx_hash, + second: second.transfer.id, + proof: verified.payment_id, + }), + ); + } finally { + await rpc(urls.control, 'provider-mode', ['healthy']); + await rpc(urls.control, 'bundling', ['auto']); + rmSync(directory, { recursive: true, force: true }); + } +} +module.exports = { smoke }; diff --git a/usdt/wallet/Cargo.lock b/usdt/wallet/Cargo.lock new file mode 100644 index 0000000..ea8813b --- /dev/null +++ b/usdt/wallet/Cargo.lock @@ -0,0 +1,7338 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common 0.1.7", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloy-json-abi" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "858acd7fdad1e4a7057fd9c1b39c1f2cd6bcd57ebf3c56e2853c02ead049e816" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-primitives" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5e9dbd49258ac3ab893a481d46be29b58be7f734dcac46cd80b6b13ee36566c" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "fixed-cache", + "foldhash 0.2.0", + "hashbrown 0.17.1", + "indexmap 2.13.0", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.9.2", + "rapidhash", + "ruint", + "rustc-hash", + "secp256k1 0.31.1", + "serde", + "sha3 0.11.0", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24671b1f62edcf0f9b62994c7bf72cd621a04a4b99f5020ece1a647b40e2f103" +dependencies = [ + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-sol-macro" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60dd79f578c3912f1fc2a150dbeb8110b8cfb976c60f98ebf6de9d5da5965a2b" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error3", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edb8520f2f94275e1caa73c85207dcc78ec402a9a4c429240f9a0783a8f16c0" +dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap 2.13.0", + "proc-macro-error3", + "proc-macro2", + "quote", + "sha3 0.11.0", + "syn 2.0.117", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66af2d9344882172993be5f5cbfd349fdfa52cb548f7af8715b446fb35ef6001" +dependencies = [ + "const-hex", + "dunce", + "heck", + "macro-string", + "proc-macro2", + "quote", + "syn 2.0.117", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c2a8abc3334044013b23d5e438cc5dc802e5544cc42b713d0840d5185967cc" +dependencies = [ + "serde", + "winnow 1.0.4", +] + +[[package]] +name = "alloy-sol-types" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e6f87cf007caa54e95455875fbd25879b008d0d9c7c340a2c258b3a3400a28c" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "serde", +] + +[[package]] +name = "android_log-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" + +[[package]] +name = "android_logger" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b07e8e73d720a1f2e4b6014766e6039fd2e96a4fa44e2a78d0e1fa2ff49826" +dependencies = [ + "android_log-sys", + "env_filter 0.1.4", + "log", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "argon2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" +dependencies = [ + "base64ct", + "blake2", + "cpufeatures 0.2.17", + "password-hash", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a806ac6c8307b929df4645776290a50ee2aac754ad09d8bdf73391309e43af" +dependencies = [ + "ark-ff-asm 0.6.0", + "ark-ff-macros 0.6.0", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "digest 0.10.7", + "educe", + "num-bigint", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-ff-asm" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1479009684adc073dff49a1025d3a7065b317a9ead25aaaca38cdc70058ba8a2" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-ff-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0691ed21ef00ef89c1e9bda832eba493dda3ec2f8d892fb25b705f73f06bb8" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a74dd304fd536fb95d0a328e72be759209cc496a9da094c5bc56e5fea4f9e86b" +dependencies = [ + "ark-serialize-derive", + "ark-std 0.6.0", + "digest 0.10.7", + "num-bigint", + "serde_with", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f153690697a2b91e5e1251ff98411ee5371500a111a0fd317a70e588eb300f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "367c9c827ed431bff6868b7aa926e05b16eb46603cc8b6e768e4a5553fa1d155" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "askama" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4744ed2eef2645831b441d8f5459689ade2ab27c854488fbab1fbe94fce1a7" +dependencies = [ + "askama_derive", + "itoa", + "percent-encoding", + "serde", + "serde_json", +] + +[[package]] +name = "askama_derive" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d661e0f57be36a5c14c48f78d09011e67e0cb618f269cca9f2fd8d15b68c46ac" +dependencies = [ + "askama_parser", + "basic-toml", + "memchr", + "proc-macro2", + "quote", + "rustc-hash", + "serde", + "serde_derive", + "syn 2.0.117", +] + +[[package]] +name = "askama_parser" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf315ce6524c857bb129ff794935cf6d42c82a6cff60526fe2a63593de4d0d4f" +dependencies = [ + "memchr", + "serde", + "serde_derive", + "winnow 0.7.15", +] + +[[package]] +name = "async-compat" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ba85bc55464dcbf728b56d97e119d673f4cf9062be330a9a26f3acf504a590" +dependencies = [ + "futures-core", + "futures-io", + "once_cell", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "aws-lc-rs" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base32" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "022dfe9eb35f19ebbcb51e0b40a5ab759f46ad60cadf7297e0bd085afb50e076" + +[[package]] +name = "base58ck" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8d66485a3a2ea485c1913c4572ce0256067a5377ac8c75c4960e1cda98605f" +dependencies = [ + "bitcoin-internals 0.3.0", + "bitcoin_hashes 0.14.1", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "base85" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36915bbaca237c626689b5bd14d02f2ba7a5a359d30a2a08be697392e3718079" +dependencies = [ + "thiserror 1.0.69", +] + +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +dependencies = [ + "serde", +] + +[[package]] +name = "bdk" +version = "0.30.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "305276a807f7c8f41c16b0b23e6db8c00353a32b2576c81d81eb27342c6a0c30" +dependencies = [ + "async-trait", + "bdk-macros", + "bip39", + "bitcoin 0.30.2", + "electrum-client 0.18.0", + "getrandom 0.2.17", + "js-sys", + "log", + "miniscript 10.2.3", + "rand 0.8.5", + "serde", + "serde_json", + "sled", + "tokio", +] + +[[package]] +name = "bdk-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81c1980e50ae23bb6efa9283ae8679d6ea2c6fa6a99fe62533f65f4a25a1a56c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bech32" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32637268377fc7b10a8c6d51de3e7fba1ce5dd371a96e342b34e6078db558e7f" + +[[package]] +name = "bip32" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db40d3dfbeab4e031d78c844642fa0caa0b0db11ce1607ac9d2986dff1405c69" +dependencies = [ + "bs58", + "hmac", + "k256", + "once_cell", + "pbkdf2", + "rand_core 0.6.4", + "ripemd", + "secp256k1 0.27.0", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "bip39" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90dbd31c98227229239363921e60fcf5e558e43ec69094d46fc4996f08d1d5bc" +dependencies = [ + "bitcoin_hashes 0.14.1", + "rand 0.8.5", + "rand_core 0.6.4", + "serde", + "unicode-normalization", + "zeroize", +] + +[[package]] +name = "bip85_extended" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f300582d6cf7cb4b1f59971f14b4353015a3538b3aa048e3de85c7ef80ac34c9" +dependencies = [ + "base64 0.22.1", + "base85", + "bip39", + "bitcoin 0.32.8", + "sha3 0.10.9", +] + +[[package]] +name = "bitcoin" +version = "0.30.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1945a5048598e4189e239d3f809b19bdad4845c4b2ba400d304d2dcf26d2c462" +dependencies = [ + "base64 0.13.1", + "bech32 0.9.1", + "bitcoin-private", + "bitcoin_hashes 0.12.0", + "hex_lit", + "secp256k1 0.27.0", + "serde", +] + +[[package]] +name = "bitcoin" +version = "0.32.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e499f9fc0407f50fe98af744ab44fa67d409f76b6772e1689ec8485eb0c0f66" +dependencies = [ + "base58ck", + "base64 0.21.7", + "bech32 0.11.1", + "bitcoin-internals 0.3.0", + "bitcoin-io", + "bitcoin-units", + "bitcoin_hashes 0.14.1", + "hex-conservative", + "hex_lit", + "secp256k1 0.29.1", + "serde", +] + +[[package]] +name = "bitcoin-address-generator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d59480a0145d7695f784675d7414830e12e95f0f71010ca41ec93617c5d3171" +dependencies = [ + "bip32", + "bip39", + "bitcoin 0.32.8", + "hex", + "secp256k1 0.30.0", + "serde", + "serde_json", + "sha2", + "zeroize", +] + +[[package]] +name = "bitcoin-consensus-encoding" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6712f9c6fd6785b3b270884e57c441c403dc5d7e19ca45368c97c7a1de3000ec" +dependencies = [ + "bitcoin-internals 0.6.0", +] + +[[package]] +name = "bitcoin-internals" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bdbe14aa07b06e6cfeffc529a1f099e5fbe249524f8125358604df99a4bed2" +dependencies = [ + "serde", +] + +[[package]] +name = "bitcoin-internals" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d573f4cf32996a8dce612e4348cece65a241f1882ed594047c9ba348e8869fa5" + +[[package]] +name = "bitcoin-io" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dee39a0ee5b4095224a0cfc6bf4cc1baf0f9624b96b367e53b66d974e51d953" + +[[package]] +name = "bitcoin-private" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" + +[[package]] +name = "bitcoin-units" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5285c8bcaa25876d07f37e3d30c303f2609179716e11d688f51e8f1fe70063e2" +dependencies = [ + "bitcoin-internals 0.3.0", + "serde", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d7066118b13d4b20b23645932dfb3a81ce7e29f95726c2036fa33cd7b092501" +dependencies = [ + "bitcoin-private", + "serde", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26ec84b80c482df901772e931a9a681e26a1b9ee2302edeff23cb30328745c8b" +dependencies = [ + "bitcoin-io", + "hex-conservative", + "serde", +] + +[[package]] +name = "bitcoin_hashes" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5304e53726dbe5f93141535e102ed97b5bf4714fbecefdda8f9fb98d7fdaff0e" +dependencies = [ + "bitcoin-consensus-encoding", + "bitcoin-internals 0.6.0", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +dependencies = [ + "serde_core", +] + +[[package]] +name = "bitkitcore" +version = "0.8.0-rc2" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", + "android_logger", + "async-trait", + "base64 0.22.1", + "bdk", + "bip39", + "bitcoin 0.32.8", + "bitcoin-address-generator", + "boltz-client", + "btleplug", + "chrono", + "hex", + "jade-client-rs", + "jni", + "lazy-regex", + "lightning-invoice 0.32.0", + "lnurl-rs", + "log", + "minicbor", + "miniscript 12.3.7", + "once_cell", + "openssl", + "pubky 0.6.0", + "pubky-app-specs", + "r2d2", + "r2d2_sqlite", + "rand 0.8.5", + "regex", + "reqwest", + "rusqlite", + "rust-blocktank-client", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "trezor-connect-rs", + "uniffi", + "ur", + "url", + "uuid", + "zeroize", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "blake3" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.2.17", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "bluez-async" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84ae4213cc2a8dc663acecac67bbdad05142be4d8ef372b6903abf878b0c690a" +dependencies = [ + "bitflags 2.11.0", + "bluez-generated", + "dbus", + "dbus-tokio", + "futures", + "itertools 0.14.0", + "log", + "serde", + "serde-xml-rs", + "thiserror 2.0.18", + "tokio", + "uuid", +] + +[[package]] +name = "bluez-generated" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9676783265eadd6f11829982792c6f303f3854d014edfba384685dcf237dd062" +dependencies = [ + "dbus", +] + +[[package]] +name = "boltz-client" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "889efede8a28a19c3f6088ab5406bf1b8379a21a3470f24a5cef4cc6c7122346" +dependencies = [ + "async-trait", + "bip39", + "bip85_extended", + "bitcoin 0.32.8", + "boltz-client-macros", + "electrum-client 0.25.0", + "elements", + "env_logger", + "futures-util", + "getrandom 0.2.17", + "gloo-timers", + "hex", + "js-sys", + "lightning", + "lightning-invoice 0.34.1", + "log", + "reqwest", + "secp256k1 0.32.0-beta.2", + "serde", + "serde_json", + "tokio", + "tokio-tungstenite-wasm", + "url", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "boltz-client-macros" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bae3bbd82eb8c315b3b120d7cb1a8adef85003216315c42e23abead43ae3835" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2", + "tinyvec", +] + +[[package]] +name = "btleplug" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9a11621cb2c8c024e444734292482b1ad86fb50ded066cf46252e46643c8748" +dependencies = [ + "async-trait", + "bitflags 2.11.0", + "bluez-async", + "dashmap 6.1.0", + "dbus", + "futures", + "jni", + "jni-utils", + "log", + "objc2", + "objc2-core-bluetooth", + "objc2-foundation", + "once_cell", + "static_assertions", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "uuid", + "windows", + "windows-future", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.27", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cc" +version = "1.2.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.0", +] + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link 0.2.1", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common 0.1.7", + "inout", + "zeroize", +] + +[[package]] +name = "clap" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cmake" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" +dependencies = [ + "cc", +] + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "const-hex" +version = "1.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e59eef12462b0f9b0a3620219be5d639afd79fe39dff0a42c3997061f9298b4" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "proptest", + "serde_core", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" +dependencies = [ + "const_format_proc_macros", + "konst", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cookie_store" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eac901828f88a5241ee0600950ab981148a18f2f756900ffba1b125ca6a3ef9" +dependencies = [ + "cookie", + "document-features", + "idna", + "log", + "time", + "url", +] + +[[package]] +name = "cookie_store" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b2c103cf610ec6cae3da84a766285b42fd16aad564758459e6ecf128c75206" +dependencies = [ + "cookie", + "document-features", + "idna", + "log", + "publicsuffix", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + +[[package]] +name = "cordyceps" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" +dependencies = [ + "loom", + "tracing", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "crypto_secretbox" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d6cf87adf719ddf43a805e92c6870a531aedda35ff640442cbaf8674e141e1" +dependencies = [ + "aead", + "cipher", + "generic-array", + "poly1305", + "salsa20", + "subtle", + "zeroize", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version 0.4.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core 0.9.12", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core 0.9.12", +] + +[[package]] +name = "data-encoding" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "dbus" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b3aa68d7e7abee336255bd7248ea965cc393f3e70411135a6f6a4b651345d4" +dependencies = [ + "futures-channel", + "futures-util", + "libc", + "libdbus-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "dbus-tokio" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "007688d459bc677131c063a3a77fb899526e17b7980f390b69644bdbc41fad13" +dependencies = [ + "dbus", + "libc", + "tokio", +] + +[[package]] +name = "defmt" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e524506490a1953d237cb87b1cfc1e46f88c18f10a22dfe0f507dc6bfc7f7f" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0a27770e9c8f719a79d8b638281f4d828f77d8fd61e0bd94451b9b85e576a0b" +dependencies = [ + "defmt-parser", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version 0.4.1", + "syn 2.0.117", + "unicode-xid", +] + +[[package]] +name = "diatomic-waker" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common 0.1.7", + "subtle", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "crypto-common 0.2.2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dnssec-prover" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec4f825369fc7134da70ca4040fddc8e03b80a46d249ae38d9c1c39b7b4476bf" + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "doxygen-rs" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "415b6ec780d34dcf624666747194393603d0373b7141eef01d12ee58881507d9" +dependencies = [ + "phf", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "serde", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "electrum-client" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bc133f1c8d829d254f013f946653cbeb2b08674b960146361d1e9b67733ad19" +dependencies = [ + "bitcoin 0.30.2", + "bitcoin-private", + "byteorder", + "libc", + "log", + "rustls 0.21.12", + "serde", + "serde_json", + "webpki", + "webpki-roots 0.22.6", + "winapi", +] + +[[package]] +name = "electrum-client" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1970c5d7bd9de6d4041cbfc3e46faa3e85fe7efcea2b0eb06750d3ae1ef577b7" +dependencies = [ + "bitcoin 0.32.8", + "byteorder", + "libc", + "log", + "rustls 0.23.37", + "serde", + "serde_json", + "webpki-roots 0.25.4", + "winapi", +] + +[[package]] +name = "elements" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1210978e2686f892318085f806866014d4788479a37f0a634db97fcb39454bde" +dependencies = [ + "bech32 0.11.1", + "bitcoin 0.32.8", + "secp256k1-zkp", + "serde", + "serde_json", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "email_address" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1019fa28f600f5b581b7a603d515c3f1635da041ca211b5055804788673abfe" +dependencies = [ + "serde", +] + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "enum-ordinalize" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89dd01549b09589510cf0647475075d12071456586d70f5c75c98ae2a5537677" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65863d15a4ce2888bd2f0f543cc963d3879c3a022c8ee43f6141d479a3ac815" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "env_filter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_filter" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900d271a03799a1ee8d1ca9b19893b48ca674a9284fefcfb85f05e74ed314217" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de671bd27a75a797dc9ae289ba1e77276e75e2026408aab65185384e2d5cd3f6" +dependencies = [ + "anstream", + "anstyle", + "env_filter 2.0.0", + "jiff", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fixed-cache" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fe63500644ef0269fe6b744e7e5dc5c20b5eebf3d881bc2be53f194636f6583" +dependencies = [ + "equivalent", + "rapidhash", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin 0.9.8", +] + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs-err" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" +dependencies = [ + "autocfg", +] + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-buffered" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4421cb78ee172b6b06080093479d3c50f058e7c81b7d577bbb8d118d551d4cd5" +dependencies = [ + "cordyceps", + "diatomic-waker", + "futures-core", + "pin-project-lite", + "spin 0.10.0", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "genawaiter" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c86bd0361bcbde39b13475e6e36cb24c329964aa2611be285289d1e4b751c1a0" +dependencies = [ + "futures-core", + "genawaiter-macro", +] + +[[package]] +name = "genawaiter-macro" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b32dfe1fdfc0bbde1f22a5da25355514b5e450c33a6af6770884c8750aedfbc" + +[[package]] +name = "generator" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows-link 0.2.1", + "windows-result 0.4.1", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "goblin" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "foldhash 0.2.0", + "serde", + "serde_core", +] + +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version 0.4.1", + "serde", + "spin 0.9.8", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "heed" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd54745cfacb7b97dee45e8fdb91814b62bccddb481debb7de0f9ee6b7bf5b43" +dependencies = [ + "bitflags 2.11.0", + "byteorder", + "heed-traits", + "heed-types", + "libc", + "lmdb-master-sys", + "once_cell", + "page_size", + "synchronoise", + "url", +] + +[[package]] +name = "heed-traits" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3130048d404c57ce5a1ac61a903696e8fcde7e8c2991e9fcfc1f27c3ef74ff" + +[[package]] +name = "heed-types" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c255bdf46e07fb840d120a36dcc81f385140d7191c76a7391672675c01a55d" +dependencies = [ + "byteorder", + "heed-traits", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-conservative" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "hex_lit" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hybrid-array" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3944cf8cf766b40e2a1a333ee5e9b563f854d5fa49d6a8ca2764e97c6eddb214" +dependencies = [ + "typenum", +] + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls 0.23.37", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 1.0.6", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-kit-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b" +dependencies = [ + "core-foundation-sys", + "mach2", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "iri-string" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "jade-client-rs" +version = "0.2.0" +source = "git+https://github.com/synonymdev/jade-client-rs?rev=d46d02a#d46d02a33b373805c487262390a85f9cec0f7723" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bitcoin 0.32.8", + "ciborium", + "log", + "minicbor", + "rand 0.8.5", + "reqwest", + "serde", + "serde_bytes", + "serde_json", + "serialport", + "thiserror 2.0.18", + "tokio", + "url", + "zeroize", +] + +[[package]] +name = "jiff" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34f877a98676d2fb664698d74cc6a51ce6c484ce8c770f05d0108ec9090aeb46" +dependencies = [ + "defmt", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link 0.2.1", +] + +[[package]] +name = "jiff-static" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0666b5ab5ecaca213fc2a85b8c0083d9004e84ee2d5f9a7e0017aaf50986f25f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jni-utils" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "259e9f2c3ead61de911f147000660511f07ab00adeed1d84f5ac4d0386e7a6c4" +dependencies = [ + "dashmap 5.5.3", + "futures", + "jni", + "log", + "once_cell", + "static_assertions", + "uuid", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", +] + +[[package]] +name = "keccak" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +dependencies = [ + "cpufeatures 0.2.17", +] + +[[package]] +name = "keccak" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8f198d1db720e4940b5a493201d199d9f24f568f8f746bd13706243a2f71598" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", +] + +[[package]] +name = "keccak-asm" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5dc2c0d691cbf7595cde551ced329cca99c2387c2cbc97754c5d0cd045d3ee" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + +[[package]] +name = "lazy-regex" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bae91019476d3ec7147de9aa291cadb6d870abf2f3015d2da73a90325ac1496" +dependencies = [ + "lazy-regex-proc_macros", + "once_cell", + "regex", +] + +[[package]] +name = "lazy-regex-proc_macros" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4de9c1e1439d8b7b3061b2d209809f447ca33241733d9a3c01eabf2dc8d94358" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.117", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.183" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" + +[[package]] +name = "libdbus-sys" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" +dependencies = [ + "pkg-config", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libusb1-sys" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da050ade7ac4ff1ba5379af847a10a10a8e284181e060105bf8d86960ce9ce0f" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "lightning" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45c421e68d603b989c8f59a95a1860f1f5de90a6305ed5bcb6d9b35a3a11f450" +dependencies = [ + "bech32 0.11.1", + "bitcoin 0.32.8", + "dnssec-prover", + "hashbrown 0.13.2", + "libm", + "lightning-invoice 0.34.1", + "lightning-macros", + "lightning-types 0.3.2", + "possiblyrandom", +] + +[[package]] +name = "lightning-invoice" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ab9f6ea77e20e3129235e62a2e6bd64ed932363df104e864ee65ccffb54a8f" +dependencies = [ + "bech32 0.9.1", + "bitcoin 0.32.8", + "lightning-types 0.1.0", +] + +[[package]] +name = "lightning-invoice" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d83bd798e04ab9eecc8bbef1fa17d3808859bcdc0406bd16c55d51c8834444" +dependencies = [ + "bech32 0.11.1", + "bitcoin 0.32.8", + "lightning-types 0.3.2", +] + +[[package]] +name = "lightning-macros" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c717494cdc2c8bb85bee7113031248f5f6c64f8802b33c1c9e2d98e594aa71" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "lightning-types" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1083b8d9137000edf3bfcb1ff011c0d25e0cdd2feb98cc21d6765e64a494148f" +dependencies = [ + "bech32 0.9.1", + "bitcoin 0.32.8", + "hex-conservative", +] + +[[package]] +name = "lightning-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c211dfcff95ca308247da8b1e0e81604bc9e568239967cd2c34572558511e869" +dependencies = [ + "bitcoin 0.32.8", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lmdb-master-sys" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864808e0b19fb6dd3b70ba94ee671b82fce17554cf80aeb0a155c65bb08027df" +dependencies = [ + "cc", + "doxygen-rs", + "libc", +] + +[[package]] +name = "lnurl-rs" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41eacdd87b675792f7752f3dd0937a00241a504c3956c47f72986490662e1db4" +dependencies = [ + "aes", + "anyhow", + "base64 0.22.1", + "bech32 0.11.1", + "bitcoin 0.32.8", + "cbc", + "email_address", + "reqwest", + "serde", + "serde_json", + "ureq", + "url", +] + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "lru" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "mach2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +dependencies = [ + "libc", +] + +[[package]] +name = "macro-string" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a9dbbfc75d2688ed057456ce8a3ee3f48d12eec09229f560f3643b9f275653" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "mainline" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c258b001fa52b7270dc1a239b36a9b608b024e68733648c1757b025204fdc248" +dependencies = [ + "crc", + "document-features", + "dyn-clone", + "ed25519-dalek", + "flume", + "futures-lite", + "getrandom 0.2.17", + "lru", + "serde", + "serde_bencode", + "serde_bytes", + "sha1_smol", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minicbor" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c12b4033ffaa92fbf9df03df38d19324f52bad130dd223f811734a8006dd2d69" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniscript" +version = "10.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e88ef03cc0ce21bcf584da157890b292fc4b69bfeaa4e9d41bbf492da59b22f" +dependencies = [ + "bitcoin 0.30.2", + "bitcoin-private", + "serde", +] + +[[package]] +name = "miniscript" +version = "12.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8343cc1ef1408bd9bdbf69f7aef47017dfab7e6349ec26fddf62e0e9fb5a4cf" +dependencies = [ + "bech32 0.11.1", + "bitcoin 0.32.8", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "native-tls" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "ntimestamp" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50f94c405726d3e0095e89e72f75ce7f6587b94a8bd8dc8054b73f65c0fd68c" +dependencies = [ + "base32", + "document-features", + "getrandom 0.2.17", + "httpdate", + "js-sys", + "once_cell", + "serde", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-core-bluetooth" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a644b62ffb826a5277f536cf0f701493de420b13d40e700c452c36567771111" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl" +version = "0.10.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "951c002c75e16ea2c65b8c7e4d3d51d5530d8dfa7d060b4776828c88cfb18ecf" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "openssl-src" +version = "300.5.5+3.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f1787d533e03597a7934fd0a765f0d28e94ecc5fb7789f8053b1e699a56f709" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.112" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.12", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "password-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pest" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45d3aca230fad2e6f6317ca0a72724338c4960cb97168a85cdee66df4a9a21a8" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "petgraph" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +dependencies = [ + "fixedbitset", + "indexmap 2.13.0", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkarr" +version = "3.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb1f2f4311bae1da11f930c804c724c9914cf55ae51a9ee0440fc98826984f7" +dependencies = [ + "async-compat", + "base32", + "byteorder", + "bytes", + "cfg_aliases", + "document-features", + "dyn-clone", + "ed25519-dalek", + "futures-buffered", + "futures-lite", + "genawaiter", + "getrandom 0.2.17", + "heed", + "log", + "lru", + "mainline", + "ntimestamp", + "page_size", + "reqwest", + "rustls 0.23.37", + "rustls-webpki 0.102.8", + "self_cell", + "serde", + "sha1_smol", + "simple-dns", + "thiserror 2.0.18", + "tokio", + "tracing", + "url", + "wasm-bindgen-futures", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "possiblyrandom" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c564dbf654befd49035528299f1208a40508f6e07efb11c163444e304e4484f" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "serde", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error-attr3" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82366fd7d8b7a440d66d13418820c69df9b3908bcb1a0476d7f5ce5d12f5a04d" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro-error3" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b511283ea8a74b4b39447b128c5d00f03a356b7424554b13e298a5550100d9ac" +dependencies = [ + "proc-macro-error-attr3", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" +dependencies = [ + "bitflags 2.11.0", + "num-traits", + "rand 0.9.2", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax", + "unarray", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +dependencies = [ + "heck", + "itertools 0.14.0", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.117", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "prost-types" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +dependencies = [ + "prost", +] + +[[package]] +name = "psl-types" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" + +[[package]] +name = "pubky" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f7fe978ba733fdb614320e9b1f3910cfecf0509530511c8ba12cc8d32f8bc8" +dependencies = [ + "anyhow", + "base64 0.22.1", + "bytes", + "cookie", + "cookie_store 0.21.1", + "flume", + "futures-lite", + "futures-util", + "log", + "pkarr", + "pubky-common 0.5.4", + "reqwest", + "thiserror 2.0.18", + "tokio", + "tracing", + "url", + "wasm-bindgen-futures", +] + +[[package]] +name = "pubky" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee35ad75b5bfff099616d9649b47c27edcf8ceaa99e8adfa59b91bb2650de40" +dependencies = [ + "base64 0.22.1", + "cookie", + "flume", + "futures-lite", + "futures-util", + "httpdate", + "log", + "pkarr", + "pubky-common 0.6.0", + "reqwest", + "thiserror 2.0.18", + "tokio", + "tracing", + "url", + "wasm-bindgen-futures", + "web-time", +] + +[[package]] +name = "pubky-app-specs" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "768489143c50693e617f2efd6b2498be0c8b0ac6280b4ba59067a3afc8b01477" +dependencies = [ + "base32", + "blake3", + "js-sys", + "mime", + "pubky 0.5.4", + "serde", + "serde-wasm-bindgen", + "serde_json", + "url", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "pubky-common" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f078584beadafe3bc8669bfd6b245f10f42b8bea24e7ccbff0e09886e310ba9b" +dependencies = [ + "argon2", + "base32", + "blake3", + "crypto_secretbox", + "ed25519-dalek", + "js-sys", + "once_cell", + "pkarr", + "postcard", + "pubky-timestamp", + "rand 0.9.2", + "serde", + "thiserror 2.0.18", +] + +[[package]] +name = "pubky-common" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b60f3de02efcbb15d5e492fccade85c75d11ce76e8c4c6109377b3019bb916be" +dependencies = [ + "argon2", + "base32", + "blake3", + "crypto_secretbox", + "ed25519-dalek", + "js-sys", + "once_cell", + "pkarr", + "postcard", + "pubky-timestamp", + "rand 0.9.2", + "serde", + "thiserror 2.0.18", + "url", +] + +[[package]] +name = "pubky-timestamp" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44aafc63c1eab1905e8a8378d2b085500540c9935b6d028908c8a50a5a246a3d" +dependencies = [ + "base32", + "document-features", + "getrandom 0.2.17", + "httpdate", + "js-sys", + "once_cell", + "serde", +] + +[[package]] +name = "publicsuffix" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf" +dependencies = [ + "idna", + "psl-types", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.37", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls 0.23.37", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "r2d2" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" +dependencies = [ + "log", + "parking_lot 0.12.5", + "scheduled-thread-pool", +] + +[[package]] +name = "r2d2_sqlite" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb14dba8247a6a15b7fdbc7d389e2e6f03ee9f184f87117706d509c092dfe846" +dependencies = [ + "r2d2", + "rusqlite", + "uuid", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", + "serde", +] + +[[package]] +name = "rand" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +dependencies = [ + "chacha20", + "getrandom 0.4.2", + "rand_core 0.10.0", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", + "serde", +] + +[[package]] +name = "rand_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.5", +] + +[[package]] +name = "rand_xoshiro" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "662effc7698e08ea324d3acccf8d9d7f7bf79b9785e270a174ea36e56900c91d" +dependencies = [ + "rand_core 0.10.0", +] + +[[package]] +name = "rapidhash" +version = "4.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5da7e78a036ce858e8d55b7e7dc8ba3a88b78350fd2155d3591bbd966b58589e" +dependencies = [ + "rustversion", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "ref-cast" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "cookie", + "cookie_store 0.22.1", + "futures-core", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "native-tls", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.37", + "rustls-native-certs", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 1.0.6", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "ruint" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2973657b5127d510e230f5c63d2d106af9c8f79393d8b9f4647323e8196bdde5" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "ark-ff 0.5.0", + "ark-ff 0.6.0", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rand 0.9.2", + "rlp", + "ruint-macro", + "serde_core", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rusb" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab9f9ff05b63a786553a4c02943b74b34a988448671001e9a27e2f0565cc05a4" +dependencies = [ + "libc", + "libusb1-sys", +] + +[[package]] +name = "rusqlite" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" +dependencies = [ + "bitflags 2.11.0", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + +[[package]] +name = "rust-blocktank-client" +version = "0.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "011a0e743459d488c261488a5900f9efce5adb022812aad9c7a09117fea7bef5" +dependencies = [ + "chrono", + "reqwest", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "url", +] + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.27", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls" +version = "0.23.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki 0.103.9", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "scheduled-thread-pool" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" +dependencies = [ + "parking_lot 0.12.5", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +dependencies = [ + "bitcoin_hashes 0.12.0", + "rand 0.8.5", + "secp256k1-sys 0.8.2", + "serde", +] + +[[package]] +name = "secp256k1" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" +dependencies = [ + "bitcoin_hashes 0.14.1", + "rand 0.8.5", + "secp256k1-sys 0.10.1", + "serde", +] + +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +dependencies = [ + "bitcoin_hashes 0.14.1", + "rand 0.8.5", + "secp256k1-sys 0.10.1", +] + +[[package]] +name = "secp256k1" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3c81b43dc2d8877c216a3fccf76677ee1ebccd429566d3e67447290d0c42b2" +dependencies = [ + "bitcoin_hashes 0.14.1", + "rand 0.9.2", + "secp256k1-sys 0.11.0", +] + +[[package]] +name = "secp256k1" +version = "0.32.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5fdc7d6e800869d3fd60ff857c479bf0a83ea7bf44b389e64461e844204994" +dependencies = [ + "rand 0.9.2", + "secp256k1-sys 0.12.0", +] + +[[package]] +name = "secp256k1-sys" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4473013577ec77b4ee3668179ef1186df3146e2cf2d927bd200974c6fe60fd99" +dependencies = [ + "cc", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + +[[package]] +name = "secp256k1-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb913707158fadaf0d8702c2db0e857de66eb003ccfdda5924b5f5ac98efb38" +dependencies = [ + "cc", +] + +[[package]] +name = "secp256k1-sys" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d3be00697c88c00fe102af8dc316038cc2062eab8da646e7463f4c0e70ca9fd" +dependencies = [ + "cc", +] + +[[package]] +name = "secp256k1-zkp" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a44aed3002b5ae975f8624c5df3a949cfbf00479e18778b6058fcd213b76e3" +dependencies = [ + "bitcoin-private", + "rand 0.8.5", + "secp256k1 0.29.1", + "secp256k1-zkp-sys", + "serde", +] + +[[package]] +name = "secp256k1-zkp-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57f08b2d0b143a22e07f798ae4f0ab20d5590d7c68e0d090f2088a48a21d1654" +dependencies = [ + "cc", + "secp256k1-sys 0.10.1", +] + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "self_cell" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde-xml-rs" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2215ce3e6a77550b80a1c37251b7d294febaf42e36e21b7b411e0bf54d540d" +dependencies = [ + "log", + "serde", + "thiserror 2.0.18", + "xml", +] + +[[package]] +name = "serde_bencode" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a70dfc7b7438b99896e7f8992363ab8e2c4ba26aa5ec675d32d1c3c2c33d413e" +dependencies = [ + "serde", + "serde_bytes", +] + +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.0", + "jiff", + "schemars 0.9.0", + "schemars 1.2.2", + "serde_core", + "serde_json", + "time", +] + +[[package]] +name = "serialport" +version = "4.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a2f4ac56b5d3af3c40fbbee17be96d532cba02fa5853926aacdb77d926272ab" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "core-foundation", + "core-foundation-sys", + "io-kit-sys", + "mach2", + "nix", + "scopeguard", + "unescaper", + "windows-sys 0.52.0", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" +dependencies = [ + "digest 0.10.7", + "keccak 0.1.6", +] + +[[package]] +name = "sha3" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be176f1a57ce4e3d31c1a166222d9768de5954f811601fb7ca06fc8203905ce1" +dependencies = [ + "digest 0.11.3", + "keccak 0.2.2", +] + +[[package]] +name = "sha3-asm" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6287fd675f713484342a89cbf0a386abef5f15919cfad607e5e1f19e1e15331" +dependencies = [ + "cc", + "cfg-if", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "simple-dns" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee851d0e5e7af3721faea1843e8015e820a234f81fda3dea9247e15bac9a86a" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "sled" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f96b4737c2ce5987354855aed3797279def4ebf734436c6aa4552cf8e169935" +dependencies = [ + "crc32fast", + "crossbeam-epoch", + "crossbeam-utils", + "fs2", + "fxhash", + "libc", + "log", + "parking_lot 0.11.2", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "smawk" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" + +[[package]] +name = "socket2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "socks" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" +dependencies = [ + "byteorder", + "libc", + "winapi", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb6a2e3c7f7a3e4e83d1752cec5d1e357ced0cf96e85419b6a07f227db3def3a" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synchronoise" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dbc01390fc626ce8d1cffe3376ded2b72a11bb70e1c75f404a210e4daa4def2" +dependencies = [ + "crossbeam-queue", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "smawk", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot 0.12.5", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls 0.23.37", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +dependencies = [ + "futures-util", + "log", + "rustls 0.23.37", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.26.11", +] + +[[package]] +name = "tokio-tungstenite-wasm" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4585aa997e4afb43c64f9101c27411b8e1bf9dde49b22e3e47acdde3055b325c" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "httparse", + "js-sys", + "rustls 0.23.37", + "thiserror 2.0.18", + "tokio", + "tokio-tungstenite", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "1.0.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.4+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7193cbd0ce53dc966037f54351dbbcf0d5a642c7f0038c382ef9e677ce8c13f2" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime", + "toml_parser", + "winnow 0.7.15", +] + +[[package]] +name = "toml_parser" +version = "1.0.9+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +dependencies = [ + "winnow 0.7.15", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.11.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "trezor-connect-rs" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1aaf8ae225a23e9f008d02fe0b9d541dbe71eac04839028e122a2a7c9b75eed" +dependencies = [ + "aes-gcm", + "async-trait", + "base64 0.22.1", + "bitcoin 0.32.8", + "btleplug", + "bytes", + "futures", + "hex", + "hkdf", + "hmac", + "log", + "num-bigint", + "num-traits", + "prost", + "prost-build", + "rand 0.8.5", + "rusb", + "serde", + "serde_json", + "sha2", + "thiserror 1.0.69", + "tokio", + "tracing", + "unicode-normalization", + "uuid", + "x25519-dalek", + "zeroize", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.2", + "rustls 0.23.37", + "rustls-pki-types", + "sha1", + "thiserror 2.0.18", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unescaper" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7285e83a80ce76f5e7bce79fa41f68d78ba62d1003cf27bf748ab24413808cf4" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "uniffi" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3291800a6b06569f7d3e15bdb6dc235e0f0c8bd3eb07177f430057feb076415f" +dependencies = [ + "anyhow", + "camino", + "cargo_metadata", + "clap", + "uniffi_bindgen", + "uniffi_core", + "uniffi_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_bindgen" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a04b99fa7796eaaa7b87976a0dbdd1178dc1ee702ea00aca2642003aef9b669e" +dependencies = [ + "anyhow", + "askama", + "camino", + "cargo_metadata", + "fs-err", + "glob", + "goblin", + "heck", + "indexmap 2.13.0", + "once_cell", + "serde", + "tempfile", + "textwrap", + "toml", + "uniffi_internal_macros", + "uniffi_meta", + "uniffi_pipeline", + "uniffi_udl", +] + +[[package]] +name = "uniffi_core" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38a9a27529ccff732f8efddb831b65b1e07f7dea3fd4cacd4a35a8c4b253b98" +dependencies = [ + "anyhow", + "async-compat", + "bytes", + "once_cell", + "static_assertions", +] + +[[package]] +name = "uniffi_internal_macros" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09acd2ce09c777dd65ee97c251d33c8a972afc04873f1e3b21eb3492ade16933" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "uniffi_macros" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5596f178c4f7aafa1a501c4e0b96236a96bc2ef92bdb453d83e609dad0040152" +dependencies = [ + "camino", + "fs-err", + "once_cell", + "proc-macro2", + "quote", + "serde", + "syn 2.0.117", + "toml", + "uniffi_meta", +] + +[[package]] +name = "uniffi_meta" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beadc1f460eb2e209263c49c4f5b19e9a02e00a3b2b393f78ad10d766346ecff" +dependencies = [ + "anyhow", + "siphasher 0.3.11", + "uniffi_internal_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_pipeline" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd76b3ac8a2d964ca9fce7df21c755afb4c77b054a85ad7a029ad179cc5abb8a" +dependencies = [ + "anyhow", + "heck", + "indexmap 2.13.0", + "tempfile", + "uniffi_internal_macros", +] + +[[package]] +name = "uniffi_udl" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319cf905911d70d5b97ce0f46f101619a22e9a189c8c46d797a9955e9233716" +dependencies = [ + "anyhow", + "textwrap", + "uniffi_meta", + "weedle2", +] + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common 0.1.7", + "subtle", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ur" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28bccbac381852c37efd0217ce8c96742e5cf22f6dbb2a4f0f51418c7f3ab980" +dependencies = [ + "bitcoin_hashes 1.2.0", + "crc", + "minicbor", + "rand_xoshiro", +] + +[[package]] +name = "ureq" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5ccd538d4a604753ebc2f17cd9946e89b77bf87f6a8e2309667c6f2e87855e3" +dependencies = [ + "base64 0.21.7", + "flate2", + "log", + "once_cell", + "rustls 0.21.12", + "rustls-webpki 0.101.7", + "serde", + "serde_json", + "socks", + "url", + "webpki-roots 0.25.4", +] + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "usdt-fixture-wallet" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "bitkitcore", + "reqwest", + "serde", + "serde_json", + "tokio", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "rand 0.10.0", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver 1.0.27", +] + +[[package]] +name = "web-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.6", +] + +[[package]] +name = "webpki-roots" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "weedle2" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "998d2c24ec099a87daf9467808859f9d82b61f1d9c9701251aea037f514eae0e" +dependencies = [ + "nom", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap 2.13.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver 1.0.27", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x25519-dalek" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +dependencies = [ + "curve25519-dalek", + "rand_core 0.6.4", + "serde", + "zeroize", +] + +[[package]] +name = "xml" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8aa498d22c9bbaf482329839bc5620c46be275a19a812e9a22a2b07529a642a" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/usdt/wallet/Cargo.toml b/usdt/wallet/Cargo.toml new file mode 100644 index 0000000..0ba6c9f --- /dev/null +++ b/usdt/wallet/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "usdt-fixture-wallet" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +bitkitcore = { path = "../../.usdt/core" } +tokio = { version = "1", features = ["macros", "rt-multi-thread", "time"] } +async-trait = "0.1" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +anyhow = "1" +reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } + +[profile.dev] +debug = 0 diff --git a/usdt/wallet/src/main.rs b/usdt/wallet/src/main.rs new file mode 100644 index 0000000..d475b72 --- /dev/null +++ b/usdt/wallet/src/main.rs @@ -0,0 +1,119 @@ +use anyhow::{bail, Context, Result}; +use bitkitcore::{ + usdt_address, UsdtBackup, UsdtDestination, UsdtError, UsdtPaymentProof, + UsdtPaymentProofBinding, UsdtWallet, +}; +use serde_json::{json, Value}; +use std::{path::PathBuf, sync::Arc}; + +// Public fixture mnemonic, never a funded wallet. Apps use their own disposable test seeds. +const MNEMONIC: &str = "test test test test test test test test test test test junk"; +const GATEWAY: &str = "http://127.0.0.1:23453/v1/usdt"; +const CONTROL: &str = "http://127.0.0.1:23454"; +struct Backup; +#[async_trait::async_trait] +impl UsdtBackup for Backup { + async fn persist(&self, _snapshot: String) -> Result<(), UsdtError> { + // The fixture tests Core execution; mobile backup scenarios use real staging VSS. + Ok(()) + } +} +async fn control(method: &str, params: Value) -> Result { + let result: Value = reqwest::Client::new() + .post(CONTROL) + .json(&json!({"jsonrpc":"2.0", "id":1, "method":method, "params":params})) + .send() + .await? + .error_for_status()? + .json() + .await?; + if result.get("error").is_some() { + bail!("fixture command failed: {}", result["error"]); + } + Ok(result["result"].clone()) +} +#[tokio::main] +async fn main() -> Result<()> { + let args: Vec = std::env::args().skip(1).collect(); + let command = args.first().map(String::as_str).unwrap_or("address"); + // The fixture controller exists only on the local stack. Never accept an arbitrary RPC URL. + let status = control("status", json!([])).await?; + anyhow::ensure!(status["chainId"] == 42161, "wrong fixture chain"); + let passphrase = Some(format!( + "bitkit-usdt-fixture-{}", + std::env::var("USDT_WALLET_NAME").unwrap_or_else(|_| "sender".into()) + )); + let address = usdt_address(MNEMONIC.into(), passphrase.clone())?; + let state = + PathBuf::from(std::env::var("USDT_WALLET_DIR").unwrap_or_else(|_| ".usdt/wallet".into())); + std::fs::create_dir_all(&state)?; + let wallet = UsdtWallet::new( + address.clone(), + state + .join(format!("{address}.sqlite")) + .to_string_lossy() + .into(), + format!("{GATEWAY}/chain-rpc"), + format!("{GATEWAY}/rpc"), + None, + Arc::new(Backup), + )?; + let result = match command { + "address" => json!({"address":address}), + "balance" => json!({"address":address,"balance":wallet.balance().await?}), + "send" => { + let recipient = args.get(1).context("send requires recipient and atomic amount")?; + let amount: u64 = args.get(2).context("send requires atomic amount")?.parse()?; + let quote = wallet.quote_transfer(recipient.clone(), amount, UsdtDestination::Arbitrum).await?; + let transfer = wallet.send(quote.id.clone(), MNEMONIC.into(), passphrase.clone()).await?; + json!({"quote":quote,"transfer":transfer}) + } + "refresh" => { + let id = args.get(1).context("refresh requires transfer ID")?; + json!(wallet.refresh_transfers().await?.into_iter().find(|transfer| transfer.id == *id)) + } + "history" => json!(wallet.history()?), + "proof" => { + let id = args.get(1).context("proof requires transfer ID and binding file")?; + let binding = load(args.get(2).context("proof requires binding file")?)?; + wallet.create_payment_proof(id.clone(), proof_binding(&binding)?, MNEMONIC.into(), passphrase).await? + .map(|p| json!({"type":"erc20-transfer-eip712","chain_id":p.chain_id,"transaction_hash":p.transaction_hash,"receipt_log_index":p.receipt_log_index,"signature":p.signature})) + .unwrap_or(Value::Null) + } + "verify" => { + let binding = load(args.get(1).context("verify requires binding and proof files")?)?; + let proof = load(args.get(2).context("verify requires proof file")?)?; + let verified = wallet.verify_payment_proof(proof_binding(&binding)?, UsdtPaymentProof { + chain_id: text(&proof,"chain_id")?, transaction_hash: text(&proof,"transaction_hash")?, + receipt_log_index: text(&proof,"receipt_log_index")?, signature: text(&proof,"signature")?, + }).await?; + verified.map(|p| json!({"payment_id":p.payment_id,"transfer_id":p.transfer_id,"sender":p.sender,"recipient":p.recipient,"amount":p.amount,"timestamp":p.timestamp})).unwrap_or(Value::Null) + } + _ => bail!("use address, balance, send RECIPIENT ATOMIC_AMOUNT, refresh ID, history, proof ID BINDING_FILE, or verify BINDING_FILE PROOF_FILE"), + }; + println!("{}", serde_json::to_string_pretty(&result)?); + Ok(()) +} + +fn load(path: &str) -> Result { + Ok(serde_json::from_slice(&std::fs::read(path)?)?) +} +fn text(value: &Value, key: &str) -> Result { + Ok(value[key] + .as_str() + .with_context(|| format!("{key} must be a string"))? + .into()) +} +fn proof_binding(value: &Value) -> Result { + Ok(UsdtPaymentProofBinding { + payer: text(value, "payer")?, + payee: text(value, "payee")?, + payment_app_id: text(value, "payment_app_id")?, + payment_request_id: text(value, "payment_request_id")?, + payment_reference: text(value, "payment_reference")?, + payment_endpoint_identifier: text(value, "payment_endpoint_identifier")?, + period_starts_at: text(value, "period_starts_at")?, + period_ends_at: text(value, "period_ends_at")?, + conversion_quote_id: text(value, "conversion_quote_id")?, + }) +} From 81d91605412a57b8523dc047822332dc2041ade2 Mon Sep 17 00:00:00 2001 From: benk10 Date: Sat, 10 Oct 2026 20:46:58 -0500 Subject: [PATCH 2/7] Add local Orchestra and LayerZero bridge fixtures --- CHANGELOG.md | 1 + README.md | 7 +- docs/usdt-fixture.md | 77 +++++++- usdt/bridge-assets.cjs | 56 ++++++ usdt/bridge-http.cjs | 44 +++++ usdt/bridge-smoke.cjs | 113 +++++++++++ usdt/bridge.test.cjs | 196 +++++++++++++++++++ usdt/cli.cjs | 23 ++- usdt/layerzero.cjs | 67 +++++++ usdt/orchestra.cjs | 410 ++++++++++++++++++++++++++++++++++++++++ usdt/package-lock.json | 1 + usdt/package.json | 1 + usdt/run.cjs | 30 ++- usdt/wallet/src/main.rs | 42 +++- 14 files changed, 1049 insertions(+), 19 deletions(-) create mode 100644 usdt/bridge-assets.cjs create mode 100644 usdt/bridge-http.cjs create mode 100644 usdt/bridge-smoke.cjs create mode 100644 usdt/bridge.test.cjs create mode 100644 usdt/layerzero.cjs create mode 100644 usdt/orchestra.cjs diff --git a/CHANGELOG.md b/CHANGELOG.md index b4eb8ec..618656b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- Add local Orchestra and LayerZero providers with bridge lifecycle controls, real Arbitrum credits/refunds and a Core bridge smoke suite - Add an isolated Arbitrum/Alto USDT fixture with a real Core payment/proof smoke test, controlled paymaster failures and optional Shop USDT verification wiring - Run the Shop's marketplace on Synonym's staging with our own Paykit Server v0.1.0-rc11 behind a Cloudflare quick tunnel (`./shop-mixed`, profile `shop-mixed`) - Run a paid Shop order on our own Paykit Server, Lock Server, marketplace service and Shop with Synonym's staging homeserver (`./shop-order`, profile `shop-order`) diff --git a/README.md b/README.md index c5d8a56..70c1ad2 100644 --- a/README.md +++ b/README.md @@ -11,13 +11,18 @@ Run the shared Arbitrum fork, Alto and gateway without spending mainnet funds: USDT_TEST_ENV_FILE=/absolute/path/to/private.env ./usdt-fixture run # In another terminal: ./usdt-fixture smoke +./usdt-fixture bridge-smoke eval "$(./usdt-fixture env)" ./usdt-fixture fund 0xYOUR_TEST_WALLET 10 ``` The private file contains `ARBITRUM_RPC_URL=https://...` with historical-state access. Requires Node 22.23.1+, Rust, Git and tar. Keep existing staging VSS, Pubky and rate -services. See [USDT fixture](docs/usdt-fixture.md) for versions, app setup, pending +services. The stack also starts local Orchestra and LayerZero providers. After the +app registers a bridge receive address, use `./usdt-fixture orchestra deposit +ADDRESS polygon 3.5`, then `./usdt-fixture orchestra advance DEPOSIT_ID completed` +to deliver local tokens. `orchestra list` shows outgoing quotes; `layerzero +SOURCE_TX DELIVERED` updates a real USDT0 source message. See [USDT fixture](docs/usdt-fixture.md) for versions, app setup, pending payment controls, proof verification, the optional Shop overlay and simulation limits. diff --git a/docs/usdt-fixture.md b/docs/usdt-fixture.md index 11c4344..99e1596 100644 --- a/docs/usdt-fixture.md +++ b/docs/usdt-fixture.md @@ -33,7 +33,8 @@ eval "$(./usdt-fixture env)" | `mine 3` | Advance Core's history confirmation window | | `reset` | Revert this fork and clear Alto's mempool; reset matching test apps/peers separately | | `wallet address` | Address of the disposable Core wallet | -| `wallet send ADDRESS ATOMIC_AMOUNT` | Quote and send through the real Core engine | +| `wallet send ADDRESS ATOMIC_AMOUNT [Destination]` | Quote and send through Core; optional destination uses `Polygon`, `Bsc`, etc. | +| `wallet quote ADDRESS ATOMIC_AMOUNT [Destination]` | Inspect a quote without paying | | `wallet refresh ID` | Reconcile pending execution, including older receipts; Core may retry the identical signed operation | | `wallet proof ID BINDING_FILE` | Create the standard proof after execution | | `wallet verify BINDING_FILE PROOF_FILE` | Verify receipt, token, recipient and signature using the recipient Core wallet | @@ -48,10 +49,79 @@ The binding JSON uses Core's fields: `payer`, `payee`, `payment_app_id`, `paymen - The local signer replaces Pimlico's hosted pricing/authorization service. It uses a fixed 3,000 USDT/ETH rate. Local gas/fee numbers are not production quotes. - Alto runs with `safe-mode=false`: its strict tracing path does not handle this Anvil/EIP-7702 setup. Contract simulation and execution remain real; production bundler reputation/storage-access policy is not covered. - Anvil is an EVM fork, not the Arbitrum sequencer or L1 rollup. Local inclusion/finality and gas do not prove real Arbitrum finality or Nitro fees. -- Orchestra operators, deposit monitoring, route liquidity, refunds and LayerZero relaying cannot run locally. They need provider contract fixtures plus a smaller live acceptance set. The gateway already accepts `LOCAL_ORCHESTRA_URL`; the companion service draft adds `LOCAL_LAYERZERO_URL`. Bridge endpoints are disabled in this baseline so they cannot accidentally use live providers. Use the gateway's deposit/bridge HTTP tests as the schema examples when adding journey scenarios; execute applicable local token transfers separately rather than inventing successful receipts. +- Orchestra operators, external deposit monitoring, route liquidity and LayerZero relaying are simulated by local HTTP providers. The real gateway validates their responses through `LOCAL_ORCHESTRA_URL` and `LOCAL_LAYERZERO_URL`; neither provider contacts its public API. Arbitrum credits/refunds execute real token transfers. Off-Arbitrum hashes and delivery states are fixture evidence, not destination-chain execution. Live operator delivery/refunds still need separate acceptance. - Keep this on a trusted development host. Control, node, provider, gateway and upstream ports bind loopback. Alto 0.0.21 binds its debug RPC on all interfaces; do not expose port 23451 from the runner or run the fixture on a public host. -Ports: node 23450, Alto 23451, signing/provider router 23452, app gateway 23453, fixture controls 23454, upstream read proxy 23455. Android uses `adb reverse tcp:23453 tcp:23453`; iOS uses loopback. Core intentionally does not accept `10.0.2.2` HTTP endpoints. +Ports: node 23450, Alto 23451, signing/provider router 23452, app gateway 23453, fixture controls 23454, upstream read proxy 23455, Orchestra 23456, LayerZero 23457. Android uses `adb reverse tcp:23453 tcp:23453`; iOS uses loopback. Core intentionally does not accept `10.0.2.2` HTTP endpoints. + +## Bridge scenarios + +Providers start with the stack. Discovery offers all six Orchestra deposit +networks, its seven outbound networks, and the four configured USDT0 routes. +`env` enables those USDT0 networks in the app. The local Orchestra API key and +bridge-ticket secret are public fixture values; production keys are not used. + +```sh +./usdt-fixture bridge-smoke +# First register this wallet's Polygon deposit address in the app. +./usdt-fixture orchestra deposit 0xWALLET polygon 3.5 +./usdt-fixture orchestra advance DEPOSIT_ID processing +./usdt-fixture orchestra advance DEPOSIT_ID completed +# After an actual app send: +./usdt-fixture orchestra list +./usdt-fixture orchestra advance QUOTE_ID needs_attention +./usdt-fixture orchestra advance QUOTE_ID refunded +./usdt-fixture layerzero SOURCE_TX BLOCKED +./usdt-fixture layerzero SOURCE_TX DELIVERED +``` + +`orchestra deposit` simulates external observation, initially held. It requires +a registered wallet and takes a decimal USDT amount (including BSC). Completion +creates an actual Arbitrum transfer of the input minus the fixture fee. +Outgoing quotes have distinct funding addresses. Their order becomes visible +only after a matching real USDT transfer from the quoted owner. No command can +mark an unfunded quote completed. Repeated terminal commands share the same +settlement transfer, even when called concurrently. A different terminal outcome +requires a fresh scenario. + +| Control | Meaning | +| --- | --- | +| `orchestra list` | Registered wallets, quotes with owners/recipients, funding orders and deposits | +| `orchestra advance ID STATUS` | `processing`, `needs_attention`, `failed`, `completed`, `refunding`, `refunded` | +| `orchestra fee USDT` | Flat fee on future quotes/deposits, default `0.01` USDT; existing terms remain fixed | +| `orchestra quote-ttl SECONDS` | Expiry of future quotes, default 120; very short values exercise expired-quote rejection | +| `orchestra mode MODE` | `healthy`, `unavailable`, `rate-limited`, `invalid-response` | +| `layerzero-mode MODE` | The same failure modes, independent of Orchestra | +| `layerzero TX STATUS` | `INFLIGHT`, `CONFIRMING`, `DELIVERED`, `FAILED`, `BLOCKED`, `PAYLOAD_STORED`, `APPLICATION_BURNED`, `APPLICATION_SKIPPED` | + +LayerZero responses decode the actual source receipt's OFTSent event to obtain +the GUID, pathway and transaction identity. They cannot create an execution that +did not happen. USDT0 contracts/fees execute on the fork; relaying and destination +delivery are simulated. `FAILED`/`BLOCKED` represent retryable attention states; +`APPLICATION_BURNED`/`APPLICATION_SKIPPED` represent terminal failure. Orchestra +`failed` maps to attention in Core, since an operator may still recover/refund it. + +For an outgoing Orchestra refund, `advance QUOTE_ID refunded` transfers the +original USDT principal to the wallet on Arbitrum. Core verifies that receipt; +the original gas fee is not refunded. For an incoming deposit, request the refund +through the app first, then advance its state. That source-chain refund is +simulated and does not change the Arbitrum balance. The app's ordinary signed +refund request, ownership checks and address validation still run. + +Use BSC/Base/Tron/Solana for Orchestra-only sends. On shared networks, changing +`fee` changes which quote Core selects; a fee of `100` makes Orchestra unavailable +for a small Polygon transfer and exercises USDT0. Restore fee/modes/lifetime after +each test. Core keeps its normal polling backoff, so allow 30-60 seconds for app +updates; reopening the CLI wallet starts a fresh polling session. + +`bridge-smoke` checks incoming credit, a requested external refund, real Orchestra +funding/completion, a real Arbitrum refund and USDT0 execution with LayerZero +attention/delivery. It uses disposable wallets and checks exact local balances. +Fixture provider state stays in memory through app restarts; restarting the +fixture or `reset` clears provider state and the chain together. Do not reset +midway through a wallet/VSS recovery test. If a settlement's local RPC operation +fails, its command retains that failure rather than risking a duplicate transfer; +start a fresh isolated scenario after diagnosing the failure. ## Shop / Locks @@ -76,4 +146,5 @@ npm --prefix usdt test cargo fmt --manifest-path usdt/wallet/Cargo.toml --check cargo clippy --locked --manifest-path usdt/wallet/Cargo.toml --all-targets --no-deps -- -D warnings ./usdt-fixture smoke +./usdt-fixture bridge-smoke ``` diff --git a/usdt/bridge-assets.cjs b/usdt/bridge-assets.cjs new file mode 100644 index 0000000..0552289 --- /dev/null +++ b/usdt/bridge-assets.cjs @@ -0,0 +1,56 @@ +const { base58, createBase58check } = require('@scure/base'); +const { getAddress, hexToBytes, keccak256, sha256, toHex } = require('viem'); +const { TOKEN } = require('./contracts.cjs'); +const pins = { + arbitrum: ['42161', TOKEN], + ethereum: ['1', '0xdAC17F958D2ee523a2206206994597C13D831ec7'], + polygon: ['137', '0xc2132D05D31c914a87C6611C10748AEb04B58e8F'], + base: ['8453', '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2'], + bsc: ['56', '0x55d398326f99059ff775485246999027b3197955'], + plasma: ['9745', '0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb'], + tron: ['728126428', 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'], + solana: [ + 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB', + ], +}; +const sourceNetworks = ['ethereum', 'polygon', 'base', 'bsc', 'tron', 'solana']; +const bridgeNetworks = [...sourceNetworks, 'plasma']; +const digest = (value) => keccak256(toHex(value)); +const evmAddress = (value) => getAddress(`0x${digest(value).slice(-40)}`); +const tron = createBase58check((data) => hexToBytes(sha256(data))); +function addresses(ref) { + const evm = evmAddress(ref); + return Object.fromEntries( + sourceNetworks.map((network) => [ + network, + network === 'tron' + ? tron.encode(hexToBytes(`0x41${evm.slice(2)}`)) + : network === 'solana' + ? base58.encode(hexToBytes(digest(ref))) + : evm, + ]), + ); +} +function asset(chain) { + if (!pins[chain]) throw new Error('Unsupported fixture network'); + return { + chain, + asset: 'USDT', + chainId: pins[chain][0], + contractAddress: pins[chain][1], + decimals: chain === 'bsc' ? 18 : 6, + }; +} +const scale = (network) => (network === 'bsc' ? 1_000_000_000_000n : 1n); +const units = (amount, network) => (BigInt(amount) * scale(network)).toString(); +module.exports = { + sourceNetworks, + bridgeNetworks, + asset, + addresses, + evmAddress, + digest, + units, + scale, +}; diff --git a/usdt/bridge-http.cjs b/usdt/bridge-http.cjs new file mode 100644 index 0000000..2daee26 --- /dev/null +++ b/usdt/bridge-http.cjs @@ -0,0 +1,44 @@ +const { createServer } = require('node:http'); +const assert = require('node:assert/strict'); +const modes = ['healthy', 'unavailable', 'rate-limited', 'invalid-response']; +function providerMode(mode) { + assert(modes.includes(mode), 'Unknown bridge provider mode'); + return mode; +} +async function serveProvider(port, fixture, key) { + const server = createServer(async (req, res) => { + res.setHeader('content-type', 'application/json'); + try { + assert(!req.headers.origin, 'Use a local client'); + if (key) assert.equal(req.headers.authorization, `Bearer ${key}`); + if (fixture.mode === 'unavailable') + throw Object.assign(new Error('provider_unavailable'), { status: 503 }); + if (fixture.mode === 'rate-limited') { + res.setHeader('retry-after', '1'); + throw Object.assign(new Error('rate_limited'), { status: 429 }); + } + if (fixture.mode === 'invalid-response') return res.end(JSON.stringify({ invalid: true })); + let raw = ''; + for await (const chunk of req) { + raw += chunk; + assert(raw.length <= 131072, 'Request too large'); + } + const value = await fixture.request( + req.method, + new URL(req.url, 'http://localhost'), + raw ? JSON.parse(raw) : undefined, + req.headers['x-idempotency-key'], + ); + res.end(JSON.stringify(value)); + } catch (error) { + res.statusCode = error.status ?? 400; + res.end(JSON.stringify({ error: { code: error.message } })); + } + }); + await new Promise((resolve, reject) => { + server.once('error', reject); + server.listen(port, '127.0.0.1', resolve); + }); + return server; +} +module.exports = { serveProvider, providerMode }; diff --git a/usdt/bridge-smoke.cjs b/usdt/bridge-smoke.cjs new file mode 100644 index 0000000..f635d1b --- /dev/null +++ b/usdt/bridge-smoke.cjs @@ -0,0 +1,113 @@ +const assert = require('node:assert/strict'); +const { execFile } = require('node:child_process'); +const { promisify } = require('node:util'); +const { randomUUID } = require('node:crypto'); +const { mkdtempSync, rmSync } = require('node:fs'); +const path = require('node:path'); +const { setTimeout: delay } = require('node:timers/promises'); +const { rpc } = require('./rpc.cjs'); +const { urls } = require('./run.cjs'); +const { state } = require('./setup.cjs'); +const exec = promisify(execFile); +async function smoke() { + const directory = mkdtempSync(path.join(state, 'bridge-smoke-')); + const name = randomUUID(); + const wallet = async (account, ...args) => { + const { stdout } = await exec( + path.join(__dirname, 'wallet/target/debug/usdt-fixture-wallet'), + args, + { + env: { ...process.env, USDT_WALLET_DIR: directory, USDT_WALLET_NAME: `${name}-${account}` }, + timeout: 180000, + }, + ); + return JSON.parse(stdout); + }; + const control = (...args) => rpc(urls.control, 'orchestra', args); + const refresh = async (id, status) => { + for (let attempt = 0; attempt < 30; attempt++) { + const payment = await wallet('sender', 'refresh', id); + if (payment.status === status) return payment; + await delay(500); + } + throw new Error(`Payment did not reach ${status}`); + }; + try { + await control('mode', 'healthy'); + await control('fee', '0.01'); + const sender = (await wallet('sender', 'address')).address; + const recipient = (await wallet('recipient', 'address')).address; + await rpc(urls.control, 'fund', [sender, '200']); + + const depositAddress = await wallet('recipient', 'deposit', 'receive', 'polygon', '3500000'); + assert.notEqual(depositAddress.address, recipient); + const deposit = await control('deposit', recipient, 'polygon', '3.5'); + assert.equal((await wallet('recipient', 'deposit', 'history')).deposits[0].id, deposit.id); + await control('advance', deposit.id, 'processing'); + const [delivery, duplicate] = await Promise.all([ + control('advance', deposit.id, 'completed'), + control('advance', deposit.id, 'completed'), + ]); + assert.equal(delivery.destinationTxHash, duplicate.destinationTxHash); + assert.equal(BigInt(await rpc(urls.control, 'balance', [recipient])), 3490000n); + assert.equal( + (await wallet('recipient', 'deposit', 'detail', deposit.id)).order.status, + 'completed', + ); + const held = await control('deposit', recipient, 'polygon', '2'); + await wallet('recipient', 'deposit', 'refund', held.id, sender, 'polygon'); + await control('advance', held.id, 'refunded'); + assert.equal( + (await wallet('recipient', 'deposit', 'detail', held.id)).order.status, + 'refunded', + ); + + const first = await wallet('sender', 'send', recipient, '2000000', 'Bsc'); + assert.equal(first.quote.bridge_provider, 'Orchestra'); + await refresh(first.transfer.id, 'Bridging'); + await control( + 'advance', + (await wallet('sender', 'history')).find((t) => t.id === first.transfer.id).orchestra + .quote_id, + 'completed', + ); + const completed = await refresh(first.transfer.id, 'Confirmed'); + assert.equal(completed.received_amount, 1990000); + + const second = await wallet('sender', 'send', recipient, '2000000', 'Bsc'); + const pending = await refresh(second.transfer.id, 'Bridging'); + await control('advance', pending.orchestra.quote_id, 'needs_attention'); + await refresh(second.transfer.id, 'BridgeNeedsAttention'); + const before = BigInt(await rpc(urls.control, 'balance', [sender])); + const returned = await control('advance', pending.orchestra.quote_id, 'refunded'); + await control('advance', pending.orchestra.quote_id, 'refunded'); + const refunded = await refresh(second.transfer.id, 'BridgeRefunded'); + assert.equal(refunded.orchestra.refund_tx, returned.refundTxHash); + assert.equal(BigInt(await rpc(urls.control, 'balance', [sender])) - before, 2000000n); + + // Make the Orchestra quote unavailable so Core chooses the deployed USDT0 route. + await control('fee', '100'); + const third = await wallet('sender', 'send', recipient, '2000000', 'Polygon'); + assert.equal(third.quote.bridge_provider, 'Usdt0'); + const bridging = await refresh(third.transfer.id, 'Bridging'); + await rpc(urls.control, 'layerzero', [bridging.tx_hash, 'BLOCKED']); + await refresh(third.transfer.id, 'BridgeNeedsAttention'); + await rpc(urls.control, 'layerzero', [bridging.tx_hash, 'DELIVERED']); + await refresh(third.transfer.id, 'Confirmed'); + console.log( + JSON.stringify({ + passed: true, + inbound: delivery.destinationTxHash, + orchestra: completed.tx_hash, + refund: returned.refundTxHash, + usdt0: bridging.tx_hash, + }), + ); + } finally { + await control('mode', 'healthy'); + await control('fee', '0.01'); + await rpc(urls.control, 'layerzero-mode', ['healthy']); + rmSync(directory, { recursive: true, force: true }); + } +} +module.exports = { smoke }; diff --git a/usdt/bridge.test.cjs b/usdt/bridge.test.cjs new file mode 100644 index 0000000..0fce082 --- /dev/null +++ b/usdt/bridge.test.cjs @@ -0,0 +1,196 @@ +const assert = require('node:assert/strict'); +const { test } = require('node:test'); +const { parseAbi, encodeEventTopics, encodeAbiParameters } = require('viem'); +const { OrchestraFixture } = require('./orchestra.cjs'); +const { LayerZeroFixture, OFT, oftAbi } = require('./layerzero.cjs'); +const { serveProvider } = require('./bridge-http.cjs'); +const { serve } = require('./rpc.cjs'); +const { TOKEN } = require('./contracts.cjs'); +const { evmAddress, digest } = require('./bridge-assets.cjs'); +const owner = evmAddress('payer'); +const recipient = evmAddress('recipient'); +const url = (path) => new URL(path, 'http://localhost'); + +test('outbound quotes bind real funding and retain their price through retries and settlement', async (t) => { + let logs = []; + let holdReceipt; + const receipt = { status: '0x1', blockHash: digest('block'), transactionHash: digest('funding') }; + const node = await serve(0, (method) => { + if (method === 'eth_blockNumber') return '0x10'; + if (method === 'eth_getLogs') return logs; + if (method === 'eth_getTransactionReceipt') return holdReceipt ? holdReceipt() : receipt; + throw new Error(`Unexpected ${method}`); + }); + t.after(() => node.close()); + const fixture = new OrchestraFixture(`http://127.0.0.1:${node.address().port}`); + const body = { + sourceChain: 'arbitrum', + sourceAsset: 'USDT', + destinationChain: 'bsc', + destinationAsset: 'USDT', + refundChain: 'arbitrum', + refundAddress: owner, + recipientAddress: recipient, + amount: '1000000', + }; + const [quote, retry] = await Promise.all([ + fixture.request('POST', url('/v1/orchestration/quote'), body, 'same-request'), + fixture.request('POST', url('/v1/orchestration/quote'), body, 'same-request'), + ]); + assert.deepEqual(retry, quote); + assert.equal(quote.estimatedOut, '990000000000000000'); + await fixture.control(['fee', '0.1']); + assert.deepEqual( + await fixture.request('POST', url('/v1/orchestration/quote'), body, 'same-request'), + quote, + ); + await assert.rejects( + fixture.request( + 'POST', + url('/v1/orchestration/quote'), + { ...body, amount: '2' }, + 'same-request', + ), + /idempotency_conflict/, + ); + await assert.rejects(fixture.advance(quote.quoteId, 'completed'), /no matching on-chain/); + const abi = parseAbi(['event Transfer(address indexed from,address indexed to,uint256 value)']); + logs = [ + { + address: TOKEN, + topics: encodeEventTopics({ + abi, + eventName: 'Transfer', + args: { from: owner, to: quote.depositAddress }, + }), + data: encodeAbiParameters([{ type: 'uint256' }], [1000000n]), + transactionHash: digest('funding'), + blockHash: digest('block'), + }, + ]; + let releaseReceipt; + const receiptRequested = new Promise((requested) => { + holdReceipt = () => { + holdReceipt = null; + return new Promise((resolve) => { + releaseReceipt = () => resolve(receipt); + requested(); + }); + }; + }); + const pendingLookup = fixture.request( + 'GET', + url(`/v1/orchestration/order?quoteId=${quote.quoteId}`), + ); + await receiptRequested; + const done = await fixture.advance(quote.quoteId, 'completed'); + releaseReceipt(); + assert.deepEqual((await pendingLookup).order, done); + assert.equal(done.sourceTxHash, digest('funding')); + assert.equal(done.amountOut, quote.estimatedOut); + assert.deepEqual(await fixture.advance(quote.quoteId, 'completed'), done); + await assert.rejects(fixture.advance(quote.quoteId, 'refunded'), /Settlement already selected/); +}); + +test('standing addresses preserve wallet ownership, history pagination and refund requests', async () => { + const fixture = new OrchestraFixture('http://unused'); + const ref = `bitkit-arb-usdt-v1-${recipient.toLowerCase()}`; + const instruction = { destination: { chain: 'arbitrum', asset: 'USDT', address: recipient } }; + const address = await fixture.request( + 'PUT', + url(`/v1/standing-deposit-addresses/${ref}`), + instruction, + ); + assert.deepEqual( + await fixture.request('GET', url(`/v1/standing-deposit-addresses/${ref}`)), + address, + ); + const deposit = fixture.addDeposit(recipient, 'bsc', '2'); + assert.equal(deposit.amount, '2000000000000000000'); + const path = `/v1/standing-deposit-addresses/${ref}`; + assert.equal( + (await fixture.request('GET', url(`${path}/deposits?offset=0`))).deposits[0].id, + deposit.id, + ); + assert.deepEqual((await fixture.request('GET', url(`${path}/deposits?offset=50`))).deposits, []); + await assert.rejects(fixture.advance(deposit.id, 'refunded'), /through the app first/); + await fixture.request('POST', url(`${path}/resolve`), { + depositIds: [deposit.id], + refundAddress: owner, + }); + assert.equal(deposit.batchState, 'refund_requested'); + await fixture.advance(deposit.id, 'refunding'); + await fixture.request('POST', url(`${path}/resolve`), { + depositIds: [deposit.id], + refundAddress: owner, + }); + assert.equal(deposit.batchState, 'refunding'); + await fixture.advance(deposit.id, 'refunded'); + await assert.rejects(fixture.advance(deposit.id, 'completed'), /Refund already requested/); + assert.equal( + (await fixture.request('GET', url(`${path}/deposits`))).deposits[0].status, + 'refunded', + ); + fixture.reset(); + await assert.rejects(fixture.request('GET', url(path)), /not_found/); +}); + +test('LayerZero status uses the successful source receipt GUID and pathway', async (t) => { + const hash = digest('source'), + guid = digest('guid'); + let succeeded = true; + const node = await serve(0, () => ({ + status: succeeded ? '0x1' : '0x0', + transactionHash: hash, + logs: [ + { + address: OFT, + topics: encodeEventTopics({ + abi: oftAbi, + eventName: 'OFTSent', + args: { guid, fromAddress: owner }, + }), + data: encodeAbiParameters( + [{ type: 'uint32' }, { type: 'uint256' }, { type: 'uint256' }], + [30109, 1000000n, 1000000n], + ), + }, + ], + })); + t.after(() => node.close()); + const fixture = new LayerZeroFixture(`http://127.0.0.1:${node.address().port}`); + const path = url(`/v1/messages/tx/${hash}`); + const message = (await fixture.request('GET', path)).data[0]; + assert.equal(message.guid, guid); + assert.equal(message.pathway.dstEid, 30109); + assert.equal(message.status.name, 'INFLIGHT'); + for (const state of ['BLOCKED', 'DELIVERED', 'APPLICATION_BURNED']) + assert.equal((await fixture.set(hash, state)).data[0].status.name, state); + succeeded = false; + assert.deepEqual((await fixture.request('GET', path)).data, []); + await assert.rejects(fixture.set(hash, 'DELIVERED'), /no successful OFTSent/); +}); + +test('provider HTTP fixtures require local requests and expose controlled outages', async (t) => { + const fixture = new OrchestraFixture('http://unused'); + const server = await serveProvider(0, fixture, 'fixture-key'); + t.after(() => server.close()); + const endpoint = `http://127.0.0.1:${server.address().port}/v2/orchestration/routes`; + assert.equal((await fetch(endpoint)).status, 400); + const headers = { authorization: 'Bearer fixture-key' }; + assert.equal( + (await fetch(endpoint, { headers: { ...headers, origin: 'https://example.com' } })).status, + 400, + ); + for (const [mode, status] of [ + ['unavailable', 503], + ['rate-limited', 429], + ['invalid-response', 200], + ['healthy', 200], + ]) { + await fixture.control(['mode', mode]); + const response = await fetch(endpoint, { headers }); + assert.equal(response.status, status); + if (mode === 'healthy') assert.equal((await response.json()).assets.length, 8); + } +}); diff --git a/usdt/cli.cjs b/usdt/cli.cjs index a9c80da..81f46b9 100644 --- a/usdt/cli.cjs +++ b/usdt/cli.cjs @@ -8,6 +8,7 @@ async function main() { if (command === 'setup') return setup(); if (command === 'run') return run(); if (command === 'smoke') return require('./smoke.cjs').smoke(); + if (command === 'bridge-smoke') return require('./bridge-smoke.cjs').smoke(); if (command === 'wallet') { execFileSync(path.join(__dirname, 'wallet/target/debug/usdt-fixture-wallet'), args, { stdio: 'inherit', @@ -20,14 +21,24 @@ async function main() { } if (command === 'env') { console.log( - `export USDT_RPC_URL=${urls.gateway}/v1/usdt/chain-rpc\nexport USDT_BUNDLER_URL=${urls.gateway}/v1/usdt/rpc\nexport USDT_DEPOSITS_URL=${urls.gateway}/v1/usdt/deposits\nexport USDT_BRIDGES_URL=${urls.gateway}/v1/usdt/bridges\nexport USDT_BRIDGE_NETWORKS=\nexport USDT_FIXTURE_URL=${urls.control}`, + `export USDT_RPC_URL=${urls.gateway}/v1/usdt/chain-rpc\nexport USDT_BUNDLER_URL=${urls.gateway}/v1/usdt/rpc\nexport USDT_DEPOSITS_URL=${urls.gateway}/v1/usdt/deposits\nexport USDT_BRIDGES_URL=${urls.gateway}/v1/usdt/bridges\nexport USDT_BRIDGE_NETWORKS=ethereum,polygon,plasma,stable\nexport USDT_FIXTURE_URL=${urls.control}`, ); return; } if ( - ['status', 'balance', 'fund', 'mine', 'reset', 'provider-mode', 'bundling', 'bundle'].includes( - command, - ) + [ + 'status', + 'balance', + 'fund', + 'mine', + 'reset', + 'provider-mode', + 'bundling', + 'bundle', + 'orchestra', + 'layerzero', + 'layerzero-mode', + ].includes(command) ) { console.log(JSON.stringify(await rpc(urls.control, command, args), null, 2)); return; @@ -37,6 +48,7 @@ async function main() { setup Install pinned Anvil and build the gateway run Run local services until Ctrl-C smoke Real Core first/subsequent sends, fees, pending/restart and proofs + bridge-smoke Real local funding/receipts through bridge provider fixtures wallet ARGS Core test wallet (address, send, refresh, history, proof, verify) env Print app endpoint exports status Health, versions and upstream read counts @@ -47,6 +59,9 @@ async function main() { bundling MODE auto | manual (hold pending operations) bundle Include pending operations reset Reset this fixture's chain/mempool; reset test apps/peers too + orchestra ARGS list | deposit OWNER NETWORK USDT | advance ID STATUS | mode | fee | quote-ttl + layerzero TX_HASH STATUS Set delivery state for a real OFTSent receipt + layerzero-mode MODE healthy | unavailable | rate-limited | invalid-response `); } main().catch((error) => { diff --git a/usdt/layerzero.cjs b/usdt/layerzero.cjs new file mode 100644 index 0000000..b6a7dcf --- /dev/null +++ b/usdt/layerzero.cjs @@ -0,0 +1,67 @@ +const assert = require('node:assert/strict'); +const { parseAbi, decodeEventLog } = require('viem'); +const { rpc } = require('./rpc.cjs'); +const { providerMode } = require('./bridge-http.cjs'); +const OFT = '0x14E4A1B13bf7F943c8ff7C51fb60FA964A298D92'; +const oftAbi = parseAbi([ + 'event OFTSent(bytes32 indexed guid, uint32 dstEid, address indexed fromAddress, uint256 amountSentLD, uint256 amountReceivedLD)', +]); +const statuses = [ + 'INFLIGHT', + 'CONFIRMING', + 'DELIVERED', + 'FAILED', + 'BLOCKED', + 'PAYLOAD_STORED', + 'APPLICATION_BURNED', + 'APPLICATION_SKIPPED', +]; +class LayerZeroFixture { + constructor(node) { + this.node = node; + this.reset(); + } + reset() { + this.mode = 'healthy'; + this.statuses = new Map(); + } + async messages(hash) { + assert(/^0x[0-9a-fA-F]{64}$/.test(hash), 'Expected a source transaction hash'); + const receipt = await rpc(this.node, 'eth_getTransactionReceipt', [hash]); + if (receipt?.status !== '0x1') return []; + return receipt.logs + .filter((log) => log.address.toLowerCase() === OFT.toLowerCase()) + .flatMap((log) => { + let event; + try { + event = decodeEventLog({ abi: oftAbi, ...log }); + } catch { + return []; + } + return [ + { + guid: event.args.guid, + pathway: { srcEid: 30110, dstEid: event.args.dstEid, sender: { address: OFT } }, + source: { tx: { txHash: receipt.transactionHash } }, + status: { name: this.statuses.get(hash.toLowerCase()) ?? 'INFLIGHT' }, + }, + ]; + }); + } + async request(method, url) { + assert.equal(method, 'GET'); + assert(url.pathname.startsWith('/v1/messages/tx/'), 'Unknown LayerZero fixture path'); + return { data: await this.messages(url.pathname.slice('/v1/messages/tx/'.length)) }; + } + async set(hash, status) { + assert(statuses.includes(status), 'Unknown LayerZero status'); + assert((await this.messages(hash)).length, 'Source receipt has no successful OFTSent event'); + this.statuses.set(hash.toLowerCase(), status); + return { data: await this.messages(hash) }; + } + setMode(mode) { + this.mode = providerMode(mode); + return this.mode; + } +} +module.exports = { LayerZeroFixture, OFT, oftAbi }; diff --git a/usdt/orchestra.cjs b/usdt/orchestra.cjs new file mode 100644 index 0000000..bcd4492 --- /dev/null +++ b/usdt/orchestra.cjs @@ -0,0 +1,410 @@ +const assert = require('node:assert/strict'); +const { randomUUID } = require('node:crypto'); +const { + encodeFunctionData, + parseAbi, + decodeEventLog, + encodeEventTopics, + getAddress, +} = require('viem'); +const { TOKEN, atomicAmount, transfer } = require('./contracts.cjs'); +const { rpc } = require('./rpc.cjs'); +const { providerMode } = require('./bridge-http.cjs'); +const { + sourceNetworks, + bridgeNetworks, + asset, + addresses, + evmAddress, + digest, + units, + scale, +} = require('./bridge-assets.cjs'); +const tokenAbi = parseAbi([ + 'function transfer(address,uint256) returns (bool)', + 'event Transfer(address indexed from, address indexed to, uint256 value)', +]); +const id = (prefix) => `${prefix}_${randomUUID()}`; +const refFor = (owner) => `bitkit-arb-usdt-v1-${getAddress(owner).toLowerCase()}`; +function need(value) { + if (!value) throw Object.assign(new Error('not_found'), { status: 404 }); + return value; +} +class OrchestraFixture { + constructor(node) { + this.node = node; + this.reset(); + } + reset() { + this.mode = 'healthy'; + this.fee = 10000n; + this.ttl = 120; + this.accounts = new Map(); + this.quotes = new Map(); + this.deposits = new Map(); + this.keys = new Map(); + } + output(amount) { + const result = BigInt(amount) - this.fee; + if (BigInt(amount) < 20000n || result <= 0n) + throw Object.assign(new Error('amount_too_small'), { status: 409 }); + return result; + } + standing(ref, instruction) { + let account = this.accounts.get(ref); + if (instruction) { + assert.equal(instruction.destination.chain, 'arbitrum'); + assert.equal(instruction.destination.asset, 'USDT'); + assert.equal(ref, refFor(instruction.destination.address)); + if (account) assert.deepEqual(account.instruction, instruction, 'instruction_conflict'); + else { + account = { + instruction, + standingAddressId: id('standing'), + addresses: addresses(ref), + enabled: true, + }; + this.accounts.set(ref, account); + } + } + return need(account); + } + async quote(body, key) { + assert(key, 'Missing idempotency key'); + const createdBlock = await rpc(this.node, 'eth_blockNumber'); + const previous = this.keys.get(key); + if (previous) { + assert.deepEqual(previous.body, body, 'idempotency_conflict'); + return previous.quote; + } + assert.equal(body.sourceChain, 'arbitrum'); + assert.equal(body.sourceAsset, 'USDT'); + assert.equal(body.destinationAsset, 'USDT'); + assert.equal(body.refundChain, 'arbitrum'); + assert(bridgeNetworks.includes(body.destinationChain), 'route_unavailable'); + const owner = getAddress(body.refundAddress); + const quoteId = id('quote'); + const funding = evmAddress(quoteId); + const quote = { + quoteId, + depositAddress: funding, + amountIn: body.amount, + estimatedOut: units(this.output(body.amount), body.destinationChain), + expiresAt: new Date(Date.now() + this.ttl * 1000).toISOString(), + transaction: { + chainId: 42161, + to: TOKEN, + data: encodeFunctionData({ + abi: tokenAbi, + functionName: 'transfer', + args: [funding, BigInt(body.amount)], + }), + value: '0', + }, + route: ['arbitrum:USDT', `${body.destinationChain}:USDT`], + amountMode: 'exact_in', + }; + const summary = { + id: quoteId, + sourceChain: 'arbitrum', + sourceAsset: 'USDT', + destinationChain: body.destinationChain, + destinationAsset: 'USDT', + amountIn: quote.amountIn, + estimatedOut: quote.estimatedOut, + depositAddress: funding, + recipientAddress: body.recipientAddress, + expiresAt: quote.expiresAt, + slippageBps: 50, + }; + this.quotes.set(quoteId, { + id: quoteId, + owner, + quote, + summary, + createdBlock, + order: null, + }); + this.keys.set(key, { body, quote }); + return quote; + } + async funded(record) { + if (record.order) return record.order; + const logs = await rpc(this.node, 'eth_getLogs', [ + { + address: TOKEN, + fromBlock: record.createdBlock, + toBlock: 'latest', + topics: encodeEventTopics({ + abi: tokenAbi, + eventName: 'Transfer', + args: { from: record.owner, to: record.quote.depositAddress }, + }), + }, + ]); + for (const log of logs) { + if ( + log.removed || + decodeEventLog({ abi: tokenAbi, ...log }).args.value !== BigInt(record.quote.amountIn) + ) + continue; + const receipt = await rpc(this.node, 'eth_getTransactionReceipt', [log.transactionHash]); + if (receipt?.status !== '0x1' || receipt.blockHash !== log.blockHash) continue; + if (record.order) return record.order; + record.order = { + ...record.summary, + id: id('order'), + type: 'order', + quoteId: record.id, + status: 'processing', + sourceAddress: record.owner, + sourceTxHash: receipt.transactionHash, + destinationAddress: record.summary.recipientAddress, + amountOut: record.quote.estimatedOut, + destinationTxHash: null, + refundTxHash: null, + errorCode: null, + }; + break; + } + return record.order; + } + async request(method, url, body, key) { + const path = url.pathname; + const query = url.searchParams; + if (method === 'GET' && path === '/v2/orchestration/routes') + return { + assets: ['arbitrum', ...bridgeNetworks].map((chain) => ({ + ...asset(chain), + id: `${chain}:USDT`, + route: { to: 'all' }, + })), + }; + if (method === 'GET' && path === '/v1/standing-deposit-addresses/destinations') + return { destinations: [{ chain: 'arbitrum', asset: 'USDT' }] }; + if (method === 'GET' && path === '/v1/orchestration/limits') + return { + routes: [ + { + sourceChain: query.get('sourceChain'), + sourceAsset: 'USDT', + destinationChain: 'arbitrum', + destinationAsset: 'USDT', + limits: { + orderNotionalUsd: { minCents: '2', maxCents: '100000000' }, + exactIn: { supported: true }, + }, + }, + ], + }; + if (method === 'GET' && path === '/v1/orchestration/estimate') { + const network = query.get('sourceChain'); + assert(sourceNetworks.includes(network)); + return { + estimatedOut: this.output(BigInt(query.get('amount')) / scale(network)).toString(), + feeAsset: 'USDT', + feeAssetDetails: asset(network), + source: asset(network), + destination: asset('arbitrum'), + amountMode: 'exact_in', + }; + } + if (method === 'POST' && path === '/v1/orchestration/quote') return this.quote(body, key); + if (method === 'GET' && path === '/v1/orchestration/order') { + const record = need(this.quotes.get(query.get('quoteId'))); + return { quote: record.summary, order: await this.funded(record) }; + } + if (method === 'GET' && path === '/v1/orchestration/status') { + const record = [...this.deposits.values(), ...this.quotes.values()].find( + (r) => r.order?.id === query.get('id'), + ); + return { order: need(record).order }; + } + const match = /^\/v1\/standing-deposit-addresses\/([^/]+)(?:\/(deposits|resolve))?$/.exec(path); + assert(match, 'Unknown Orchestra fixture path'); + const [, ref, action] = match; + if (!action && ['GET', 'PUT'].includes(method)) + return this.standing(ref, method === 'PUT' ? body : undefined); + const account = need(this.accounts.get(ref)); + if (method === 'GET' && action === 'deposits') { + const offset = Number(query.get('offset') ?? 0); + assert(Number.isInteger(offset) && offset >= 0); + const rows = [...this.deposits.values()] + .filter((r) => r.ref === ref) + .reverse() + .map((r) => r.deposit); + return { + deposits: rows.slice(offset, offset + 50), + nextOffset: offset + 50 < rows.length ? offset + 50 : null, + }; + } + if (method === 'POST' && action === 'resolve') { + assert.equal(body.depositIds.length, 1); + const record = need(this.deposits.get(body.depositIds[0])); + assert.equal(record.ref, ref); + assert( + !record.effect && !['completed', 'refunded'].includes(record.deposit.status), + 'refund_not_available', + ); + assert( + body.refundAddress !== account.addresses[record.deposit.chain], + 'invalid_refund_address', + ); + if (record.refundAddress) + assert.equal(record.refundAddress, body.refundAddress, 'instruction_conflict'); + if (!record.refundAddress) { + record.refundAddress = body.refundAddress; + record.deposit.batchState = 'refund_requested'; + } + return { batchId: `batch_${record.id}`, status: 'refund_requested' }; + } + throw new Error('Unknown Orchestra fixture method'); + } + addDeposit(owner, network, amount) { + const ref = refFor(owner); + const account = need(this.accounts.get(ref)); + assert(sourceNetworks.includes(network), 'Unsupported deposit network'); + const input = atomicAmount(amount); + const received = this.output(input); + const depositId = id('deposit'); + const deposit = { + id: depositId, + chain: network, + asset: 'USDT', + amount: units(input, network), + sourceTxId: digest(depositId), + status: 'held', + code: 'standing_route_unavailable', + orderId: null, + batchState: null, + refundTxId: null, + }; + this.deposits.set(depositId, { + id: depositId, + ref, + deposit, + recipient: account.instruction.destination.address, + received, + order: null, + }); + return deposit; + } + async advance(id, status) { + assert( + ['processing', 'needs_attention', 'failed', 'completed', 'refunding', 'refunded'].includes( + status, + ), + 'Unknown Orchestra status', + ); + const record = need(this.quotes.get(id) ?? this.deposits.get(id)); + if (!record.deposit) + assert(await this.funded(record), 'Quote has no matching on-chain funding transfer'); + if (record.deposit && ['refunding', 'refunded'].includes(status)) + assert(record.refundAddress, 'Request the deposit refund through the app first'); + if (record.deposit && status === 'completed') + assert(!record.refundAddress, 'Refund already requested'); + if (record.effect) { + assert.equal(record.effect.status, status, 'Settlement already selected'); + return record.effect.promise; + } + const settle = async () => { + if (record.deposit) { + const deposit = record.deposit; + if (!record.order) { + record.order = { + id: `order_${id}`, + status: 'processing', + sourceChain: deposit.chain, + sourceAsset: 'USDT', + destinationChain: 'arbitrum', + destinationAsset: 'USDT', + recipientAddress: record.recipient, + amountIn: deposit.amount, + amountOut: record.received.toString(), + destinationTxHash: null, + refundTxHash: null, + errorCode: null, + }; + deposit.orderId = record.order.id; + } + if (status === 'completed') { + record.order.destinationTxHash = await transfer( + this.node, + record.recipient, + record.received, + ); + } + if (status === 'refunded') + record.order.refundTxHash = deposit.refundTxId = digest(`refund_${id}`); + deposit.status = status === 'needs_attention' ? 'held' : status; + deposit.code = + status === 'needs_attention' || status === 'failed' ? 'provider_review' : null; + deposit.batchState = ['refunding', 'refunded'].includes(status) ? status : null; + } else { + const order = record.order; + if (status === 'completed') order.destinationTxHash = digest(`destination_${id}`); + if (status === 'refunded') { + order.refundTxHash = await transfer( + this.node, + record.owner, + BigInt(record.quote.amountIn), + ); + order.refundAsset = 'USDT'; + order.refundAmount = record.quote.amountIn; + } + } + record.order.status = status === 'needs_attention' ? 'processing' : status; + record.order.errorCode = ['needs_attention', 'failed'].includes(status) + ? 'provider_review' + : null; + return record.order; + }; + // A repeated settlement command shares the same transfer, including while it is in flight. + if (['completed', 'refunded'].includes(status)) { + record.effect = { status, promise: settle() }; + return record.effect.promise; + } + return settle(); + } + async control([command, ...args]) { + switch (command) { + case 'list': + for (const record of this.quotes.values()) await this.funded(record); + return { + accounts: [...this.accounts.entries()].map(([ref, a]) => ({ ref, ...a })), + quotes: [...this.quotes.values()].map(({ id, owner, summary, order }) => ({ + id, + owner, + ...summary, + order, + })), + deposits: [...this.deposits.values()].map(({ deposit, order, refundAddress }) => ({ + deposit, + order, + refundAddress, + })), + }; + case 'deposit': + return this.addDeposit(...args); + case 'advance': + return this.advance(...args); + case 'mode': + this.mode = providerMode(args[0]); + return this.mode; + case 'fee': + this.fee = args[0] === '0' ? 0n : atomicAmount(args[0]); + return this.fee.toString(); + case 'quote-ttl': { + const ttl = Number(args[0]); + assert(Number.isInteger(ttl) && ttl >= 1 && ttl <= 3600, 'Use 1-3600 seconds'); + this.ttl = ttl; + return ttl; + } + default: + throw new Error( + 'Use list, deposit OWNER NETWORK USDT, advance ID STATUS, mode, fee USDT or quote-ttl SECONDS', + ); + } + } +} +module.exports = { OrchestraFixture }; diff --git a/usdt/package-lock.json b/usdt/package-lock.json index d058b99..da8ed63 100644 --- a/usdt/package-lock.json +++ b/usdt/package-lock.json @@ -9,6 +9,7 @@ "version": "0.1.0", "dependencies": { "@pimlico/alto": "0.0.21", + "@scure/base": "1.2.6", "viem": "2.57.1" }, "devDependencies": { diff --git a/usdt/package.json b/usdt/package.json index 71b64ec..0e3a133 100644 --- a/usdt/package.json +++ b/usdt/package.json @@ -12,6 +12,7 @@ }, "dependencies": { "@pimlico/alto": "0.0.21", + "@scure/base": "1.2.6", "viem": "2.57.1" }, "devDependencies": { diff --git a/usdt/run.cjs b/usdt/run.cjs index 7af8385..1414de1 100644 --- a/usdt/run.cjs +++ b/usdt/run.cjs @@ -22,6 +22,10 @@ const { } = require('./contracts.cjs'); const { state } = require('./setup.cjs'); const pins = require('./pins.json'); +const { serveProvider } = require('./bridge-http.cjs'); +const { OrchestraFixture } = require('./orchestra.cjs'); +const { LayerZeroFixture } = require('./layerzero.cjs'); +const { sourceNetworks, bridgeNetworks } = require('./bridge-assets.cjs'); const ports = { node: 23450, alto: 23451, @@ -29,6 +33,8 @@ const ports = { gateway: 23453, control: 23454, upstream: 23455, + orchestra: 23456, + layerzero: 23457, }; const urls = Object.fromEntries( Object.entries(ports).map(([name, port]) => [name, `http://127.0.0.1:${port}`]), @@ -178,6 +184,10 @@ async function run() { return rpc(urls.alto, method, params); }), ); + const orchestra = new OrchestraFixture(urls.node); + const layerzero = new LayerZeroFixture(urls.node); + servers.push(await serveProvider(ports.orchestra, orchestra, 'local-orchestra-fixture')); + servers.push(await serveProvider(ports.layerzero, layerzero)); const service = path.join(state, 'service'); child('gateway', process.execPath, [path.join(service, 'dist/index.js')], { NODE_ENV: 'test', @@ -186,11 +196,13 @@ async function run() { ARBITRUM_RPC_URL: urls.node, LOCAL_PROVIDER_URL: urls.provider, PIMLICO_API_KEY: '', - ORCHESTRA_API_KEY: '', - ORCHESTRA_BRIDGE_SECRET: '', - ORCHESTRA_BRIDGE_NETWORKS: '', - ORCHESTRA_DEPOSIT_NETWORKS: '', - USDT_BRIDGE_NETWORKS: '', + LOCAL_ORCHESTRA_URL: urls.orchestra, + LOCAL_LAYERZERO_URL: urls.layerzero, + ORCHESTRA_API_KEY: 'local-orchestra-fixture', + ORCHESTRA_BRIDGE_SECRET: 'ab'.repeat(32), + ORCHESTRA_BRIDGE_NETWORKS: bridgeNetworks.join(','), + ORCHESTRA_DEPOSIT_NETWORKS: sourceNetworks.join(','), + USDT_BRIDGE_NETWORKS: 'ethereum,polygon,plasma,stable', REQUESTS_PER_MINUTE: '10000', GLOBAL_REQUESTS_PER_MINUTE: '100000', }); @@ -216,6 +228,12 @@ async function run() { return (await balance(urls.node, params[0])).toString(); case 'fund': return transfer(urls.node, params[0], atomicAmount(params[1])); + case 'orchestra': + return orchestra.control(params); + case 'layerzero': + return layerzero.set(...params); + case 'layerzero-mode': + return layerzero.setMode(params[0]); case 'mine': { const count = Number(params[0] ?? 3); if (!Number.isInteger(count) || count < 1 || count > 1000) @@ -239,6 +257,8 @@ async function run() { await rpc(urls.node, 'evm_setNextBlockTimestamp', [Math.floor(Date.now() / 1000)]); await rpc(urls.node, 'anvil_mine', [1]); snapshot = await rpc(urls.node, 'evm_snapshot'); + orchestra.reset(); + layerzero.reset(); mode = 'healthy'; await rpc(urls.alto, 'debug_bundler_setBundlingMode', ['auto']); return true; diff --git a/usdt/wallet/src/main.rs b/usdt/wallet/src/main.rs index d475b72..d4c5888 100644 --- a/usdt/wallet/src/main.rs +++ b/usdt/wallet/src/main.rs @@ -1,7 +1,7 @@ use anyhow::{bail, Context, Result}; use bitkitcore::{ - usdt_address, UsdtBackup, UsdtDestination, UsdtError, UsdtPaymentProof, - UsdtPaymentProofBinding, UsdtWallet, + usdt_address, UsdtBackup, UsdtDepositClient, UsdtDepositNetwork, UsdtDestination, UsdtError, + UsdtPaymentProof, UsdtPaymentProofBinding, UsdtWallet, }; use serde_json::{json, Value}; use std::{path::PathBuf, sync::Arc}; @@ -55,16 +55,21 @@ async fn main() -> Result<()> { .into(), format!("{GATEWAY}/chain-rpc"), format!("{GATEWAY}/rpc"), - None, + Some(format!("{GATEWAY}/bridges")), Arc::new(Backup), )?; let result = match command { "address" => json!({"address":address}), "balance" => json!({"address":address,"balance":wallet.balance().await?}), - "send" => { + "quote" | "send" => { let recipient = args.get(1).context("send requires recipient and atomic amount")?; let amount: u64 = args.get(2).context("send requires atomic amount")?.parse()?; - let quote = wallet.quote_transfer(recipient.clone(), amount, UsdtDestination::Arbitrum).await?; + let destination = args.get(3).map(|s| serde_json::from_value::(json!(s))).transpose()?.unwrap_or(UsdtDestination::Arbitrum); + let quote = wallet.quote_transfer(recipient.clone(), amount, destination).await?; + if command == "quote" { + println!("{}", serde_json::to_string_pretty("e)?); + return Ok(()); + } let transfer = wallet.send(quote.id.clone(), MNEMONIC.into(), passphrase.clone()).await?; json!({"quote":quote,"transfer":transfer}) } @@ -73,6 +78,31 @@ async fn main() -> Result<()> { json!(wallet.refresh_transfers().await?.into_iter().find(|transfer| transfer.id == *id)) } "history" => json!(wallet.history()?), + "deposit" => { + let client = UsdtDepositClient::new(address, format!("{GATEWAY}/deposits"))?; + match args.get(1).map(String::as_str) { + Some("receive") => { + let network: UsdtDepositNetwork = serde_json::from_value(json!(args.get(2).context("receive requires network")?))?; + let amount = args.get(3).context("receive requires atomic amount")?.parse()?; + let result = client.receive(network, amount, MNEMONIC.into(), passphrase).await?; + json!({"address":result.address,"recipient":result.recipient,"amount":result.amount,"estimated_received":result.estimated_received,"uri":result.uri}) + } + Some("history") => { + let page = client.history(0, MNEMONIC.into(), passphrase).await?; + json!({"deposits": page.deposits.into_iter().map(|d|json!({"id":d.id,"status":d.status,"amount":d.amount,"refund_tx":d.refund_tx})).collect::>(),"next_offset":page.next_offset}) + } + Some("detail") => { + let d = client.detail(args.get(2).context("detail requires ID")?.clone(), 0, MNEMONIC.into(), passphrase).await?; + json!({"id":d.deposit.id,"status":d.deposit.status,"order":d.order.map(|o|json!({"status":o.status,"amount_out":o.amount_out,"destination_tx":o.destination_tx,"refund_tx":o.refund_tx}))}) + } + Some("refund") => { + let network: UsdtDepositNetwork = serde_json::from_value(json!(args.get(4).context("refund requires network")?))?; + client.request_refund(args.get(2).context("refund requires ID")?.clone(), 0, args.get(3).context("refund requires address")?.clone(), network, MNEMONIC.into(), passphrase).await?; + json!({"status":"refund_requested"}) + } + _ => bail!("deposit receive NETWORK ATOMIC_AMOUNT | history | detail ID | refund ID ADDRESS NETWORK"), + } + } "proof" => { let id = args.get(1).context("proof requires transfer ID and binding file")?; let binding = load(args.get(2).context("proof requires binding file")?)?; @@ -89,7 +119,7 @@ async fn main() -> Result<()> { }).await?; verified.map(|p| json!({"payment_id":p.payment_id,"transfer_id":p.transfer_id,"sender":p.sender,"recipient":p.recipient,"amount":p.amount,"timestamp":p.timestamp})).unwrap_or(Value::Null) } - _ => bail!("use address, balance, send RECIPIENT ATOMIC_AMOUNT, refresh ID, history, proof ID BINDING_FILE, or verify BINDING_FILE PROOF_FILE"), + _ => bail!("use address, balance, quote/send RECIPIENT ATOMIC_AMOUNT [Destination], deposit, refresh ID, history, proof ID BINDING_FILE, or verify BINDING_FILE PROOF_FILE"), }; println!("{}", serde_json::to_string_pretty(&result)?); Ok(()) From 5e4df2d44e0950abe8ff47a62c01863aaaea49c0 Mon Sep 17 00:00:00 2001 From: benk10 Date: Sat, 10 Oct 2026 21:41:11 -0500 Subject: [PATCH 3/7] Run USDT fixtures in the Docker Compose stack --- CHANGELOG.md | 2 +- README.md | 14 +- docker-compose.yml | 112 ++++++++++++++++ docs/usdt-fixture.md | 39 +++--- shop-order | 2 +- usdt-fixture | 100 +++++++++++++- usdt/Dockerfile | 50 +++++++ usdt/bridge-smoke.cjs | 15 +-- usdt/cli.cjs | 34 +---- usdt/config.cjs | 15 +++ usdt/fetch-anvil.cjs | 24 ++++ usdt/pins.json | 2 - usdt/rpc.cjs | 6 +- usdt/run.cjs | 285 ---------------------------------------- usdt/server.cjs | 165 +++++++++++++++++++++++ usdt/setup.cjs | 54 -------- usdt/shop-compose.yml | 8 +- usdt/shop-rpc.cjs | 2 +- usdt/smoke.cjs | 16 +-- usdt/wait.cjs | 21 +++ usdt/wallet/Cargo.toml | 2 +- usdt/wallet/src/main.rs | 2 +- 22 files changed, 541 insertions(+), 429 deletions(-) create mode 100644 usdt/Dockerfile create mode 100644 usdt/config.cjs create mode 100644 usdt/fetch-anvil.cjs delete mode 100644 usdt/run.cjs create mode 100644 usdt/server.cjs delete mode 100644 usdt/setup.cjs create mode 100644 usdt/wait.cjs diff --git a/CHANGELOG.md b/CHANGELOG.md index 618656b..eb086bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Add local Orchestra and LayerZero providers with bridge lifecycle controls, real Arbitrum credits/refunds and a Core bridge smoke suite -- Add an isolated Arbitrum/Alto USDT fixture with a real Core payment/proof smoke test, controlled paymaster failures and optional Shop USDT verification wiring +- Add an isolated `usdt` Compose profile with pinned Anvil/Alto/gateway images, a containerized Core wallet, real payment/proof smoke checks, controlled paymaster failures and private-network Shop verification - Run the Shop's marketplace on Synonym's staging with our own Paykit Server v0.1.0-rc11 behind a Cloudflare quick tunnel (`./shop-mixed`, profile `shop-mixed`) - Run a paid Shop order on our own Paykit Server, Lock Server, marketplace service and Shop with Synonym's staging homeserver (`./shop-order`, profile `shop-order`) - Rebuild the Paykit fixtures on the paykit-rs version a Bitkit pull request pins with `scripts/follow-app-paykit` diff --git a/README.md b/README.md index 70c1ad2..c010502 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,10 @@ A complete Docker-based development environment for Bitcoin and Lightning Networ Run the shared Arbitrum fork, Alto and gateway without spending mainnet funds: ```sh -./usdt-fixture setup -USDT_TEST_ENV_FILE=/absolute/path/to/private.env ./usdt-fixture run -# In another terminal: +./usdt-fixture build +export USDT_TEST_ENV_FILE=/absolute/path/to/private.env +./usdt-fixture up +./usdt-fixture check ./usdt-fixture smoke ./usdt-fixture bridge-smoke eval "$(./usdt-fixture env)" @@ -17,8 +18,11 @@ eval "$(./usdt-fixture env)" ``` The private file contains `ARBITRUM_RPC_URL=https://...` with historical-state access. -Requires Node 22.23.1+, Rust, Git and tar. Keep existing staging VSS, Pubky and rate -services. The stack also starts local Orchestra and LayerZero providers. After the +Requires Docker Compose, Git access to the pinned Core/service repositories, jq +and tar. Builds and tools run inside containers; no host Node or Rust is needed. +Use `./usdt-fixture logs` to inspect services and `./usdt-fixture down` to remove +this isolated stack and its disposable wallet volume. Keep existing staging VSS, +Pubky and rate services. The stack also starts local Orchestra and LayerZero providers. After the app registers a bridge receive address, use `./usdt-fixture orchestra deposit ADDRESS polygon 3.5`, then `./usdt-fixture orchestra advance DEPOSIT_ID completed` to deliver local tokens. `orchestra list` shows outgoing quotes; `layerzero diff --git a/docker-compose.yml b/docker-compose.yml index 54586ec..3f308c7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -864,7 +864,115 @@ services: ports: - "127.0.0.1:23141:23141" + # USDT test chain and provider fixtures. Opt in with ./usdt-fixture. + # Shared loopback matches Core/gateway local endpoint validation. + usdt-fixture: + profiles: [usdt] + image: bitkit-docker/usdt-fixture:local + build: + context: ./.usdt/build + dockerfile: usdt/Dockerfile + target: fixture + # File-backed Compose secrets retain host ownership on Linux. + user: "0:0" + init: true + restart: "no" + secrets: + - usdt_upstream + environment: + USDT_GATEWAY_PORT: ${USDT_GATEWAY_PORT:-23453} + USDT_CONTROL_PORT: ${USDT_CONTROL_PORT:-23454} + ports: + - "127.0.0.1:${USDT_GATEWAY_PORT:-23453}:23453" + - "127.0.0.1:${USDT_CONTROL_PORT:-23454}:23454" + healthcheck: + test: ["CMD", "node", "cli.cjs", "status"] + interval: 2s + timeout: 5s + retries: 60 + start_period: 10s + + usdt-node: + profiles: [usdt] + image: bitkit-docker/usdt-fixture:local + init: true + restart: "no" + network_mode: service:usdt-fixture + depends_on: + usdt-fixture: + condition: service_started + entrypoint: [/bin/sh, -c] + command: + - node wait.cjs upstream && exec anvil --host 127.0.0.1 --port 23450 --fork-url http://127.0.0.1:23455 --fork-block-number "$$(node -p "require('./pins.json').forkBlock")" --chain-id 42161 --hardfork prague --silent --block-time 1 + + usdt-alto: + profiles: [usdt] + image: bitkit-docker/usdt-fixture:local + init: true + restart: "no" + network_mode: service:usdt-fixture + depends_on: + usdt-fixture: + condition: service_healthy + entrypoint: [/bin/sh, -c] + command: + - | + KEY="$$(node -p "require('viem').toHex(require('./contracts.cjs').executor.getHdKey().privateKey)")" + exec node node_modules/@pimlico/alto/esm/cli/alto.js --entrypoints 0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108 --rpc-url http://127.0.0.1:23450 --executor-private-keys "$$KEY" --utility-private-key "$$KEY" --port 23451 --chain-type default --safe-mode false --enable-debug-endpoints true --min-executor-balance 0 --log-level warn --json true + healthcheck: + test: ["CMD", "node", "-e", "require('./rpc.cjs').rpc('http://127.0.0.1:23451','eth_supportedEntryPoints').catch(()=>process.exit(1))"] + interval: 2s + timeout: 5s + retries: 30 + + usdt-gateway: + profiles: [usdt] + image: bitkit-docker/usdt-gateway:local + build: + context: ./.usdt/build + dockerfile: usdt/Dockerfile + target: gateway + init: true + restart: "no" + network_mode: service:usdt-fixture + depends_on: + usdt-alto: + condition: service_healthy + environment: + NODE_ENV: test + HOST: 0.0.0.0 + PORT: 23453 + ARBITRUM_RPC_URL: http://127.0.0.1:23450 + LOCAL_PROVIDER_URL: http://127.0.0.1:23452 + LOCAL_ORCHESTRA_URL: http://127.0.0.1:23456 + LOCAL_LAYERZERO_URL: http://127.0.0.1:23457 + ORCHESTRA_API_KEY: local-orchestra-fixture + ORCHESTRA_BRIDGE_SECRET: abababababababababababababababababababababababababababababababab + ORCHESTRA_BRIDGE_NETWORKS: ethereum,polygon,base,bsc,tron,solana,plasma + ORCHESTRA_DEPOSIT_NETWORKS: ethereum,polygon,base,bsc,tron,solana + USDT_BRIDGE_NETWORKS: ethereum,polygon,plasma,stable + REQUESTS_PER_MINUTE: 10000 + GLOBAL_REQUESTS_PER_MINUTE: 100000 + healthcheck: + test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:23453/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] + interval: 2s + timeout: 5s + retries: 30 + + usdt-tools: + profiles: [usdt] + image: bitkit-docker/usdt-fixture:local + network_mode: service:usdt-fixture + depends_on: + usdt-gateway: + condition: service_healthy + volumes: + - usdt_state:/state + - ./.usdt/evidence:/evidence:ro + entrypoint: ["node", "cli.cjs"] + volumes: + usdt_state: trezor_emulator_state: trezor_emulator_logs: bitcoin_home: @@ -879,4 +987,8 @@ volumes: shop_mixed_state: shop_order_postgres_data: +secrets: + usdt_upstream: + file: ${USDT_TEST_ENV_FILE:-/dev/null} + networks: {} diff --git a/docs/usdt-fixture.md b/docs/usdt-fixture.md index 99e1596..dc08d86 100644 --- a/docs/usdt-fixture.md +++ b/docs/usdt-fixture.md @@ -1,26 +1,32 @@ # Local USDT execution -`./usdt-fixture` runs an isolated Arbitrum state fork, Alto, a test token-paymaster signer and the real Bitkit USDT gateway as host processes. This works without Docker on hosted macOS runners. It does not start or replace Bitcoin, Lightning, VSS, Pubky or rate services. +`./usdt-fixture` runs an isolated Arbitrum state fork, Alto, a test token-paymaster signer and the real Bitkit USDT gateway in the opt-in `usdt` Compose profile. It uses a dedicated project (`usdt-fixture` by default), leaving the existing Bitcoin, Lightning, VSS, Pubky and rate services alone. ## Versions and state -Install Node 22.23.1 (or a later Node 22), npm, Rust, Git and tar. `setup` downloads Anvil with a verified release checksum and builds the gateway and Core wallet at the revisions in `usdt/pins.json`. Alto and viem are locked by `usdt/package-lock.json`; Rust dependencies are locked by `usdt/wallet/Cargo.lock`. Core is fetched shallowly into `.usdt/core` to avoid cloning its binary release history. Its published 0.8.0-rc2 source is used without modifications. +Install Docker with Compose, Git, jq and tar. Your Git credentials must allow reads of the pinned Core and service repositories. `build` fetches their exact revisions from `usdt/pins.json` into ignored `.usdt/sources/` and exports clean source trees for the container build. Credentials and Git metadata stay outside images. Anvil's Linux release is checksum-verified; Alto and viem use `usdt/package-lock.json`; the Core wallet uses `usdt/wallet/Cargo.lock`. Node and Rust run inside pinned build images, with no host toolchain required. Linux AMD64 and ARM64 are supported. CI must use a Docker-capable runner. -Runtime files, test wallet databases and process logs are kept in ignored `.usdt/`. The foreground launcher owns its processes and stops them on Ctrl-C. A new run starts a new chain. Do not restart/reset the fixture midway through an app recovery journey. Use dedicated test apps, seeds and Paykit peers; a chain reset does not reset their databases or VSS backups. +`up` starts four services and waits for health: the fixture/control server, Anvil, Alto and the gateway. They share a network namespace so the existing Core and gateway localhost checks still apply. One-off checks and wallet commands run in the tools container. `logs` follows service output; `ps` shows health. Wallet databases live in the `usdt_state` named volume; the chain and provider state are held in memory. `down` removes only this Compose project's containers, network and disposable wallet volume. -The upstream must serve historical state at the pinned block. Put `ARBITRUM_RPC_URL=https://...` in an untracked private file and pass its path as `USDT_TEST_ENV_FILE`. Only the read proxy knows that URL; Anvil receives a localhost URL. The proxy allowlists reads and blocks transaction submission, wallet methods and node mutations. Cold startup and new account/storage lookups can incur provider RPC charges. No public-chain tokens are spent. +Keep the stack running through app restart, reinstall and VSS recovery tests. Do not restart individual services or reset the chain mid-scenario. Repeated `up` leaves already-running services intact. Use `down` followed by `up` for a fresh stack, with matching dedicated app/peer state. `reset` reverts the live chain and clears provider/bundler state but does not reset wallet databases or VSS backups. Never use a funded mainnet app or real seed. + +The upstream must serve historical state at the pinned block. Put only `ARBITRUM_RPC_URL=https://...` in an untracked private file and export its absolute path as `USDT_TEST_ENV_FILE`. Compose mounts that file read-only as a secret in the fixture container; it is not an environment value, build argument or image layer. The fixture server runs as container root to read a private file regardless of its Linux host owner; the node, bundler, gateway and wallet tools run as non-root. Only the read proxy uses the URL; Anvil receives a localhost URL. The proxy allowlists reads and blocks transaction submission, wallet methods and node mutations. Cold startup and new storage lookups can incur provider RPC charges. No public-chain tokens are spent. ## Commands ```sh -./usdt-fixture setup -USDT_TEST_ENV_FILE=/absolute/path/to/private.env ./usdt-fixture run -# Another terminal, from this checkout: -./usdt-fixture status +./usdt-fixture build +export USDT_TEST_ENV_FILE=/absolute/path/to/private.env +./usdt-fixture up +./usdt-fixture ps +./usdt-fixture check ./usdt-fixture smoke +./usdt-fixture bridge-smoke ./usdt-fixture fund 0xYOUR_TEST_WALLET 10 ./usdt-fixture balance 0xYOUR_TEST_WALLET eval "$(./usdt-fixture env)" +# When all journeys are finished: +./usdt-fixture down ``` `fund` executes an actual ERC-20 transfer from a storage-funded donor, producing real receipt/history events. It does not overwrite the recipient balance. `smoke` creates independent disposable Core wallets and checks first-use EIP-7702 delegation without ETH, two sends, USDT fees and the approved fee bound, pending/manual inclusion across wallet reopen, proof verification, changed request binding and rejected paymaster authorization. It restores provider/bundler modes and removes only its own temporary wallet files. @@ -39,7 +45,7 @@ eval "$(./usdt-fixture env)" | `wallet proof ID BINDING_FILE` | Create the standard proof after execution | | `wallet verify BINDING_FILE PROOF_FILE` | Verify receipt, token, recipient and signature using the recipient Core wallet | -`USDT_WALLET_NAME` chooses a deterministic public test account; `USDT_WALLET_DIR` chooses its local database directory. The mnemonic and derivation passphrases are public test material. Never use them for actual funds. `wallet` uses a no-op backup adapter; it is an execution/proof tool, not a VSS test. App recovery tests must use the existing VSS helpers. +`USDT_WALLET_NAME` chooses a deterministic public test account. Wallet databases are kept under `/state/wallet` in the named volume. Put binding/proof input files in `.usdt/evidence/` on the host; tools read them at `/evidence/`. Redirect a wallet command's JSON output to a host file to save a proof. The mnemonic and derivation passphrases are public test material. Never use them for actual funds. `wallet` uses a no-op backup adapter; it is an execution/proof tool, not a VSS test. App recovery tests must use the existing VSS helpers. The binding JSON uses Core's fields: `payer`, `payee`, `payment_app_id`, `payment_request_id`, `payment_reference`, `payment_endpoint_identifier`, `period_starts_at`, `period_ends_at`, `conversion_quote_id`. Use exact authenticated SDK values; absent optional values are empty strings. Proof verification alone does not check the requested price/deadline or prevent evidence reuse: the receiving app/server owns those rules. @@ -50,9 +56,9 @@ The binding JSON uses Core's fields: `payer`, `payee`, `payment_app_id`, `paymen - Alto runs with `safe-mode=false`: its strict tracing path does not handle this Anvil/EIP-7702 setup. Contract simulation and execution remain real; production bundler reputation/storage-access policy is not covered. - Anvil is an EVM fork, not the Arbitrum sequencer or L1 rollup. Local inclusion/finality and gas do not prove real Arbitrum finality or Nitro fees. - Orchestra operators, external deposit monitoring, route liquidity and LayerZero relaying are simulated by local HTTP providers. The real gateway validates their responses through `LOCAL_ORCHESTRA_URL` and `LOCAL_LAYERZERO_URL`; neither provider contacts its public API. Arbitrum credits/refunds execute real token transfers. Off-Arbitrum hashes and delivery states are fixture evidence, not destination-chain execution. Live operator delivery/refunds still need separate acceptance. -- Keep this on a trusted development host. Control, node, provider, gateway and upstream ports bind loopback. Alto 0.0.21 binds its debug RPC on all interfaces; do not expose port 23451 from the runner or run the fixture on a public host. +- Keep this on a trusted development host and private Docker network. Only gateway and control ports are published, on host loopback. Node, bundler, signer and upstream ports are not published. Other containers on the fixture network are trusted test infrastructure. -Ports: node 23450, Alto 23451, signing/provider router 23452, app gateway 23453, fixture controls 23454, upstream read proxy 23455, Orchestra 23456, LayerZero 23457. Android uses `adb reverse tcp:23453 tcp:23453`; iOS uses loopback. Core intentionally does not accept `10.0.2.2` HTTP endpoints. +Published ports default to gateway 23453 and controls 23454; set `USDT_GATEWAY_PORT` and `USDT_CONTROL_PORT` before `up` and `env` to change them. `USDT_PROJECT` selects the isolated Compose project. Keep these settings and `USDT_TEST_ENV_FILE` consistent across commands. Internal ports are node 23450, Alto 23451, signing/router 23452, upstream read proxy 23455, Orchestra 23456, LayerZero 23457 and the read-only Shop RPC 23458. Android reverses the selected gateway port with adb; iOS uses loopback. Core intentionally does not accept `10.0.2.2` HTTP endpoints. ## Bridge scenarios @@ -128,23 +134,22 @@ start a fresh isolated scenario after diagnosing the failure. The optional Shop overlay preserves staging Pubky, rate feeds and Bitcoin. It enables Paykit Server's existing USDT RPC setting and pins Locks to the per-rail verification draft (`pubky/locks#75`, exact revision in `shop-order`). No new payment-verification code is needed in those services for local execution. ```sh -# Start usdt-fixture run first. Use a separate Shop project and keep it for recovery tests. +# Start ./usdt-fixture up first. Use a separate Shop project and keep it for recovery tests. SHOP_ORDER_USDT=1 SHOP_ORDER_PROJECT=shop-usdt ./shop-order fetch SHOP_ORDER_USDT=1 SHOP_ORDER_PROJECT=shop-usdt ./shop-order up SHOP_ORDER_USDT=1 SHOP_ORDER_PROJECT=shop-usdt ./shop-order health ``` -Follow the existing [Shop setup](shop-order.md) to register the seller and enable its USDT receiving address. Fund the payer on this fork, pay the original request, then assert the server's per-rail status and actual unlock. The overlay's read-only RPC sidecar shares Paykit Server's loopback network namespace. Host connectivity uses Docker Desktop's `host.docker.internal`; on Linux, run the fork where the container can reach it through an equivalent private host route before using this overlay. Do not point the verifier at mainnet while the app uses the fork. +Follow the existing [Shop setup](shop-order.md) to register the seller and enable its USDT receiving address. Fund the payer on this fork, pay the original request, then assert the server's per-rail status and actual unlock. The overlay's read-only RPC sidecar shares Paykit Server's loopback network namespace. It reaches the fork through the fixture's private Compose network on Linux and Docker Desktop, without exposing node mutation methods or using a host route. Use the same `USDT_PROJECT` as the running fixture. An explicit `SHOP_ORDER_LOCKS_REV` overrides the default USDT-capable Locks revision. Do not point the verifier at mainnet while the app uses the fork. The overlay is infrastructure wiring; a paid USDT Shop journey and browser unlock remain acceptance tests for the E2E suite. Reset only the dedicated `shop-usdt` project. Always use the same `SHOP_ORDER_USDT=1` and project value for subsequent commands, including teardown. ## Checks ```sh -npm --prefix usdt run lint -npm --prefix usdt test -cargo fmt --manifest-path usdt/wallet/Cargo.toml --check -cargo clippy --locked --manifest-path usdt/wallet/Cargo.toml --all-targets --no-deps -- -D warnings +./usdt-fixture build # Includes Rust fmt/build/clippy and fixture lint/tests +./usdt-fixture up +./usdt-fixture check ./usdt-fixture smoke ./usdt-fixture bridge-smoke ``` diff --git a/shop-order b/shop-order index 7438025..45b55a5 100755 --- a/shop-order +++ b/shop-order @@ -9,7 +9,7 @@ cd "$(dirname "$0")" # The commits the Android and iOS order-paid acceptance ran on (10 Oct). Another revision is refused unless set here on purpose. if [ "${SHOP_ORDER_USDT:-0}" = 1 ]; then # USDT access decisions require the per-rail verifier. - export SHOP_ORDER_LOCKS_REV=15b81eb0c25f693124d2d3ea956586f407170a63 + export SHOP_ORDER_LOCKS_REV=${SHOP_ORDER_LOCKS_REV:-15b81eb0c25f693124d2d3ea956586f407170a63} fi LOCKS_REPO=https://github.com/pubky/locks.git LOCKS_REV=${SHOP_ORDER_LOCKS_REV:-01cfeca14c7b5d385d8c3536c0cb4e1af81b458c} # v0.1.0-rc10 diff --git a/usdt-fixture b/usdt-fixture index 38f4c33..74f8cf4 100755 --- a/usdt-fixture +++ b/usdt-fixture @@ -1,7 +1,97 @@ #!/usr/bin/env bash set -euo pipefail -ROOT=$(cd "$(dirname "$0")" && pwd) -if [ "${1:-help}" = setup ]; then - npm ci --prefix "$ROOT/usdt" --ignore-scripts --no-audit --no-fund -fi -exec node "$ROOT/usdt/cli.cjs" "$@" +cd "$(dirname "$0")" +PROJECT=${USDT_PROJECT:-usdt-fixture} +COMPOSE=(docker compose --project-name "$PROJECT" --profile usdt) +SERVICES=(usdt-fixture usdt-node usdt-alto usdt-gateway) +compose() { "${COMPOSE[@]}" "$@"; } +mkdir -p .usdt/evidence +build() { + mkdir -p .usdt/sources + for name in core service; do + local repo="bitkit-$name" dir=".usdt/sources/$name" revision + if [ "$name" = service ]; then repo=bitkit-usdt-service; fi + revision=$(jq -r ".$name" usdt/pins.json) + if [ ! -d "$dir" ]; then + git init -q "$dir" + git -C "$dir" remote add origin "https://github.com/synonymdev/$repo.git" + fi + if [ -n "$(git -C "$dir" status --porcelain)" ]; then + echo "$dir contains local edits; preserve them before building." >&2 + exit 1 + fi + if ! git -C "$dir" cat-file -e "$revision^{commit}" 2>/dev/null; then + git -C "$dir" fetch -q --depth 1 origin "$revision" + fi + git -C "$dir" checkout -q --detach "$revision" + done + # Export only source files; credentials, Git metadata and runtime state stay outside the build context. + rm -rf .usdt/build + mkdir -p .usdt/build/core .usdt/build/service + for name in core service; do + git -C ".usdt/sources/$name" archive HEAD | tar -xf - -C ".usdt/build/$name" + done + tar --exclude=node_modules --exclude=target -cf - usdt | tar -xf - -C .usdt/build + compose build usdt-fixture usdt-gateway +} +command=${1:-help} +if [ "$#" -gt 0 ]; then shift; fi +case "$command" in + build) build ;; + up) + if [ -z "${USDT_TEST_ENV_FILE:-}" ] || [ ! -f "$USDT_TEST_ENV_FILE" ]; then + echo 'Set USDT_TEST_ENV_FILE to a private file containing ARBITRUM_RPC_URL=https://...' >&2 + exit 1 + fi + compose up -d --wait --wait-timeout 180 "${SERVICES[@]}" + ;; + down) compose down --volumes ;; + logs) compose logs --tail 100 -f "${@:-usdt-fixture}" ;; + ps) compose ps "${SERVICES[@]}" ;; + env) + GATEWAY="http://127.0.0.1:${USDT_GATEWAY_PORT:-23453}/v1/usdt" + cat < + build Build pinned node, bundler, gateway and Core wallet images + up Start the isolated Compose stack; wait until healthy + ps | logs Inspect service health or follow logs (optional service) + down Remove this project's containers and disposable test-wallet volume + env Print app/helper endpoint exports + check Run fixture lint and protocol tests inside Docker (stack must be up) + smoke Check real Core payments, fees, pending recovery and proofs + bridge-smoke Check local bridge funding, receipts and refunds + wallet ARGS Run the Core test wallet; read proof/binding files from /evidence + status Show fixture health, versions and upstream read counts + fund ADDRESS USDT | balance ADDRESS | mine [COUNT] + provider-mode healthy|unavailable|expired|invalid-signature + bundling auto|manual | bundle + orchestra list|deposit|advance|mode|fee|quote-ttl + layerzero TX STATUS | layerzero-mode MODE + reset Revert this chain and clear provider/bundler state; reset test apps separately + +Requires Docker Compose, Git, jq and tar. For up, set USDT_TEST_ENV_FILE to a private env file. +USDT_PROJECT selects a dedicated project (default usdt-fixture); keep it constant. +USDT_GATEWAY_PORT/USDT_CONTROL_PORT select host ports (23453/23454 by default). +HELP + ;; + *) echo "Unknown command: $command" >&2; exit 1 ;; +esac diff --git a/usdt/Dockerfile b/usdt/Dockerfile new file mode 100644 index 0000000..b028aa9 --- /dev/null +++ b/usdt/Dockerfile @@ -0,0 +1,50 @@ +ARG NODE_IMAGE=node:22.23.1-bookworm-slim@sha256:6c74791e557ce11fc957704f6d4fe134a7bc8d6f5ca4403205b2966bd488f6b3 +ARG RUST_IMAGE=rust:1.98.1-bookworm@sha256:93ce27a88655056a51dbdd8f5f2d7ddc071c7b0070fb288a37b5a285fc83971e + +FROM ${NODE_IMAGE} AS sources +RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates \ + && rm -rf /var/lib/apt/lists/* +WORKDIR /src +COPY usdt/fetch-anvil.cjs usdt/pins.json ./ +RUN node fetch-anvil.cjs + +FROM ${RUST_IMAGE} AS wallet +RUN apt-get update && apt-get install -y --no-install-recommends \ + libudev-dev libdbus-1-dev pkg-config clang cmake protobuf-compiler \ + && rm -rf /var/lib/apt/lists/* +RUN rustup component add rustfmt clippy +COPY core /build/core +WORKDIR /build/usdt/wallet +COPY usdt/wallet/Cargo.toml usdt/wallet/Cargo.lock ./ +COPY usdt/wallet/src ./src +ENV CARGO_BUILD_JOBS=2 +RUN cargo fmt --check && cargo build --locked \ + && cargo clippy --locked --all-targets --no-deps -- -D warnings \ + && install -Dm755 target/debug/usdt-fixture-wallet /out/usdt-fixture-wallet + +FROM sources AS gateway-build +WORKDIR /src/service +COPY service ./ +RUN npm ci --ignore-scripts --no-audit --no-fund && npm run build \ + && npm prune --omit=dev --ignore-scripts --no-audit --no-fund + +FROM ${NODE_IMAGE} AS gateway +WORKDIR /app +COPY --from=gateway-build --chown=node:node /src/service/package.json ./ +COPY --from=gateway-build --chown=node:node /src/service/node_modules ./node_modules +COPY --from=gateway-build --chown=node:node /src/service/dist ./dist +USER node +CMD ["node", "dist/index.js"] + +FROM ${NODE_IMAGE} AS fixture +RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates libudev1 libdbus-1-3 \ + && rm -rf /var/lib/apt/lists/* +WORKDIR /app +COPY usdt/package.json usdt/package-lock.json ./ +RUN npm ci --ignore-scripts --no-audit --no-fund +COPY --from=sources /usr/local/bin/anvil /usr/local/bin/anvil +COPY --from=wallet /out/usdt-fixture-wallet /usr/local/bin/usdt-fixture-wallet +COPY usdt/*.cjs usdt/biome.json usdt/pins.json ./ +RUN npm run lint && npm test && mkdir /state && chown node:node /state +USER node +CMD ["node", "server.cjs"] diff --git a/usdt/bridge-smoke.cjs b/usdt/bridge-smoke.cjs index f635d1b..dac4eba 100644 --- a/usdt/bridge-smoke.cjs +++ b/usdt/bridge-smoke.cjs @@ -6,21 +6,16 @@ const { mkdtempSync, rmSync } = require('node:fs'); const path = require('node:path'); const { setTimeout: delay } = require('node:timers/promises'); const { rpc } = require('./rpc.cjs'); -const { urls } = require('./run.cjs'); -const { state } = require('./setup.cjs'); +const { state, urls } = require('./config.cjs'); const exec = promisify(execFile); async function smoke() { const directory = mkdtempSync(path.join(state, 'bridge-smoke-')); const name = randomUUID(); const wallet = async (account, ...args) => { - const { stdout } = await exec( - path.join(__dirname, 'wallet/target/debug/usdt-fixture-wallet'), - args, - { - env: { ...process.env, USDT_WALLET_DIR: directory, USDT_WALLET_NAME: `${name}-${account}` }, - timeout: 180000, - }, - ); + const { stdout } = await exec('usdt-fixture-wallet', args, { + env: { ...process.env, USDT_WALLET_DIR: directory, USDT_WALLET_NAME: `${name}-${account}` }, + timeout: 180000, + }); return JSON.parse(stdout); }; const control = (...args) => rpc(urls.control, 'orchestra', args); diff --git a/usdt/cli.cjs b/usdt/cli.cjs index 81f46b9..3c45da8 100644 --- a/usdt/cli.cjs +++ b/usdt/cli.cjs @@ -1,16 +1,13 @@ const { execFileSync } = require('node:child_process'); const path = require('node:path'); const { rpc } = require('./rpc.cjs'); -const { setup, state } = require('./setup.cjs'); -const { run, urls } = require('./run.cjs'); +const { state, urls } = require('./config.cjs'); async function main() { const [command = 'help', ...args] = process.argv.slice(2); - if (command === 'setup') return setup(); - if (command === 'run') return run(); if (command === 'smoke') return require('./smoke.cjs').smoke(); if (command === 'bridge-smoke') return require('./bridge-smoke.cjs').smoke(); if (command === 'wallet') { - execFileSync(path.join(__dirname, 'wallet/target/debug/usdt-fixture-wallet'), args, { + execFileSync('usdt-fixture-wallet', args, { stdio: 'inherit', env: { ...process.env, @@ -19,12 +16,7 @@ async function main() { }); return; } - if (command === 'env') { - console.log( - `export USDT_RPC_URL=${urls.gateway}/v1/usdt/chain-rpc\nexport USDT_BUNDLER_URL=${urls.gateway}/v1/usdt/rpc\nexport USDT_DEPOSITS_URL=${urls.gateway}/v1/usdt/deposits\nexport USDT_BRIDGES_URL=${urls.gateway}/v1/usdt/bridges\nexport USDT_BRIDGE_NETWORKS=ethereum,polygon,plasma,stable\nexport USDT_FIXTURE_URL=${urls.control}`, - ); - return; - } + if ( [ 'status', @@ -44,25 +36,7 @@ async function main() { return; } if (command !== 'help') throw new Error(`Unknown command ${command}`); - console.log(`Usage: ./usdt-fixture - setup Install pinned Anvil and build the gateway - run Run local services until Ctrl-C - smoke Real Core first/subsequent sends, fees, pending/restart and proofs - bridge-smoke Real local funding/receipts through bridge provider fixtures - wallet ARGS Core test wallet (address, send, refresh, history, proof, verify) - env Print app endpoint exports - status Health, versions and upstream read counts - fund ADDRESS AMOUNT_USDT Send real local tokens to a wallet - balance ADDRESS Read atomic USDT balance - mine [COUNT] Mine blocks for history/finality checks - provider-mode MODE healthy | unavailable | expired | invalid-signature - bundling MODE auto | manual (hold pending operations) - bundle Include pending operations - reset Reset this fixture's chain/mempool; reset test apps/peers too - orchestra ARGS list | deposit OWNER NETWORK USDT | advance ID STATUS | mode | fee | quote-ttl - layerzero TX_HASH STATUS Set delivery state for a real OFTSent receipt - layerzero-mode MODE healthy | unavailable | rate-limited | invalid-response -`); + console.log('Use ./usdt-fixture help for commands.'); } main().catch((error) => { console.error(error.message); diff --git a/usdt/config.cjs b/usdt/config.cjs new file mode 100644 index 0000000..437b429 --- /dev/null +++ b/usdt/config.cjs @@ -0,0 +1,15 @@ +const ports = { + node: 23450, + alto: 23451, + provider: 23452, + gateway: 23453, + control: 23454, + upstream: 23455, + orchestra: 23456, + layerzero: 23457, + reader: 23458, +}; +const urls = Object.fromEntries( + Object.entries(ports).map(([name, port]) => [name, `http://127.0.0.1:${port}`]), +); +module.exports = { ports, urls, state: '/state' }; diff --git a/usdt/fetch-anvil.cjs b/usdt/fetch-anvil.cjs new file mode 100644 index 0000000..dee70f1 --- /dev/null +++ b/usdt/fetch-anvil.cjs @@ -0,0 +1,24 @@ +const { createHash } = require('node:crypto'); +const { execFileSync } = require('node:child_process'); +const { writeFileSync } = require('node:fs'); +const pins = require('./pins.json'); + +async function main() { + const platform = `linux_${process.arch === 'x64' ? 'amd64' : process.arch}`; + const digest = pins.anvilHashes[platform]; + if (!digest) throw new Error(`Unsupported container architecture ${platform}`); + const response = await fetch( + `https://github.com/foundry-rs/foundry/releases/download/v${pins.anvil}/foundry_v${pins.anvil}_${platform}.tar.gz`, + { signal: AbortSignal.timeout(120_000) }, + ); + if (!response.ok) throw new Error(`Foundry download: HTTP ${response.status}`); + const archive = Buffer.from(await response.arrayBuffer()); + if (createHash('sha256').update(archive).digest('hex') !== digest) + throw new Error('Foundry checksum mismatch'); + writeFileSync('/tmp/foundry.tar.gz', archive); + execFileSync('tar', ['-xzf', '/tmp/foundry.tar.gz', '-C', '/usr/local/bin', 'anvil']); +} +main().catch((error) => { + console.error(error.message); + process.exitCode = 1; +}); diff --git a/usdt/pins.json b/usdt/pins.json index 37d3e7a..a5c78f3 100644 --- a/usdt/pins.json +++ b/usdt/pins.json @@ -2,8 +2,6 @@ "forkBlock": 513660679, "anvil": "1.8.5", "anvilHashes": { - "darwin_arm64": "56049728e25e44a61c7f2e49438023b0890cb45850ffcb7c882f90cd998baf83", - "darwin_amd64": "b919f69bb4231ad68beaaba9dc8f7d36d9d552cef1a76a8bf69c2bdfd974339a", "linux_arm64": "5bdce3dade8b6f0a65d4fccf6908426aee4905a988b08dce79d0a72fe7498310", "linux_amd64": "6c66ffcc55fa4249197721baa3098bc208014ea1d8aa04b2ed50ac6bccffb226" }, diff --git a/usdt/rpc.cjs b/usdt/rpc.cjs index 160943c..3124a97 100644 --- a/usdt/rpc.cjs +++ b/usdt/rpc.cjs @@ -39,11 +39,11 @@ async function rpc(url, method, params = []) { return body.result; } -async function serve(port, dispatch) { +async function serve(port, dispatch, host = '127.0.0.1') { const server = createServer(async (req, res) => { let call; try { - // Test controls are loopback-only and cannot be called from a web page. + // Control ports are published only on host loopback; reject browser-origin requests. if (req.method !== 'POST' || req.headers.origin) throw new Error('Use a local RPC client'); let body = ''; for await (const chunk of req) { @@ -71,7 +71,7 @@ async function serve(port, dispatch) { }); await new Promise((resolve, reject) => { server.once('error', reject); - server.listen(port, '127.0.0.1', resolve); + server.listen(port, host, resolve); }); return server; } diff --git a/usdt/run.cjs b/usdt/run.cjs deleted file mode 100644 index 1414de1..0000000 --- a/usdt/run.cjs +++ /dev/null @@ -1,285 +0,0 @@ -const assert = require('node:assert/strict'); -const { spawn, execFileSync } = require('node:child_process'); -const { readFileSync, mkdirSync, createWriteStream } = require('node:fs'); -const { parseEnv } = require('node:util'); -const { createServer } = require('node:net'); -const { setTimeout: delay } = require('node:timers/promises'); -const path = require('node:path'); -const { toHex } = require('viem'); -const { rpc, serve, upstreamReader } = require('./rpc.cjs'); -const { - TOKEN, - ENTRY, - PAYMASTER, - executor, - RATE, - BALANCE_SLOT, - initialize, - paymasterData, - atomicAmount, - transfer, - balance, -} = require('./contracts.cjs'); -const { state } = require('./setup.cjs'); -const pins = require('./pins.json'); -const { serveProvider } = require('./bridge-http.cjs'); -const { OrchestraFixture } = require('./orchestra.cjs'); -const { LayerZeroFixture } = require('./layerzero.cjs'); -const { sourceNetworks, bridgeNetworks } = require('./bridge-assets.cjs'); -const ports = { - node: 23450, - alto: 23451, - provider: 23452, - gateway: 23453, - control: 23454, - upstream: 23455, - orchestra: 23456, - layerzero: 23457, -}; -const urls = Object.fromEntries( - Object.entries(ports).map(([name, port]) => [name, `http://127.0.0.1:${port}`]), -); - -async function waitReady(check, children) { - for (let i = 0; i < 240; i++) { - if (children.some((child) => child.exitCode !== null || child.signalCode !== null)) { - throw new Error('Fixture process stopped; inspect .usdt/logs'); - } - try { - return await check(); - } catch { - await delay(250); - } - } - throw new Error('Fixture startup timed out; inspect .usdt/logs'); -} -async function run() { - const env = process.env.USDT_TEST_ENV_FILE - ? parseEnv(readFileSync(process.env.USDT_TEST_ENV_FILE, 'utf8')) - : process.env; - const upstream = env.ARBITRUM_RPC_URL; - if (!upstream || new URL(upstream).protocol !== 'https:') - throw new Error( - 'Set an HTTPS ARBITRUM_RPC_URL in the environment or private USDT_TEST_ENV_FILE', - ); - const anvil = path.join(state, 'bin', 'anvil'); - assert.match(execFileSync(anvil, ['--version'], { encoding: 'utf8' }), /1\.8\.5/); - // Refuse occupied ports before starting or mutating any node. - for (const port of Object.values(ports)) { - const server = createServer(); - await new Promise((resolve, reject) => { - server.once('error', reject); - server.listen(port, '127.0.0.1', resolve); - }); - await new Promise((resolve) => server.close(resolve)); - } - mkdirSync(path.join(state, 'logs'), { recursive: true, mode: 0o700 }); - const children = []; - const servers = []; - let failed; - let finish; - const lifetime = new Promise((resolve) => { - finish = resolve; - }); - function child(name, command, args, extraEnv = {}) { - const log = createWriteStream(path.join(state, 'logs', `${name}.log`), { mode: 0o600 }); - const proc = spawn(command, args, { - cwd: state, - env: { ...process.env, ...extraEnv }, - stdio: ['ignore', 'pipe', 'pipe'], - }); - children.push(proc); - proc.stdout.pipe(log); - proc.stderr.pipe(log); - proc.once('error', () => { - failed = new Error(`${name} could not start`); - finish(); - }); - proc.once('exit', (code) => { - if (code) failed = new Error(`${name} exited with ${code}; inspect .usdt/logs`); - finish(); - }); - return proc; - } - const stop = () => finish(); - process.once('SIGINT', stop); - process.once('SIGTERM', stop); - try { - const reads = {}; - const read = upstreamReader(upstream); - servers.push( - await serve(ports.upstream, async (method, params) => { - reads[method] = (reads[method] ?? 0) + 1; - return read(method, params); - }), - ); - child('anvil', anvil, [ - '--host', - '127.0.0.1', - '--port', - String(ports.node), - '--fork-url', - urls.upstream, - '--fork-block-number', - String(pins.forkBlock), - '--chain-id', - '42161', - '--hardfork', - 'prague', - '--silent', - '--block-time', - '1', - ]); - await waitReady(() => rpc(urls.node, 'eth_chainId'), children); - await rpc(urls.node, 'evm_setNextBlockTimestamp', [Math.floor(Date.now() / 1000)]); - await initialize(urls.node); - const key = toHex(executor.getHdKey().privateKey); - const alto = path.join(__dirname, 'node_modules/@pimlico/alto/esm/cli/alto.js'); - child('alto', process.execPath, [ - alto, - '--entrypoints', - ENTRY, - '--rpc-url', - urls.node, - '--executor-private-keys', - key, - '--utility-private-key', - key, - '--port', - String(ports.alto), - '--chain-type', - 'default', - '--safe-mode', - 'false', - '--enable-debug-endpoints', - 'true', - '--min-executor-balance', - '0', - '--log-level', - 'warn', - '--json', - 'true', - ]); - await waitReady(() => rpc(urls.alto, 'eth_supportedEntryPoints'), children); - let mode = 'healthy'; - servers.push( - await serve(ports.provider, async (method, params) => { - if (mode === 'unavailable') - throw Object.assign(new Error('Fixture provider unavailable'), { httpStatus: 503 }); - if (method === 'pimlico_getTokenQuotes') - return { - quotes: [ - { - token: TOKEN, - paymaster: PAYMASTER, - postOpGas: toHex(50000), - exchangeRate: toHex(RATE), - balanceSlot: toHex(BALANCE_SLOT), - }, - ], - }; - if (method === 'pm_getPaymasterStubData' || method === 'pm_getPaymasterData') { - return paymasterData(urls.node, params, mode); - } - return rpc(urls.alto, method, params); - }), - ); - const orchestra = new OrchestraFixture(urls.node); - const layerzero = new LayerZeroFixture(urls.node); - servers.push(await serveProvider(ports.orchestra, orchestra, 'local-orchestra-fixture')); - servers.push(await serveProvider(ports.layerzero, layerzero)); - const service = path.join(state, 'service'); - child('gateway', process.execPath, [path.join(service, 'dist/index.js')], { - NODE_ENV: 'test', - HOST: '127.0.0.1', - PORT: String(ports.gateway), - ARBITRUM_RPC_URL: urls.node, - LOCAL_PROVIDER_URL: urls.provider, - PIMLICO_API_KEY: '', - LOCAL_ORCHESTRA_URL: urls.orchestra, - LOCAL_LAYERZERO_URL: urls.layerzero, - ORCHESTRA_API_KEY: 'local-orchestra-fixture', - ORCHESTRA_BRIDGE_SECRET: 'ab'.repeat(32), - ORCHESTRA_BRIDGE_NETWORKS: bridgeNetworks.join(','), - ORCHESTRA_DEPOSIT_NETWORKS: sourceNetworks.join(','), - USDT_BRIDGE_NETWORKS: 'ethereum,polygon,plasma,stable', - REQUESTS_PER_MINUTE: '10000', - GLOBAL_REQUESTS_PER_MINUTE: '100000', - }); - await waitReady(async () => { - const response = await fetch(`${urls.gateway}/healthz`); - if (!response.ok) throw new Error('Gateway is not ready'); - }, children); - let snapshot = await rpc(urls.node, 'evm_snapshot'); - servers.push( - await serve(ports.control, async (method, params) => { - switch (method) { - case 'status': - return { - chainId: 42161, - forkBlock: pins.forkBlock, - mode, - urls, - reads, - block: await rpc(urls.node, 'eth_blockNumber'), - versions: pins, - }; - case 'balance': - return (await balance(urls.node, params[0])).toString(); - case 'fund': - return transfer(urls.node, params[0], atomicAmount(params[1])); - case 'orchestra': - return orchestra.control(params); - case 'layerzero': - return layerzero.set(...params); - case 'layerzero-mode': - return layerzero.setMode(params[0]); - case 'mine': { - const count = Number(params[0] ?? 3); - if (!Number.isInteger(count) || count < 1 || count > 1000) - throw new Error('Mine 1-1000 blocks'); - return rpc(urls.node, 'anvil_mine', [count]); - } - case 'provider-mode': - if (!['healthy', 'unavailable', 'expired', 'invalid-signature'].includes(params[0])) - throw new Error('Unknown provider mode'); - mode = params[0]; - return mode; - case 'bundling': - if (!['auto', 'manual'].includes(params[0])) throw new Error('Use auto or manual'); - return rpc(urls.alto, 'debug_bundler_setBundlingMode', [params[0]]); - case 'bundle': - return rpc(urls.alto, 'debug_bundler_sendBundleNow'); - case 'reset': - await rpc(urls.alto, 'debug_bundler_setBundlingMode', ['manual']); - await rpc(urls.alto, 'debug_bundler_clearState'); - assert.equal(await rpc(urls.node, 'evm_revert', [snapshot]), true); - await rpc(urls.node, 'evm_setNextBlockTimestamp', [Math.floor(Date.now() / 1000)]); - await rpc(urls.node, 'anvil_mine', [1]); - snapshot = await rpc(urls.node, 'evm_snapshot'); - orchestra.reset(); - layerzero.reset(); - mode = 'healthy'; - await rpc(urls.alto, 'debug_bundler_setBundlingMode', ['auto']); - return true; - default: - throw new Error('Unknown fixture command'); - } - }), - ); - console.log(JSON.stringify({ ready: true, ...urls, forkBlock: pins.forkBlock })); - await lifetime; - if (failed) throw failed; - } finally { - process.removeListener('SIGINT', stop); - process.removeListener('SIGTERM', stop); - for (const server of servers) server.close(); - for (const proc of children.reverse()) { - if (proc.exitCode !== null || proc.signalCode !== null) continue; - proc.kill('SIGTERM'); - await Promise.race([new Promise((resolve) => proc.once('exit', resolve)), delay(3000)]); - if (proc.exitCode === null && proc.signalCode === null) proc.kill('SIGKILL'); - } - } -} -module.exports = { run, ports, urls }; diff --git a/usdt/server.cjs b/usdt/server.cjs new file mode 100644 index 0000000..7b68414 --- /dev/null +++ b/usdt/server.cjs @@ -0,0 +1,165 @@ +const { readFileSync } = require('node:fs'); +const { parseEnv } = require('node:util'); +const { setTimeout: delay } = require('node:timers/promises'); +const assert = require('node:assert/strict'); +const { toHex } = require('viem'); +const { rpc, serve, upstreamReader } = require('./rpc.cjs'); +const { + TOKEN, + PAYMASTER, + RATE, + BALANCE_SLOT, + initialize, + paymasterData, + atomicAmount, + transfer, + balance, +} = require('./contracts.cjs'); +const { ports, urls } = require('./config.cjs'); +const pins = require('./pins.json'); +const { serveProvider } = require('./bridge-http.cjs'); +const { OrchestraFixture } = require('./orchestra.cjs'); +const { LayerZeroFixture } = require('./layerzero.cjs'); + +async function run() { + const { ARBITRUM_RPC_URL: upstream } = parseEnv( + readFileSync('/run/secrets/usdt_upstream', 'utf8'), + ); + if (!upstream || new URL(upstream).protocol !== 'https:') + throw new Error('Provide an HTTPS ARBITRUM_RPC_URL in USDT_TEST_ENV_FILE'); + const servers = []; + let finish; + const lifetime = new Promise((resolve) => { + finish = resolve; + }); + const stop = () => finish(); + process.once('SIGINT', stop); + process.once('SIGTERM', stop); + try { + const reads = {}; + const read = upstreamReader(upstream); + servers.push( + await serve(ports.upstream, async (method, params) => { + reads[method] = (reads[method] ?? 0) + 1; + return read(method, params); + }), + ); + let ready = false; + for (let attempt = 0; attempt < 120; attempt++) { + try { + await rpc(urls.node, 'eth_chainId'); + ready = true; + break; + } catch { + await delay(500); + } + } + assert(ready, 'Anvil did not start'); + await rpc(urls.node, 'evm_setNextBlockTimestamp', [Math.floor(Date.now() / 1000)]); + await initialize(urls.node); + // Shop's verifier can read this fork over the private Compose network. + servers.push(await serve(ports.reader, upstreamReader(urls.node), '0.0.0.0')); + let mode = 'healthy'; + servers.push( + await serve(ports.provider, async (method, params) => { + if (mode === 'unavailable') + throw Object.assign(new Error('Fixture provider unavailable'), { httpStatus: 503 }); + if (method === 'pimlico_getTokenQuotes') + return { + quotes: [ + { + token: TOKEN, + paymaster: PAYMASTER, + postOpGas: toHex(50000), + exchangeRate: toHex(RATE), + balanceSlot: toHex(BALANCE_SLOT), + }, + ], + }; + if (method === 'pm_getPaymasterStubData' || method === 'pm_getPaymasterData') { + return paymasterData(urls.node, params, mode); + } + return rpc(urls.alto, method, params); + }), + ); + const orchestra = new OrchestraFixture(urls.node); + const layerzero = new LayerZeroFixture(urls.node); + servers.push(await serveProvider(ports.orchestra, orchestra, 'local-orchestra-fixture')); + servers.push(await serveProvider(ports.layerzero, layerzero)); + let snapshot = await rpc(urls.node, 'evm_snapshot'); + servers.push( + await serve( + ports.control, + async (method, params) => { + switch (method) { + case 'status': + return { + chainId: 42161, + forkBlock: pins.forkBlock, + mode, + urls: { + ...urls, + gateway: `http://127.0.0.1:${process.env.USDT_GATEWAY_PORT ?? ports.gateway}`, + control: `http://127.0.0.1:${process.env.USDT_CONTROL_PORT ?? ports.control}`, + }, + reads, + block: await rpc(urls.node, 'eth_blockNumber'), + versions: pins, + }; + case 'balance': + return (await balance(urls.node, params[0])).toString(); + case 'fund': + return transfer(urls.node, params[0], atomicAmount(params[1])); + case 'orchestra': + return orchestra.control(params); + case 'layerzero': + return layerzero.set(...params); + case 'layerzero-mode': + return layerzero.setMode(params[0]); + case 'mine': { + const count = Number(params[0] ?? 3); + if (!Number.isInteger(count) || count < 1 || count > 1000) + throw new Error('Mine 1-1000 blocks'); + return rpc(urls.node, 'anvil_mine', [count]); + } + case 'provider-mode': + if (!['healthy', 'unavailable', 'expired', 'invalid-signature'].includes(params[0])) + throw new Error('Unknown provider mode'); + mode = params[0]; + return mode; + case 'bundling': + if (!['auto', 'manual'].includes(params[0])) throw new Error('Use auto or manual'); + return rpc(urls.alto, 'debug_bundler_setBundlingMode', [params[0]]); + case 'bundle': + return rpc(urls.alto, 'debug_bundler_sendBundleNow'); + case 'reset': + await rpc(urls.alto, 'debug_bundler_setBundlingMode', ['manual']); + await rpc(urls.alto, 'debug_bundler_clearState'); + assert.equal(await rpc(urls.node, 'evm_revert', [snapshot]), true); + await rpc(urls.node, 'evm_setNextBlockTimestamp', [Math.floor(Date.now() / 1000)]); + await rpc(urls.node, 'anvil_mine', [1]); + snapshot = await rpc(urls.node, 'evm_snapshot'); + orchestra.reset(); + layerzero.reset(); + mode = 'healthy'; + await rpc(urls.alto, 'debug_bundler_setBundlingMode', ['auto']); + return true; + default: + throw new Error('Unknown fixture command'); + } + }, + '0.0.0.0', + ), + ); + console.log(JSON.stringify({ ready: true, forkBlock: pins.forkBlock })); + await lifetime; + } finally { + process.removeListener('SIGINT', stop); + process.removeListener('SIGTERM', stop); + for (const server of servers) server.close(); + } +} +run().catch((error) => { + console.error(error.message); + process.exitCode = 1; +}); diff --git a/usdt/setup.cjs b/usdt/setup.cjs deleted file mode 100644 index ab50468..0000000 --- a/usdt/setup.cjs +++ /dev/null @@ -1,54 +0,0 @@ -const { createHash } = require('node:crypto'); -const { execFileSync } = require('node:child_process'); -const { mkdirSync, existsSync, readFileSync, writeFileSync } = require('node:fs'); -const path = require('node:path'); -const pins = require('./pins.json'); -const root = path.resolve(__dirname, '..'); -const state = path.join(root, '.usdt'); - -function run(command, args, cwd = root) { - execFileSync(command, args, { cwd, stdio: 'inherit' }); -} -function checkout(name, repository, revision) { - const directory = path.join(state, name); - if (!existsSync(directory)) { - run('git', ['init', directory]); - run('git', ['remote', 'add', 'origin', repository], directory); - } - if (execFileSync('git', ['status', '--porcelain'], { cwd: directory, encoding: 'utf8' }).trim()) { - throw new Error(`Fixture ${name} checkout has edits; preserve or move it before setup`); - } - run('git', ['fetch', '--depth', '1', 'origin', revision], directory); - run('git', ['checkout', '--detach', revision], directory); - return directory; -} -async function setup() { - mkdirSync(path.join(state, 'bin'), { recursive: true, mode: 0o700 }); - const platform = `${process.platform}_${process.arch === 'x64' ? 'amd64' : process.arch}`; - const digest = pins.anvilHashes[platform]; - if (!digest) throw new Error(`Unsupported platform ${platform}`); - const archive = path.join(state, `foundry-${pins.anvil}-${platform}.tar.gz`); - if (!existsSync(archive)) { - const url = `https://github.com/foundry-rs/foundry/releases/download/v${pins.anvil}/foundry_v${pins.anvil}_${platform}.tar.gz`; - const response = await fetch(url, { signal: AbortSignal.timeout(120_000) }); - if (!response.ok) throw new Error(`Foundry download: HTTP ${response.status}`); - writeFileSync(archive, Buffer.from(await response.arrayBuffer())); - } - if (createHash('sha256').update(readFileSync(archive)).digest('hex') !== digest) { - throw new Error('Foundry archive checksum mismatch; remove the archive and retry setup'); - } - run('tar', ['-xzf', archive, '-C', path.join(state, 'bin'), 'anvil']); - const service = checkout( - 'service', - 'https://github.com/synonymdev/bitkit-usdt-service.git', - pins.service, - ); - run('npm', ['ci', '--ignore-scripts', '--no-audit', '--no-fund'], service); - run('npm', ['run', 'build'], service); - checkout('core', 'https://github.com/synonymdev/bitkit-core.git', pins.core); - run('cargo', ['build', '--locked', '--manifest-path', 'usdt/wallet/Cargo.toml']); - console.log( - 'USDT tools ready. Set ARBITRUM_RPC_URL (or USDT_TEST_ENV_FILE), then run ./usdt-fixture run.', - ); -} -module.exports = { setup, root, state }; diff --git a/usdt/shop-compose.yml b/usdt/shop-compose.yml index bdb0e40..3f74bb3 100644 --- a/usdt/shop-compose.yml +++ b/usdt/shop-compose.yml @@ -1,5 +1,6 @@ services: shop-mixed-paykit: + networks: [default, usdt] environment: PAYKIT_CONFIG: /tmp/usdt-paykit.toml entrypoint: @@ -19,8 +20,11 @@ services: network_mode: service:shop-mixed-paykit depends_on: - shop-mixed-paykit - extra_hosts: - - "host.docker.internal:host-gateway" volumes: - ./usdt:/fixture:ro command: [node, /fixture/shop-rpc.cjs] + +networks: + usdt: + external: true + name: ${USDT_PROJECT:-usdt-fixture}_default diff --git a/usdt/shop-rpc.cjs b/usdt/shop-rpc.cjs index cf31835..f3ae634 100644 --- a/usdt/shop-rpc.cjs +++ b/usdt/shop-rpc.cjs @@ -1,6 +1,6 @@ const { serve, upstreamReader } = require('./rpc.cjs'); // Shares Paykit Server's network namespace so its existing localhost-only HTTP policy applies. -serve(23450, upstreamReader('http://host.docker.internal:23450')).catch((error) => { +serve(23450, upstreamReader('http://usdt-fixture:23458')).catch((error) => { console.error(error.message); process.exitCode = 1; }); diff --git a/usdt/smoke.cjs b/usdt/smoke.cjs index f480cf7..d4ae1fb 100644 --- a/usdt/smoke.cjs +++ b/usdt/smoke.cjs @@ -6,22 +6,16 @@ const { mkdtempSync, writeFileSync, rmSync } = require('node:fs'); const path = require('node:path'); const { setTimeout: delay } = require('node:timers/promises'); const { rpc } = require('./rpc.cjs'); -const { state, root } = require('./setup.cjs'); -const { urls } = require('./run.cjs'); +const { state, urls } = require('./config.cjs'); const exec = promisify(execFile); async function smoke() { const directory = mkdtempSync(path.join(state, 'smoke-')); const runId = randomUUID(); const wallet = async (name, ...args) => { - const { stdout } = await exec( - path.join(__dirname, 'wallet/target/debug/usdt-fixture-wallet'), - args, - { - cwd: root, - env: { ...process.env, USDT_WALLET_DIR: directory, USDT_WALLET_NAME: `${runId}-${name}` }, - timeout: 120000, - }, - ); + const { stdout } = await exec('usdt-fixture-wallet', args, { + env: { ...process.env, USDT_WALLET_DIR: directory, USDT_WALLET_NAME: `${runId}-${name}` }, + timeout: 120000, + }); return JSON.parse(stdout); }; const settled = async (id) => { diff --git a/usdt/wait.cjs b/usdt/wait.cjs new file mode 100644 index 0000000..d7cb17e --- /dev/null +++ b/usdt/wait.cjs @@ -0,0 +1,21 @@ +const { setTimeout: delay } = require('node:timers/promises'); +const { rpc } = require('./rpc.cjs'); +const { urls } = require('./config.cjs'); + +async function main() { + const url = urls[process.argv[2]]; + if (!url) throw new Error('Unknown fixture service'); + for (let attempt = 0; attempt < 120; attempt++) { + try { + await rpc(url, 'eth_chainId'); + return; + } catch { + await delay(500); + } + } + throw new Error('Fixture RPC did not become ready'); +} +main().catch((error) => { + console.error(error.message); + process.exitCode = 1; +}); diff --git a/usdt/wallet/Cargo.toml b/usdt/wallet/Cargo.toml index 0ba6c9f..9ab6976 100644 --- a/usdt/wallet/Cargo.toml +++ b/usdt/wallet/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" publish = false [dependencies] -bitkitcore = { path = "../../.usdt/core" } +bitkitcore = { path = "../../core" } tokio = { version = "1", features = ["macros", "rt-multi-thread", "time"] } async-trait = "0.1" serde = { version = "1", features = ["derive"] } diff --git a/usdt/wallet/src/main.rs b/usdt/wallet/src/main.rs index d4c5888..b8e9b00 100644 --- a/usdt/wallet/src/main.rs +++ b/usdt/wallet/src/main.rs @@ -45,7 +45,7 @@ async fn main() -> Result<()> { )); let address = usdt_address(MNEMONIC.into(), passphrase.clone())?; let state = - PathBuf::from(std::env::var("USDT_WALLET_DIR").unwrap_or_else(|_| ".usdt/wallet".into())); + PathBuf::from(std::env::var("USDT_WALLET_DIR").unwrap_or_else(|_| "/state/wallet".into())); std::fs::create_dir_all(&state)?; let wallet = UsdtWallet::new( address.clone(), From 6b97c7ad0d3f6b08b2d71bcdd6172a407f5a68f7 Mon Sep 17 00:00:00 2001 From: benk10 Date: Sat, 10 Oct 2026 22:41:43 -0500 Subject: [PATCH 4/7] Use merged USDT service in local fixtures --- CHANGELOG.md | 1 + usdt/pins.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb086bc..d9e02cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Issue payment requests payable through an LNURL-pay endpoint, with a separate proposal expiry ### Changed +- Pin the local USDT gateway to `3d8c0b6`, including sanitized configuration errors and local LayerZero tracking support - Publish every host port at 1024 or above, in the 23000-23999 range for the services Bitkit does not dial by a fixed number (README "Ports" lists them) - Move the payment request fixture peers to paykit-rs rc65 on Pubky 0.14.0, the SDK current Bitkit builds pin (the `fixture-issuer` and `rc56-peer` service names stay) - Move the marketplace fixture to the Pubky 0.14.0 homeserver, which grants the `LOCK` write locks current Bitkit builds take, with Paykit Server `0ffd4da` (pubky/paykit-server#46, paykit-rs rc65, locks-core rc8) and the driver on `@synonymdev/pubky` 0.14.0 diff --git a/usdt/pins.json b/usdt/pins.json index a5c78f3..bb1f614 100644 --- a/usdt/pins.json +++ b/usdt/pins.json @@ -5,6 +5,6 @@ "linux_arm64": "5bdce3dade8b6f0a65d4fccf6908426aee4905a988b08dce79d0a72fe7498310", "linux_amd64": "6c66ffcc55fa4249197721baa3098bc208014ea1d8aa04b2ed50ac6bccffb226" }, - "service": "766bb4977fa6a103dc39f34910323fea1b07d82a", + "service": "3d8c0b625b02f0731ff0a19910752961ada3e6f2", "core": "bdce512c9d1025ba6cd71baa8c2df1a39dcb3d02" } From 13dab48759a7eb2e8eb7a9066069af840abbaa1b Mon Sep 17 00:00:00 2001 From: benk10 Date: Sun, 11 Oct 2026 00:15:13 -0500 Subject: [PATCH 5/7] Fix Shop setup and local USDT startup --- CHANGELOG.md | 3 +++ README.md | 8 ++++---- docker-compose.yml | 15 ++++++++------- docs/shop-order.md | 12 ++++-------- marketplace/shop-order/lock.py | 2 +- shop-order | 15 +++++++-------- 6 files changed, 27 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9e02cf..b1d165f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Simplify LND funding step in README to a single command instead of clipboard-based two-step flow ### Fixed +- Pair the Shop and Lock Server denomination-aware setup API, including the seller provisioning helper +- Bound the Shop build Node heap and serialize app builds to limit peak Docker memory use +- Preserve the payment server's network namespace when starting Shop apps so the USDT verifier keeps its RPC connection - Fund the payment request issuer's wallet before `/pay`, which failed with insufficient funds on a fresh regtest chain - Clear stale X display locks in `scripts/trezor-emulator` before starting the emulator, fixing `RuntimeError('Emulator process died')` caused by Xvfb refusing to start over a leftover `/tmp/.X-lock` - Validate LNURL-withdraw callback invoices by millisatoshis (`num_msat`) to preserve msat precision for min/max range checks diff --git a/README.md b/README.md index c010502..9af3f02 100644 --- a/README.md +++ b/README.md @@ -670,10 +670,8 @@ The headless seller and buyer of the `marketplace` profile need the local testne #### Shop Order on Our Own Servers The `shop-order` profile adds the rest of the Shop to `shop-mixed`, so a Bitkit buyer can pay a Pubky Ring seller's digital listing -and the same marketplace order becomes paid: the Lock Server v0.1.0-rc10, the marketplace service (pubky-marketplace-service#98, -`005b0707`) and the Shop (pubky-marketplace#154, `fbe3babb`), the commits the Android and iOS order-paid acceptance ran on, with -Postgres, a quick tunnel per public URL, and keys made once and kept. Synonym's staging Shop stays the first route; use this when it -cannot serve the build under test. Needs Docker, `curl`, `jq`, `git` and `python3`, and about 6 GB free for the Shop's build. +and the same marketplace order becomes paid. The pinned Shop, Lock Server and marketplace service share the upstream Paykit +contract, with Postgres, a quick tunnel per public URL, and staging Pubky services. Sources and images are pinned in `shop-order`. ```bash SHOP_ORDER_PROVISIONING=1 ./shop-order fetch # pinned sources, plus the seller's provisioning page @@ -682,6 +680,8 @@ SHOP_ORDER_PROVISIONING=1 ./shop-order fetch # pinned sources, plus the seller ./shop-order down --keep-data # stop; keeps databases, keys and the seller's setup ``` +For local USDT settlement, start `./usdt-fixture up` first and set `SHOP_ORDER_USDT=1` for every Shop command. Both the app and Paykit Server then verify payments on the same fork. Seller setup in Bitkit must include the optional USDT address. Fund the buyer with `./usdt-fixture fund ADDRESS 20`, then pay the Shop request in USDT. Keep staging Pubky and rate services. + See [docs/shop-order.md](docs/shop-order.md) for the seller and buyer steps, the pass criteria and every setting. #### Bech32 LNURL Pay diff --git a/docker-compose.yml b/docker-compose.yml index 3f308c7..633664d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -712,11 +712,10 @@ services: command: ["init-and-stay"] # --------------------------------------------------------------------------- - # A Shop order paid end to end on our own servers with Synonym's staging homeserver (profile "shop-order", on top of - # shop-mixed's Paykit Server rc11): the Lock Server v0.1.0-rc10, the marketplace service and the Shop at the commits that ran - # the Android and iOS order-paid acceptance (10 Oct), Postgres for the three, and a quick tunnel for each URL a phone or the - # seller's browser opens. ./shop-order fetches each source at its exact commit into .shop-order/src and refuses another - # revision; docs/shop-order.md has the flow. Secrets are made by shop-order-keys in the state volume, never committed. + # Local Shop checkout with Synonym's staging homeserver (profile "shop-order", on top of shop-mixed): Paykit, Locks, + # the marketplace service, Shop and Postgres, with tunnels for the phone and seller browser. ./shop-order fetches + # the paired source revisions into .shop-order/src; docs/shop-order.md has the flow. Secrets are made once by + # shop-order-keys in the state volume, never committed. # --------------------------------------------------------------------------- shop-order-keys: profiles: [shop-order] @@ -754,7 +753,7 @@ services: shop-order-locks: profiles: [shop-order] - image: bitkit-docker/locks-server:${SHOP_ORDER_LOCKS_REV:-01cfeca14c7b5d385d8c3536c0cb4e1af81b458c} + image: bitkit-docker/locks-server:${SHOP_ORDER_LOCKS_REV:-be3f1b4d83b7318585d724fa6a429e1e5b3b0399} build: context: ./.shop-order/src/locks restart: "no" @@ -815,9 +814,11 @@ services: shop-order-shop: profiles: [shop-order] - image: bitkit-docker/pubky-marketplace:${SHOP_ORDER_SHOP_REV:-fbe3babba0c3c05990571221b5d4dc0c31788e68} + image: bitkit-docker/pubky-marketplace:${SHOP_ORDER_SHOP_REV:-af2866f58c8706e275a3028e41168c5976305808} build: context: ./.shop-order/src/shop + args: + NODE_MAX_OLD_SPACE_SIZE: ${SHOP_ORDER_NODE_HEAP_MB:-3072} restart: "no" user: "0:0" # reads the BFF secrets in the state volume (mode 0600) depends_on: diff --git a/docs/shop-order.md b/docs/shop-order.md index 712b50c..e66f66d 100644 --- a/docs/shop-order.md +++ b/docs/shop-order.md @@ -12,16 +12,12 @@ test, for example a Paykit version the staging Paykit Server does not run. | Component | Revision | Built from | | --- | --- | --- | -| Shop | pubky/pubky-marketplace#154, fbe3babba0c3c05990571221b5d4dc0c31788e68 | the repository's Dockerfile | +| Shop | pubky/pubky-marketplace, af2866f58c8706e275a3028e41168c5976305808 | the repository's Dockerfile | | Marketplace service | pubky/pubky-marketplace-service#98, 005b0707e6047b388ce032f4b51a2e0ed9e3a752 | the repository's Dockerfile | -| Lock Server | pubky/locks v0.1.0-rc10, 01cfeca14c7b5d385d8c3536c0cb4e1af81b458c | the repository's Dockerfile | +| Lock Server | pubky/locks#75, be3f1b4d83b7318585d724fa6a429e1e5b3b0399 | the repository's Dockerfile | | Paykit Server | v0.1.0-rc11, 662dca0619a9aa2962bcd677bd5ddd4563cd2784 (paykit-rs ad3c7224 = rc72) | `marketplace/shop-mixed` | -The Shop was tested at fbe3babb; pubky/pubky-marketplace#154 later moved to 84934516 for review changes to the seller-readiness -source and the buyer key-record gate, with the Locks payment path unchanged. The pin stays at the tested commit until #154 merges. - -`./shop-order fetch` checks out each source at exactly that commit and refuses another. These are the commits the Android -(aa330959, devDebug) and iOS (bb02e835, Debug) order-paid acceptance ran on, on 10 Oct. +`./shop-order fetch` checks out each source at its pinned commit. The Shop and Lock Server both use the denomination-aware seller setup API. Keep these revisions paired when overriding them. ## Run @@ -32,7 +28,7 @@ SHOP_ORDER_PROVISIONING=1 ./shop-order fetch # the pinned sources, plus the se ./shop-order health # readiness, revisions, Paykit's trusted keys ``` -The first build compiles three Rust services and the Shop, and the Shop's build needs about 6 GB of memory. Each start gets new +The first build compiles three Rust services and the Shop. Startup builds the apps sequentially, and the Shop build uses a 3 GB Node heap per process. Next.js also starts workers, so allow additional Docker memory; an 8 GB VM can exhaust memory while the full stack is running. `SHOP_ORDER_NODE_HEAP_MB` overrides the per-process heap, but lowering it can make compilation fail. Each start gets new quick-tunnel URLs; `up` writes them to `.shop-order/run/urls.env` and every origin setting is filled from them. ## Seller diff --git a/marketplace/shop-order/lock.py b/marketplace/shop-order/lock.py index 65ad6a3..7a9b826 100755 --- a/marketplace/shop-order/lock.py +++ b/marketplace/shop-order/lock.py @@ -52,7 +52,7 @@ def main(): token, seller = session['session_token'], session['creator'].removeprefix('pubky') base = args.locks_url.rstrip('/') - status, ready = call(base, 'GET', '/creator/paykit/setup-status', token) + status, ready = call(base, 'GET', '/creator/paykit/setup-status?asset=BTC', token) if status != 200 or not isinstance(ready, dict) or ready.get('status') != 'ready': sys.exit(f'the seller is not ready on the Lock Server ({status}): connect Locks, reload, then do the Paykit setup') status, registered = call(base, 'PUT', f'/creator/priv-resources/content/{args.content.name}', token, diff --git a/shop-order b/shop-order index 45b55a5..9786765 100755 --- a/shop-order +++ b/shop-order @@ -6,17 +6,13 @@ set -euo pipefail CLI_NAME="$(basename "$0")" cd "$(dirname "$0")" -# The commits the Android and iOS order-paid acceptance ran on (10 Oct). Another revision is refused unless set here on purpose. -if [ "${SHOP_ORDER_USDT:-0}" = 1 ]; then - # USDT access decisions require the per-rail verifier. - export SHOP_ORDER_LOCKS_REV=${SHOP_ORDER_LOCKS_REV:-15b81eb0c25f693124d2d3ea956586f407170a63} -fi +# Pin the matching denomination-aware Locks and Shop contracts. LOCKS_REPO=https://github.com/pubky/locks.git -LOCKS_REV=${SHOP_ORDER_LOCKS_REV:-01cfeca14c7b5d385d8c3536c0cb4e1af81b458c} # v0.1.0-rc10 +LOCKS_REV=${SHOP_ORDER_LOCKS_REV:-be3f1b4d83b7318585d724fa6a429e1e5b3b0399} # pubky/locks#75 SERVICE_REPO=https://github.com/pubky/pubky-marketplace-service.git SERVICE_REV=${SHOP_ORDER_SERVICE_REV:-005b0707e6047b388ce032f4b51a2e0ed9e3a752} # pubky-marketplace-service#98 SHOP_REPO=https://github.com/pubky/pubky-marketplace.git -SHOP_REV=${SHOP_ORDER_SHOP_REV:-fbe3babba0c3c05990571221b5d4dc0c31788e68} # pubky-marketplace#154 +SHOP_REV=${SHOP_ORDER_SHOP_REV:-af2866f58c8706e275a3028e41168c5976305808} export SHOP_ORDER_LOCKS_REV=$LOCKS_REV SHOP_ORDER_SERVICE_REV=$SERVICE_REV SHOP_ORDER_SHOP_REV=$SHOP_REV # Its own compose project, never a QA lane's (a lane's cleanup removes that lane's project), whatever COMPOSE_PROJECT_NAME says. @@ -121,7 +117,10 @@ up() { progress "Postgres, the Lock Server, the marketplace service, the Shop BFF tables and the Shop" compose up -d --build shop-order-postgres compose run --rm --quiet-build shop-order-bff-migrate - compose up -d --build "${APPS[@]}" + # Build each app separately so Rust and Next.js do not compete with the running test chain for memory. + for app in shop-order-locks shop-order-service shop-order-shop; do compose build "$app"; done + # The base is already running; keep its network namespace for the USDT RPC sidecar. + compose up -d --no-build --no-deps "${APPS[@]}" wait_http "http://$(published shop-mixed-paykit 3001)/health/ready" "Paykit Server" wait_http "http://$(published shop-order-locks 3000)/readyz" "the Lock Server" wait_http "http://$(published shop-order-service 8080)/ready" "the marketplace service" From e233cbe286d67d6b965799ef60ec7da425354087 Mon Sep 17 00:00:00 2001 From: Piotr Stachyra Date: Sun, 11 Oct 2026 13:08:40 +0200 Subject: [PATCH 6/7] fix: isolate USDT fixture images by build inputs --- docker-compose.yml | 10 +++++----- docs/usdt-fixture.md | 2 +- usdt-fixture | 10 ++++++++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 633664d..0538631 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -869,7 +869,7 @@ services: # Shared loopback matches Core/gateway local endpoint validation. usdt-fixture: profiles: [usdt] - image: bitkit-docker/usdt-fixture:local + image: bitkit-docker/usdt-fixture:${USDT_IMAGE_TAG:-unbuilt} build: context: ./.usdt/build dockerfile: usdt/Dockerfile @@ -895,7 +895,7 @@ services: usdt-node: profiles: [usdt] - image: bitkit-docker/usdt-fixture:local + image: bitkit-docker/usdt-fixture:${USDT_IMAGE_TAG:-unbuilt} init: true restart: "no" network_mode: service:usdt-fixture @@ -908,7 +908,7 @@ services: usdt-alto: profiles: [usdt] - image: bitkit-docker/usdt-fixture:local + image: bitkit-docker/usdt-fixture:${USDT_IMAGE_TAG:-unbuilt} init: true restart: "no" network_mode: service:usdt-fixture @@ -928,7 +928,7 @@ services: usdt-gateway: profiles: [usdt] - image: bitkit-docker/usdt-gateway:local + image: bitkit-docker/usdt-gateway:${USDT_IMAGE_TAG:-unbuilt} build: context: ./.usdt/build dockerfile: usdt/Dockerfile @@ -962,7 +962,7 @@ services: usdt-tools: profiles: [usdt] - image: bitkit-docker/usdt-fixture:local + image: bitkit-docker/usdt-fixture:${USDT_IMAGE_TAG:-unbuilt} network_mode: service:usdt-fixture depends_on: usdt-gateway: diff --git a/docs/usdt-fixture.md b/docs/usdt-fixture.md index dc08d86..6e00f5c 100644 --- a/docs/usdt-fixture.md +++ b/docs/usdt-fixture.md @@ -4,7 +4,7 @@ ## Versions and state -Install Docker with Compose, Git, jq and tar. Your Git credentials must allow reads of the pinned Core and service repositories. `build` fetches their exact revisions from `usdt/pins.json` into ignored `.usdt/sources/` and exports clean source trees for the container build. Credentials and Git metadata stay outside images. Anvil's Linux release is checksum-verified; Alto and viem use `usdt/package-lock.json`; the Core wallet uses `usdt/wallet/Cargo.lock`. Node and Rust run inside pinned build images, with no host toolchain required. Linux AMD64 and ARM64 are supported. CI must use a Docker-capable runner. +Install Docker with Compose, Git, jq and tar. Your Git credentials must allow reads of the pinned Core and service repositories. `build` fetches their exact revisions from `usdt/pins.json` into ignored `.usdt/sources/` and exports clean source trees for the container build. Credentials and Git metadata stay outside images. Anvil's Linux release is checksum-verified; Alto and viem use `usdt/package-lock.json`; the Core wallet uses `usdt/wallet/Cargo.lock`. Node and Rust run inside pinned build images, with no host toolchain required. The launcher fingerprints the tracked fixture build inputs, including working-tree edits, and uses that fingerprint for every fixture/gateway image tag. Different revisions therefore cannot overwrite each other's images on the same Docker daemon. Use the launcher for build, startup and tools so they select the same images. Linux AMD64 and ARM64 are supported. CI must use a Docker-capable runner. `up` starts four services and waits for health: the fixture/control server, Anvil, Alto and the gateway. They share a network namespace so the existing Core and gateway localhost checks still apply. One-off checks and wallet commands run in the tools container. `logs` follows service output; `ps` shows health. Wallet databases live in the `usdt_state` named volume; the chain and provider state are held in memory. `down` removes only this Compose project's containers, network and disposable wallet volume. diff --git a/usdt-fixture b/usdt-fixture index 74f8cf4..ccd0cda 100755 --- a/usdt-fixture +++ b/usdt-fixture @@ -1,6 +1,16 @@ #!/usr/bin/env bash set -euo pipefail cd "$(dirname "$0")" +# Explicit image names are shared across Compose projects. Fingerprint the actual +# build inputs so another checkout cannot replace this fixture's images. +USDT_IMAGE_TAG=$( + git ls-files -- docker-compose.yml usdt-fixture usdt | + while IFS= read -r file; do + printf '%s\n' "$file" + git hash-object -- "$file" + done | git hash-object --stdin +) +export USDT_IMAGE_TAG PROJECT=${USDT_PROJECT:-usdt-fixture} COMPOSE=(docker compose --project-name "$PROJECT" --profile usdt) SERVICES=(usdt-fixture usdt-node usdt-alto usdt-gateway) From 9e32a22fda16574afa1afb6772f0cdaba0fa81a9 Mon Sep 17 00:00:00 2001 From: benk10 Date: Sun, 11 Oct 2026 09:25:57 -0500 Subject: [PATCH 7/7] Keep USDT fixture within free RPC limits --- CHANGELOG.md | 1 + README.md | 5 ++++- docker-compose.yml | 5 ++++- docs/usdt-fixture.md | 9 ++++++--- usdt-fixture | 2 +- usdt/Dockerfile | 2 +- usdt/rpc.cjs | 13 ++++++++++--- usdt/rpc.test.cjs | 19 +++++++++++++++++++ usdt/server.cjs | 2 ++ usdt/smoke.cjs | 35 ++++++++++++++++++++++++++++++++--- usdt/wallet/src/main.rs | 3 ++- 11 files changed, 82 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1d165f..45cbaef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Issue payment requests payable through an LNURL-pay endpoint, with a separate proposal expiry ### Changed +- Keep USDT test history on the local fork, pace and cache archive reads, and preserve upstream throttling for retries so ordinary E2E runs need no paid Alchemy features - Pin the local USDT gateway to `3d8c0b6`, including sanitized configuration errors and local LayerZero tracking support - Publish every host port at 1024 or above, in the 23000-23999 range for the services Bitkit does not dial by a fixed number (README "Ports" lists them) - Move the payment request fixture peers to paykit-rs rc65 on Pubky 0.14.0, the SDK current Bitkit builds pin (the `fixture-issuer` and `rc56-peer` service names stay) diff --git a/README.md b/README.md index 9af3f02..75603cd 100644 --- a/README.md +++ b/README.md @@ -18,10 +18,13 @@ eval "$(./usdt-fixture env)" ``` The private file contains `ARBITRUM_RPC_URL=https://...` with historical-state access. +An Alchemy Free Arbitrum endpoint is sufficient within its quota: the fixture paces +upstream reads and excludes pre-fork mainnet logs. Payment history and recovery +cover transfers made locally after the fork; use disposable test wallets. Requires Docker Compose, Git access to the pinned Core/service repositories, jq and tar. Builds and tools run inside containers; no host Node or Rust is needed. Use `./usdt-fixture logs` to inspect services and `./usdt-fixture down` to remove -this isolated stack and its disposable wallet volume. Keep existing staging VSS, +this isolated stack, its disposable wallets and fork-read cache. Keep existing staging VSS, Pubky and rate services. The stack also starts local Orchestra and LayerZero providers. After the app registers a bridge receive address, use `./usdt-fixture orchestra deposit ADDRESS polygon 3.5`, then `./usdt-fixture orchestra advance DEPOSIT_ID completed` diff --git a/docker-compose.yml b/docker-compose.yml index 0538631..ac222cf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -903,8 +903,10 @@ services: usdt-fixture: condition: service_started entrypoint: [/bin/sh, -c] + volumes: + - usdt_fork_cache:/home/node/.foundry command: - - node wait.cjs upstream && exec anvil --host 127.0.0.1 --port 23450 --fork-url http://127.0.0.1:23455 --fork-block-number "$$(node -p "require('./pins.json').forkBlock")" --chain-id 42161 --hardfork prague --silent --block-time 1 + - node wait.cjs upstream && exec anvil --host 127.0.0.1 --port 23450 --fork-url http://127.0.0.1:23455 --fork-block-number "$$(node -p "require('./pins.json').forkBlock")" --chain-id 42161 --hardfork prague --silent --block-time 1 --compute-units-per-second 150 --fork-retry-backoff 1000 --no-fork-node-info usdt-alto: profiles: [usdt] @@ -973,6 +975,7 @@ services: entrypoint: ["node", "cli.cjs"] volumes: + usdt_fork_cache: usdt_state: trezor_emulator_state: trezor_emulator_logs: diff --git a/docs/usdt-fixture.md b/docs/usdt-fixture.md index 6e00f5c..a80045e 100644 --- a/docs/usdt-fixture.md +++ b/docs/usdt-fixture.md @@ -6,11 +6,13 @@ Install Docker with Compose, Git, jq and tar. Your Git credentials must allow reads of the pinned Core and service repositories. `build` fetches their exact revisions from `usdt/pins.json` into ignored `.usdt/sources/` and exports clean source trees for the container build. Credentials and Git metadata stay outside images. Anvil's Linux release is checksum-verified; Alto and viem use `usdt/package-lock.json`; the Core wallet uses `usdt/wallet/Cargo.lock`. Node and Rust run inside pinned build images, with no host toolchain required. The launcher fingerprints the tracked fixture build inputs, including working-tree edits, and uses that fingerprint for every fixture/gateway image tag. Different revisions therefore cannot overwrite each other's images on the same Docker daemon. Use the launcher for build, startup and tools so they select the same images. Linux AMD64 and ARM64 are supported. CI must use a Docker-capable runner. -`up` starts four services and waits for health: the fixture/control server, Anvil, Alto and the gateway. They share a network namespace so the existing Core and gateway localhost checks still apply. One-off checks and wallet commands run in the tools container. `logs` follows service output; `ps` shows health. Wallet databases live in the `usdt_state` named volume; the chain and provider state are held in memory. `down` removes only this Compose project's containers, network and disposable wallet volume. +`up` starts four services and waits for health: the fixture/control server, Anvil, Alto and the gateway. They share a network namespace so the existing Core and gateway localhost checks still apply. One-off checks and wallet commands run in the tools container. `logs` follows service output; `ps` shows health. Wallet databases live in the `usdt_state` named volume; the chain and provider state are held in memory. Anvil caches fetched mainnet state in the `usdt_fork_cache` volume, reused across resets and container recreation. `down` removes only this Compose project's containers, network, cache and disposable wallet volume. Keep the stack running through app restart, reinstall and VSS recovery tests. Do not restart individual services or reset the chain mid-scenario. Repeated `up` leaves already-running services intact. Use `down` followed by `up` for a fresh stack, with matching dedicated app/peer state. `reset` reverts the live chain and clears provider/bundler state but does not reset wallet databases or VSS backups. Never use a funded mainnet app or real seed. -The upstream must serve historical state at the pinned block. Put only `ARBITRUM_RPC_URL=https://...` in an untracked private file and export its absolute path as `USDT_TEST_ENV_FILE`. Compose mounts that file read-only as a secret in the fixture container; it is not an environment value, build argument or image layer. The fixture server runs as container root to read a private file regardless of its Linux host owner; the node, bundler, gateway and wallet tools run as non-root. Only the read proxy uses the URL; Anvil receives a localhost URL. The proxy allowlists reads and blocks transaction submission, wallet methods and node mutations. Cold startup and new storage lookups can incur provider RPC charges. No public-chain tokens are spent. +The upstream must serve historical state at the pinned block. Put only `ARBITRUM_RPC_URL=https://...` in an untracked private file and export its absolute path as `USDT_TEST_ENV_FILE`. Compose mounts that file read-only as a secret in the fixture container; it is not an environment value, build argument or image layer. The fixture server runs as container root to read a private file regardless of its Linux host owner; the node, bundler, gateway and wallet tools run as non-root. Only the read proxy uses the URL; Anvil receives a localhost URL. The proxy allowlists reads and blocks transaction submission, wallet methods and node mutations. An Alchemy Free Arbitrum endpoint supports the required archive-state reads; no paid Debug/Trace API or broad historical-log access is required. Anvil paces upstream requests at 150 compute units/second, leaving headroom under the free plan's 300 CU/s limit, and retries throttled reads. The monthly provider quota still applies. Cold startup and new storage lookups consume provider RPC quota; paid endpoints can incur charges. `status` shows forwarded upstream read counts. No public-chain tokens are spent. + +The fork read proxy returns no pre-fork mainnet logs. Anvil serves locally mined logs normally, including wide queries spanning the fork boundary. This keeps disposable E2E wallet history within the test timeline and avoids Alchemy Free's 10-block `eth_getLogs` limit. It is not a test of historical mainnet wallet recovery. Seed recovery tests recover payments made on the running local chain; keep that chain alive throughout the test. ## Commands @@ -29,7 +31,7 @@ eval "$(./usdt-fixture env)" ./usdt-fixture down ``` -`fund` executes an actual ERC-20 transfer from a storage-funded donor, producing real receipt/history events. It does not overwrite the recipient balance. `smoke` creates independent disposable Core wallets and checks first-use EIP-7702 delegation without ETH, two sends, USDT fees and the approved fee bound, pending/manual inclusion across wallet reopen, proof verification, changed request binding and rejected paymaster authorization. It restores provider/bundler modes and removes only its own temporary wallet files. +`fund` executes an actual ERC-20 transfer from a storage-funded donor, producing real receipt/history events. It does not overwrite the recipient balance. `smoke` creates independent disposable Core wallets and checks first-use EIP-7702 delegation without ETH, two sends, USDT fees and the approved fee bound, pending/manual inclusion across wallet reopen, proof verification, incoming history, recovery into an empty database, changed request binding and rejected paymaster authorization. It restores provider/bundler modes and removes only its own temporary wallet files. | Command | Use | | --- | --- | @@ -42,6 +44,7 @@ eval "$(./usdt-fixture env)" | `wallet send ADDRESS ATOMIC_AMOUNT [Destination]` | Quote and send through Core; optional destination uses `Polygon`, `Bsc`, etc. | | `wallet quote ADDRESS ATOMIC_AMOUNT [Destination]` | Inspect a quote without paying | | `wallet refresh ID` | Reconcile pending execution, including older receipts; Core may retry the identical signed operation | +| `wallet sync`, then `wallet history` | Scan local payment history; repeat `sync` until `complete` is true | | `wallet proof ID BINDING_FILE` | Create the standard proof after execution | | `wallet verify BINDING_FILE PROOF_FILE` | Verify receipt, token, recipient and signature using the recipient Core wallet | diff --git a/usdt-fixture b/usdt-fixture index ccd0cda..ef8d2eb 100755 --- a/usdt-fixture +++ b/usdt-fixture @@ -84,7 +84,7 @@ Usage: ./usdt-fixture build Build pinned node, bundler, gateway and Core wallet images up Start the isolated Compose stack; wait until healthy ps | logs Inspect service health or follow logs (optional service) - down Remove this project's containers and disposable test-wallet volume + down Remove this project's containers, disposable wallets and fork cache env Print app/helper endpoint exports check Run fixture lint and protocol tests inside Docker (stack must be up) smoke Check real Core payments, fees, pending recovery and proofs diff --git a/usdt/Dockerfile b/usdt/Dockerfile index b028aa9..45f171f 100644 --- a/usdt/Dockerfile +++ b/usdt/Dockerfile @@ -45,6 +45,6 @@ RUN npm ci --ignore-scripts --no-audit --no-fund COPY --from=sources /usr/local/bin/anvil /usr/local/bin/anvil COPY --from=wallet /out/usdt-fixture-wallet /usr/local/bin/usdt-fixture-wallet COPY usdt/*.cjs usdt/biome.json usdt/pins.json ./ -RUN npm run lint && npm test && mkdir /state && chown node:node /state +RUN npm run lint && npm test && mkdir -p /state /home/node/.foundry && chown -R node:node /state /home/node/.foundry USER node CMD ["node", "server.cjs"] diff --git a/usdt/rpc.cjs b/usdt/rpc.cjs index 3124a97..3eaa618 100644 --- a/usdt/rpc.cjs +++ b/usdt/rpc.cjs @@ -28,7 +28,11 @@ async function rpc(url, method, params = []) { body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }), signal: AbortSignal.timeout(30_000), }); - if (!response.ok) throw new Error(`RPC returned HTTP ${response.status}`); + if (!response.ok) { + throw Object.assign(new Error(`RPC returned HTTP ${response.status}`), { + httpStatus: response.status, + }); + } const body = await response.json(); if (body.error) { const error = new Error(body.error.message); @@ -81,8 +85,11 @@ function upstreamReader(url) { if (!READ_METHODS.has(method)) throw new Error('Upstream writes are disabled'); try { return await rpc(url, method, params); - } catch { - throw new Error(`Upstream read failed: ${method}`); + } catch (cause) { + const error = new Error(`Upstream read failed: ${method}`); + // Preserve throttling for Anvil's retries without exposing provider diagnostics. + if (cause.httpStatus === 429 || cause.code === 429) error.httpStatus = 429; + throw error; } }; } diff --git a/usdt/rpc.test.cjs b/usdt/rpc.test.cjs index 1c0f851..cbce44b 100644 --- a/usdt/rpc.test.cjs +++ b/usdt/rpc.test.cjs @@ -20,6 +20,25 @@ test('upstream forwards reads, blocks writes and hides provider credentials', as assert.deepEqual(calls, ['eth_chainId', 'eth_getCode']); }); +test('upstream preserves HTTP and JSON-RPC throttling without provider diagnostics', async (t) => { + const server = await serve(0, (method) => { + throw Object.assign( + new Error('private provider diagnostics'), + method === 'eth_chainId' ? { httpStatus: 429 } : { code: 429, data: 'secret' }, + ); + }); + t.after(() => server.close()); + const read = upstreamReader(`http://127.0.0.1:${server.address().port}`); + for (const method of ['eth_chainId', 'eth_getCode']) { + await assert.rejects(read(method, []), (error) => { + assert.equal(error.httpStatus, 429); + assert.equal(error.message, `Upstream read failed: ${method}`); + assert.equal(error.data, undefined); + return true; + }); + } +}); + test('local RPC preserves errors and rejects browser control requests', async (t) => { let calls = 0; const server = await serve(0, () => { diff --git a/usdt/server.cjs b/usdt/server.cjs index 7b68414..31ca68c 100644 --- a/usdt/server.cjs +++ b/usdt/server.cjs @@ -40,6 +40,8 @@ async function run() { const read = upstreamReader(upstream); servers.push( await serve(ports.upstream, async (method, params) => { + // Test history starts after the fork; Anvil keeps locally mined logs itself. + if (method === 'eth_getLogs') return []; reads[method] = (reads[method] ?? 0) + 1; return read(method, params); }), diff --git a/usdt/smoke.cjs b/usdt/smoke.cjs index d4ae1fb..dd45071 100644 --- a/usdt/smoke.cjs +++ b/usdt/smoke.cjs @@ -11,13 +11,26 @@ const exec = promisify(execFile); async function smoke() { const directory = mkdtempSync(path.join(state, 'smoke-')); const runId = randomUUID(); - const wallet = async (name, ...args) => { + const walletAt = async (walletDirectory, name, ...args) => { const { stdout } = await exec('usdt-fixture-wallet', args, { - env: { ...process.env, USDT_WALLET_DIR: directory, USDT_WALLET_NAME: `${runId}-${name}` }, + env: { + ...process.env, + USDT_WALLET_DIR: walletDirectory, + USDT_WALLET_NAME: `${runId}-${name}`, + }, timeout: 120000, }); return JSON.parse(stdout); }; + const wallet = (name, ...args) => walletAt(directory, name, ...args); + const history = async (walletDirectory, name) => { + for (let i = 0; i < 20; i++) { + if ((await walletAt(walletDirectory, name, 'sync')).complete) { + return walletAt(walletDirectory, name, 'history'); + } + } + throw new Error('Local history did not finish syncing'); + }; const settled = async (id) => { for (let i = 0; i < 40; i++) { const payment = await wallet('sender', 'refresh', id); @@ -55,9 +68,25 @@ async function smoke() { assert.equal((await wallet('sender', 'refresh', second.transfer.id)).status, 'Pending'); assert.equal(BigInt(await rpc(urls.control, 'balance', [recipient])), 500000n); await rpc(urls.control, 'bundle'); - await settled(second.transfer.id); + const secondExecuted = await settled(second.transfer.id); assert.equal(BigInt(await rpc(urls.control, 'balance', [recipient])), 750000n); + await rpc(urls.control, 'mine', [3]); + const received = await history(directory, 'recipient'); + assert.equal(received.length, 2); + for (const [payment, amount] of [ + [executed, 500000], + [secondExecuted, 250000], + ]) { + const transfer = received.find((item) => item.tx_hash === payment.tx_hash); + assert.equal(transfer?.amount, amount); + assert.equal(transfer?.status, 'Confirmed'); + } + // Same seed, empty database: local-chain evidence must restore the incoming history. + const recovered = await history(path.join(directory, 'restored'), 'recipient'); + assert.deepEqual(recovered, received); + assert.equal((await rpc(urls.control, 'status')).reads.eth_getLogs, undefined); + const binding = { payer: 'fixture-payer', payee: 'fixture-payee', diff --git a/usdt/wallet/src/main.rs b/usdt/wallet/src/main.rs index b8e9b00..a361aaf 100644 --- a/usdt/wallet/src/main.rs +++ b/usdt/wallet/src/main.rs @@ -78,6 +78,7 @@ async fn main() -> Result<()> { json!(wallet.refresh_transfers().await?.into_iter().find(|transfer| transfer.id == *id)) } "history" => json!(wallet.history()?), + "sync" => json!({"complete": wallet.sync_history().await?}), "deposit" => { let client = UsdtDepositClient::new(address, format!("{GATEWAY}/deposits"))?; match args.get(1).map(String::as_str) { @@ -119,7 +120,7 @@ async fn main() -> Result<()> { }).await?; verified.map(|p| json!({"payment_id":p.payment_id,"transfer_id":p.transfer_id,"sender":p.sender,"recipient":p.recipient,"amount":p.amount,"timestamp":p.timestamp})).unwrap_or(Value::Null) } - _ => bail!("use address, balance, quote/send RECIPIENT ATOMIC_AMOUNT [Destination], deposit, refresh ID, history, proof ID BINDING_FILE, or verify BINDING_FILE PROOF_FILE"), + _ => bail!("use address, balance, quote/send RECIPIENT ATOMIC_AMOUNT [Destination], deposit, refresh ID, sync, history, proof ID BINDING_FILE, or verify BINDING_FILE PROOF_FILE"), }; println!("{}", serde_json::to_string_pretty(&result)?); Ok(())