diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..445c422 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,60 @@ +name: CI + +on: + pull_request: + push: + branches: + - main + +jobs: + verify: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: "20" + + - uses: oven-sh/setup-bun@v2 + with: + bun-version: "1.2.19" + + - name: Enforce lockfile policy + run: node scripts/check-lockfiles.mjs + + - name: Install TypeScript workspace + working-directory: ts + run: bun install --frozen-lockfile + + - name: Install Rust scripts workspace + working-directory: rs + run: npm ci + + - name: Test admin app + working-directory: ts/apps/admin + run: bun run test + + - name: Lint admin app + working-directory: ts/apps/admin + run: bun run lint + + - name: Build admin app + working-directory: ts/apps/admin + run: bun run build + + - name: Test web app + working-directory: ts/apps/web + run: bun run test + + - name: Lint web app + working-directory: ts/apps/web + run: bun run lint + + - name: Build web app + working-directory: ts/apps/web + run: bun run build + + - name: Test Anchor program + working-directory: rs + run: cargo test -p bunkercash diff --git a/rs/Anchor.toml b/rs/Anchor.toml index 69e498f..9a73907 100644 --- a/rs/Anchor.toml +++ b/rs/Anchor.toml @@ -1,6 +1,6 @@ [toolchain] anchor_version = "0.31.1" -package_manager = "yarn" +package_manager = "npm" [features] resolution = true @@ -19,9 +19,13 @@ bunkercash = "Fp8b6p287TL5oPMwLVdwGys5phHNLcmTKNvVoGdCJS6g" url = "https://api.apr.dev" [provider] -cluster = "devnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] +deploy-governed = "npx ts-node -P tsconfig.json scripts/deploy-governed.ts" e2e = "bash -lc 'export USDC_MINT=4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU; npx ts-node -P tsconfig.json scripts/e2e-buy-sell.ts'" -test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +require-upgrade-authority = "npx ts-node -P tsconfig.json scripts/require-program-upgrade-authority.ts" +test = "npx ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +verify-governance = "npx ts-node -P tsconfig.json scripts/verify-squads-setup.ts" +verify-upgrade-authority = "npx ts-node -P tsconfig.json scripts/verify-program-upgrade-authority.ts" diff --git a/rs/COMMANDS.md b/rs/COMMANDS.md index 99bd2df..52723e4 100644 --- a/rs/COMMANDS.md +++ b/rs/COMMANDS.md @@ -1,6 +1,11 @@ # BunkerCash – Commands (Start to End) -All commands assume you are in the `rs` directory and use the **pool admin** wallet for admin-only steps. For **mainnet**, switch `ANCHOR_PROVIDER_URL` and `solana config` to a mainnet RPC and set `USDC_MINT` to mainnet USDC. +All commands assume you are in the `rs` directory. For production-like +privileged actions, `pool.master_wallet` must be the Squads Vault PDA and the +admin UI/scripts must create Squads Vault Transactions rather than signing +directly with a human member wallet. For **mainnet**, switch +`ANCHOR_PROVIDER_URL` and `solana config` to a mainnet RPC and set `USDC_MINT` +to canonical mainnet USDC. --- @@ -11,6 +16,7 @@ cd rs export ANCHOR_PROVIDER_URL=https://api.devnet.solana.com export ANCHOR_WALLET=~/.config/solana/id.json export USDC_MINT=4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU +export SQUADS_PROGRAM_UPGRADE_AUTHORITY= ``` Or source the example env: @@ -22,21 +28,64 @@ source scripts/devnet.env.example.sh --- -## 2. Build & Deploy (admin / deployer) +## 2. Build & deploy with upgrade-authority handoff (admin / deployer) + +`SQUADS_PROGRAM_UPGRADE_AUTHORITY` is the expected authority for Solana program +upgrades. Confirm this address separately. Do not assume it is the same address +as `pool.master_wallet` / `SQUADS_VAULT_PUBKEY`. ```bash cd rs anchor build solana config set --url devnet solana airdrop 2 +npm run -s require:upgrade-authority +npm run -s deploy:governed +solana program show Fp8b6p287TL5oPMwLVdwGys5phHNLcmTKNvVoGdCJS6g +npm run -s verify:upgrade-authority +``` + +Manual equivalent: + +```bash anchor deploy +solana program show Fp8b6p287TL5oPMwLVdwGys5phHNLcmTKNvVoGdCJS6g +solana program set-upgrade-authority Fp8b6p287TL5oPMwLVdwGys5phHNLcmTKNvVoGdCJS6g \ + --new-upgrade-authority "$SQUADS_PROGRAM_UPGRADE_AUTHORITY" \ + --skip-new-upgrade-authority-signer-check +solana program show Fp8b6p287TL5oPMwLVdwGys5phHNLcmTKNvVoGdCJS6g +npm run -s verify:governance ``` +Blockage rule: if `SQUADS_PROGRAM_UPGRADE_AUTHORITY` is missing, deploy is not +allowed. If `solana program show` does not show that authority, or `none` for an +intentionally immutable program, do not bootstrap or fund. + --- -## 3. Bootstrap pool (admin, first time only) +## 3. Verify governance before bootstrap/funding -Creates the pool and BunkerCash mint if they don’t exist. The wallet in `ANCHOR_WALLET` becomes **pool admin** (stored in `PoolState.admin`). +```bash +cd rs +npm run -s verify:governance +``` + +This verifies both governance layers: + +- `pool.master_wallet` is the expected Squads vault PDA. +- program upgrade authority is the expected Squads-controlled authority, or the + program is explicitly immutable. + +Mainnet funding is blocked in scripts that move USDC until this check passes. + +--- + +## 4. Bootstrap pool (admin, first time only) + +Creates the pool and BunkerCash mint if they don’t exist. Production-like +initialization must set `master_wallet` to the Squads Vault PDA. If a recovery +rotation is needed later, use `update_master_wallet` through a Squads Vault +Transaction signed by the current `pool.master_wallet`. ```bash cd rs @@ -54,7 +103,7 @@ TEST_BUY_USDC=2.5 npx ts-node -P tsconfig.json scripts/bootstrap-fixed-price.ts --- -## 4. User: Buy (buy_primary) +## 5. User: Buy (buy_primary) User spends USDC and receives BunkerCash at the current pool price. @@ -79,7 +128,7 @@ Use the bRENT/Buy UI: connect wallet, enter USDC amount, submit. The app calls ` --- -## 5. User: Sell (register_sell) +## 6. User: Sell (register_sell) User locks BunkerCash into the escrow vault and gets a claim. No burn; payouts happen when admin runs `process_claims`. @@ -111,7 +160,7 @@ Use the Sell tab: connect wallet, enter token amount, submit. The app calls `reg --- -## 6. Admin: Update price (update_price) +## 7. Admin: Update price (update_price) Only the pool admin can change the fixed price (USDC per token, in base units). @@ -127,10 +176,13 @@ Example: `1000000` = 1 USDC (6 decimals) per 1 token (9 decimals). --- -## 7. Admin: Add liquidity (add_liquidity) +## 8. Admin: Add liquidity (add_liquidity) Admin sends USDC into the payout vault so it can be distributed to sell claimants. No standalone script; use the E2E script with `LIQ_USDC`: +On mainnet, this script refuses to move funds unless the program upgrade +authority is verified against `SQUADS_PROGRAM_UPGRADE_AUTHORITY`. + ```bash cd rs source scripts/devnet.env.example.sh @@ -143,7 +195,7 @@ This runs the full e2e flow (buy/sell if configured) and also calls `add_liquidi --- -## 8. Admin: Process claims (process_claims) +## 9. Admin: Process claims (process_claims) Admin triggers pro-rata USDC payouts from the payout vault to all open claims (and updates each claim’s `usdc_paid`). The E2E script does this when there are open claims and liquidity. @@ -160,7 +212,7 @@ The script fetches open claims, ensures user USDC ATAs exist, then calls `proces --- -## 9. Admin: Init token metadata (init_mint_metadata) +## 10. Admin: Init token metadata (init_mint_metadata) So wallets (e.g. Phantom) show the token name/symbol/icon instead of “Unknown Token”. Admin only, once per mint. @@ -177,7 +229,7 @@ npm run -s init:metadata --- -## 10. Utility: Check pool & balances +## 11. Utility: Check pool & balances ```bash cd rs @@ -195,7 +247,7 @@ Prints pool PDA, pool state (price, claim_counter), and token balances (user USD --- -## 11. Utility: Inspect open claims +## 12. Utility: Inspect open claims ```bash cd rs @@ -209,23 +261,27 @@ Optional: `TOP_N=20` to show top 20 by locked amount (default 10). ## Quick reference -| Role | Action | Command / script / app | -|--------|------------------|-------------------------| -| User | Buy (USDC → BNKR)| Web app, or `TEST_BUY_USDC=…` bootstrap, or `BUY_USDC=…` e2e | -| User | Sell (lock BNKR) | Web app, or `register-sell-escrow.ts` (SELL_TOKEN_AMOUNT), or e2e (SELL_BNKR) | -| Admin | Update price | `update-price.ts` (NEW_PRICE_USDC_PER_TOKEN) | -| Admin | Add liquidity | e2e with `LIQ_USDC=…` (wallet = admin) | -| Admin | Process claims | e2e (wallet = admin; script calls process_claims when claims exist) | -| Admin | Init metadata | `npm run -s init:metadata` (TOKEN_NAME, TOKEN_SYMBOL, TOKEN_URI) | -| Anyone | Check balances | `check-pool-balances.ts` / `npm run -s check:pool` | -| Anyone | List open claims| `inspect-open-claims.ts` | +| Role | Action | Command / script / app | +| ------ | ----------------- | ----------------------------------------------------------------------------- | +| User | Buy (USDC → BNKR) | Web app, or `TEST_BUY_USDC=…` bootstrap, or `BUY_USDC=…` e2e | +| User | Sell (lock BNKR) | Web app, or `register-sell-escrow.ts` (SELL_TOKEN_AMOUNT), or e2e (SELL_BNKR) | +| Admin | Update price | `update-price.ts` (NEW_PRICE_USDC_PER_TOKEN) | +| Admin | Add liquidity | e2e with `LIQ_USDC=…` (wallet = admin) | +| Admin | Process claims | e2e (wallet = admin; script calls process_claims when claims exist) | +| Admin | Init metadata | `npm run -s init:metadata` (TOKEN_NAME, TOKEN_SYMBOL, TOKEN_URI) | +| Anyone | Check balances | `check-pool-balances.ts` / `npm run -s check:pool` | +| Anyone | List open claims | `inspect-open-claims.ts` | --- ## Summary flow -1. **Deploy** program and **bootstrap** pool (admin wallet becomes pool admin). -2. **Users** buy (USDC → BunkerCash) and sell (lock BunkerCash → claim). -3. **Admin** adds USDC to the payout vault (`add_liquidity` via e2e with `LIQ_USDC`). -4. **Admin** runs `process_claims` (e2e or custom tool) to distribute USDC pro-rata to claimants. -5. **Admin** can update price anytime (`update-price.ts`) and set token metadata once (`init:metadata`). +1. **Deploy** program. +2. **Verify** current program upgrade authority. +3. **Transfer** program upgrade authority to `SQUADS_PROGRAM_UPGRADE_AUTHORITY`. +4. **Verify** program upgrade authority again with `solana program show` and `npm run -s verify:governance`. +5. **Bootstrap/fund** only after governance verification passes. +6. **Users** buy (USDC → BunkerCash) and sell (lock BunkerCash → claim). +7. **Admin** adds USDC to the payout vault (`add_liquidity` via e2e with `LIQ_USDC`). +8. **Admin** runs `process_claims` (e2e or custom tool) to distribute USDC pro-rata to claimants. +9. **Admin** can update price anytime (`update-price.ts`) and set token metadata once (`init:metadata`). diff --git a/rs/README.md b/rs/README.md index 950aeac..e3fb708 100644 --- a/rs/README.md +++ b/rs/README.md @@ -1,6 +1,26 @@ # BunkerCash - Solana Program -Fixed-price primary buy + irreversible sell registration (escrow lock; no burn). +NAV-priced primary buy + escrowed sell claims with settlement epochs. + +Current governance model: + +- `pool.master_wallet` is the privileged authority and should be initialized to + the Squads Vault PDA for production-like environments. +- Privileged actions are executed through Squads Vault Transactions, not direct + human-wallet signatures. +- `update_master_wallet` exists for recovery/rotation and is gated by the + current `pool.master_wallet`, so a Squads Vault can rotate authority through a + vault transaction. +- Program upgrade authority is a separate, higher-power control and must be + Squads-controlled or revoked before mainnet funding. + +Current pricing/settlement model: + +- Buy quotes use available NAV (`pool.nav - pool.total_pending_claims`) divided + by circulating BunkerCash supply. UI surfaces the age of cached NAV reads. +- Sell requests create claim accounts and lock BunkerCash in escrow. +- Settlement eligibility uses monotonic claim sequence snapshots, not wall-clock + timestamp comparisons. ## Development @@ -10,15 +30,23 @@ Prerequisites: Rust 1.70+, Solana CLI 1.18+, Anchor 0.31.1, Node.js 18+ # Build anchor build -# Deploy to devnet +# Deploy to devnet with mandatory program upgrade-authority handoff. +# SQUADS_PROGRAM_UPGRADE_AUTHORITY must be a confirmed Squads-controlled address. solana config set --url devnet solana airdrop 2 -anchor deploy +export SQUADS_PROGRAM_UPGRADE_AUTHORITY= +npm run -s deploy:governed +npm run -s verify:upgrade-authority ``` +Do not bootstrap or fund mainnet until `npm run -s verify:governance` passes. The +program upgrade authority is above `pool.master_wallet`; setting `pool.master_wallet` +to a Squads vault does not by itself prevent a deployer wallet from upgrading the +program. + ## Testing from the command line -Tests use the same IDL as the web app (`ts/apps/web/lib/bunkercash.fixed.idl.json`) so they match the current program (initialize, buy_primary, update_price, register_sell). +Tests use the same IDL as the web app (`ts/apps/web/lib/bunkercash.fixed.idl.json`) so they match the current program. **1. Run Anchor tests (initialize, or skip if pool exists)** @@ -33,7 +61,7 @@ Or run only the TypeScript test file: ```bash cd rs -yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/bunkercash.ts +npx ts-mocha -p ./tsconfig.json -t 1000000 tests/bunkercash.ts ``` **2. Bootstrap pool + optional buy (full manual flow)** @@ -45,6 +73,8 @@ cd rs export ANCHOR_PROVIDER_URL=https://api.devnet.solana.com export ANCHOR_WALLET=~/.config/solana/id.json export USDC_MINT=4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU +export SQUADS_PROGRAM_UPGRADE_AUTHORITY= +npm run -s verify:governance npx ts-node -P tsconfig.json scripts/bootstrap-fixed-price.ts # Optional: run a test buy (e.g. 2.5 USDC worth) TEST_BUY_USDC=2.5 npx ts-node -P tsconfig.json scripts/bootstrap-fixed-price.ts diff --git a/rs/migrations/deploy.ts b/rs/migrations/deploy.ts index 439431e..ce61829 100644 --- a/rs/migrations/deploy.ts +++ b/rs/migrations/deploy.ts @@ -3,10 +3,21 @@ // configured from the workspace's Anchor.toml. import * as anchor from "@coral-xyz/anchor"; +import { requireProgramUpgradeAuthorityEnv } from "../scripts/governance"; module.exports = async function (provider: anchor.AnchorProvider) { // Configure client to use the provider. anchor.setProvider(provider); - // Add your deploy script here. + const upgradeAuthority = requireProgramUpgradeAuthorityEnv(); + console.log( + "Program upgrade authority required:", + upgradeAuthority.toBase58() + ); + console.log("After deploy, run:"); + console.log( + " solana program set-upgrade-authority --new-upgrade-authority " + + upgradeAuthority.toBase58() + + " --skip-new-upgrade-authority-signer-check" + ); }; diff --git a/rs/package-lock.json b/rs/package-lock.json index ba50958..72eab94 100644 --- a/rs/package-lock.json +++ b/rs/package-lock.json @@ -4,7 +4,7 @@ "requires": true, "packages": { "": { - "license": "ISC", + "license": "BUSL-1.1", "dependencies": { "@coral-xyz/anchor": "=0.31.1", "@metaplex-foundation/mpl-token-metadata": "=3.4.0", @@ -13,9 +13,7 @@ "@solana/spl-token": "=0.4.14", "@solana/web3.js": "=1.98.4", "@sqds/multisig": "=2.1.4", - "anchor": "=1.4.2", - "bn.js": "=5.2.1", - "cargo": "=0.8.0" + "bn.js": "=5.2.1" }, "devDependencies": { "@types/bn.js": "=5.1.0", @@ -423,12 +421,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@sailshq/lodash": { - "version": "3.10.7", - "resolved": "https://registry.npmjs.org/@sailshq/lodash/-/lodash-3.10.7.tgz", - "integrity": "sha512-6Vi9xMlR8PbPeoDKjJHUVIhqeE8vz9Jjm/r3nZI7DI+cjtjHmlsjvAprXJy8hauCGxB5HqOBtpjWukOeId6WRw==", - "license": "MIT" - }, "node_modules/@solana/buffer-layout": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", @@ -890,16 +882,6 @@ "node": ">= 8.0.0" } }, - "node_modules/anchor": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/anchor/-/anchor-1.4.2.tgz", - "integrity": "sha512-qwNKSQ9yZQj0dQh8HzxGX1kHbx7WhEFHx7galQ26Xvn90konFPQMOnm/VR8RxgbOI3kLuURxB+ZzKmOelGoBVQ==", - "license": "MIT", - "dependencies": { - "@sailshq/lodash": "^3.10.2", - "validator": "13.15.23" - } - }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -1254,12 +1236,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cargo": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/cargo/-/cargo-0.8.0.tgz", - "integrity": "sha512-Fl49HZ8CAs4++TjtwcoZgwyq2ZQUiFVGQ3byyKKUilNk65iuBRDjpCGH/AUORvAODaVVbGbKyFCa67tlDG3p4g==", - "license": "MIT" - }, "node_modules/chai": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", @@ -3114,15 +3090,6 @@ "dev": true, "license": "MIT" }, - "node_modules/validator": { - "version": "13.15.23", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.23.tgz", - "integrity": "sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/rs/package.json b/rs/package.json index cbe2462..f7c5910 100644 --- a/rs/package.json +++ b/rs/package.json @@ -1,11 +1,16 @@ { "license": "BUSL-1.1", "scripts": { + "check:lockfiles": "node ../scripts/check-lockfiles.mjs", "check:pool": "ts-node -P tsconfig.json scripts/check-pool-balances.ts", + "deploy:governed": "ts-node -P tsconfig.json scripts/deploy-governed.ts", "e2e": "ts-node -P tsconfig.json scripts/e2e-buy-sell.ts", "init:metadata": "ts-node -P tsconfig.json scripts/init-mint-metadata.ts", + "require:upgrade-authority": "ts-node -P tsconfig.json scripts/require-program-upgrade-authority.ts", "squads:v4:create": "ts-node -P tsconfig.json scripts/create-squads-v4-multisig.ts", "update:metadata": "ts-node -P tsconfig.json scripts/update-mint-metadata.ts", + "verify:governance": "ts-node -P tsconfig.json scripts/verify-squads-setup.ts", + "verify:upgrade-authority": "ts-node -P tsconfig.json scripts/verify-program-upgrade-authority.ts", "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" }, @@ -17,9 +22,7 @@ "@solana/spl-token": "=0.4.14", "@solana/web3.js": "=1.98.4", "@sqds/multisig": "=2.1.4", - "anchor": "=1.4.2", - "bn.js": "=5.2.1", - "cargo": "=0.8.0" + "bn.js": "=5.2.1" }, "devDependencies": { "@types/bn.js": "=5.1.0", diff --git a/rs/programs/bunkercash/.env.example b/rs/programs/bunkercash/.env.example index 20765d9..8d9978b 100644 --- a/rs/programs/bunkercash/.env.example +++ b/rs/programs/bunkercash/.env.example @@ -11,6 +11,11 @@ SQUADS_MULTISIG_PUBKEY= # Derived by `@sqds/multisig` as: getVaultPda({ multisigPda, index: 0 }) with programId=SQDS4... SQUADS_VAULT_PUBKEY= +# Squads-controlled authority for Solana program upgrades. +# Confirm this address explicitly. It may be a Squads vault PDA, but it is not +# automatically the same trust root as SQUADS_VAULT_PUBKEY / pool.master_wallet. +SQUADS_PROGRAM_UPGRADE_AUTHORITY= + # ── 4 Squads member signers ─────────────────────────────────────────────────── # The 4 wallet addresses that are members of the Squads multisig. SQUADS_MEMBER_1= diff --git a/rs/programs/bunkercash/src/program.rs b/rs/programs/bunkercash/src/program.rs index f265336..1cb8b83 100644 --- a/rs/programs/bunkercash/src/program.rs +++ b/rs/programs/bunkercash/src/program.rs @@ -61,13 +61,17 @@ const DEFAULT_MIN_CLAIM_USDC: u64 = 1_000_000; // // Pool before settlement_epoch_seq was added: // 8 + 32 (master_wallet) + 5 * 8 (u64 fields) + 1 (bump) -const LEGACY_POOL_SPACE: usize = 8 + 32 + 5 * 8 + 1; +const LEGACY_POOL_V1_SPACE: usize = 8 + 32 + 5 * 8 + 1; +// Pool after settlement_epoch_seq was added, before next_claim_seq: +const LEGACY_POOL_V2_SPACE: usize = LEGACY_POOL_V1_SPACE + 8; // Claim as originally deployed (no epoch fields at all): // 8 + 32 (user) + 8 + 8 + 1 + 8 + 8 + 8 + 1 + 1 const LEGACY_CLAIM_V1_SPACE: usize = 8 + 32 + 8 + 8 + 1 + 8 + 8 + 8 + 1 + 1; // Claim with the interim `last_settled_epoch: i64` timestamp marker that // predates the monotonic epoch sequence pair. const LEGACY_CLAIM_V2_SPACE: usize = LEGACY_CLAIM_V1_SPACE + 8; +// Claim after monotonic settlement epoch fields were added, before claim_seq. +const LEGACY_CLAIM_V3_SPACE: usize = LEGACY_CLAIM_V2_SPACE + 8; fn arithmetic_error() -> Error { ErrorCode::ArithmeticError.into() @@ -118,6 +122,12 @@ fn validate_initializer(initializer: &Pubkey) -> Result<()> { Ok(()) } +fn apply_master_wallet_update(pool: &mut Pool, new_master_wallet: Pubkey) -> Pubkey { + let old_master_wallet = pool.master_wallet; + pool.master_wallet = new_master_wallet; + old_master_wallet +} + fn calculate_claim_usdc_value( bunkercash_amount: u64, nav: u64, @@ -370,6 +380,17 @@ fn validate_unique_settlement_claim_accounts(claim_keys: &[Pubkey]) -> Result<() Ok(()) } +fn claim_is_in_settlement_snapshot(claim: &Claim, settlement: &SettlementState) -> bool { + claim.claim_seq < settlement.snapshot_claim_seq +} + +fn claim_is_settleable_in_epoch(claim: &Claim, settlement: &SettlementState) -> bool { + !claim.cancelled + && claim.paid_amount < claim.usdc_amount + && claim_is_in_settlement_snapshot(claim, settlement) + && claim.last_settled_epoch_seq != settlement.epoch_seq +} + // Grows a program-owned account to `new_space`, topping up lamports from // `payer` first so the account stays rent-exempt at the new size. New bytes // are zero-initialized. @@ -469,6 +490,7 @@ pub mod bunkercash { pool.total_bunkercash_supply = 0; pool.total_pending_claims = 0; pool.claim_counter = 0; + pool.next_claim_seq = 0; pool.withdrawal_counter = 0; pool.settlement_epoch_seq = 0; pool.bump = ctx.bumps.pool; @@ -605,6 +627,37 @@ pub mod bunkercash { Ok(()) } + pub fn update_master_wallet( + ctx: Context, + new_master_wallet: Pubkey, + ) -> Result<()> { + let pool = &mut ctx.accounts.pool; + let old_master_wallet = pool.master_wallet; + + require!( + ctx.accounts.current_master_wallet.key() == old_master_wallet, + ErrorCode::Unauthorized + ); + + apply_master_wallet_update(pool, new_master_wallet); + + emit!(MasterWalletUpdatedEvent { + pool: pool.key(), + current_master_wallet: old_master_wallet, + new_master_wallet, + authority: ctx.accounts.current_master_wallet.key(), + timestamp: Clock::get()?.unix_timestamp, + }); + + msg!( + "BunkerCash master wallet updated from {} to {}", + old_master_wallet, + new_master_wallet + ); + + Ok(()) + } + pub fn set_supported_usdc_mint(ctx: Context) -> Result<()> { let pool = &ctx.accounts.pool; let supported_usdc_config = &mut ctx.accounts.supported_usdc_config; @@ -915,6 +968,11 @@ pub mod bunkercash { .total_pending_claims .checked_add(usdc_value) .ok_or_else(arithmetic_error)?; + let claim_seq = pool.next_claim_seq; + pool.next_claim_seq = pool + .next_claim_seq + .checked_add(1) + .ok_or_else(arithmetic_error)?; pool.claim_counter = pool.claim_counter.checked_add(1).ok_or_else(arithmetic_error)?; let claim_id = pool.claim_counter.checked_sub(1).ok_or_else(arithmetic_error)?; @@ -930,6 +988,7 @@ pub mod bunkercash { claim.cancelled = false; claim.last_settled_epoch_seq = 0; claim.last_paid_epoch_seq = 0; + claim.claim_seq = claim_seq; claim.bump = ctx.bumps.claim; emit!(ClaimFiledEvent { @@ -981,15 +1040,15 @@ pub mod bunkercash { )?; // Only claims that existed before the settlement epoch opened are - // eligible. Without this gate a master wallet could file a large + // eligible. Without this gate a master wallet could file a large // post-epoch claim, settle only it, and satisfy the completeness - // check while paying nothing to original claimants. + // check while paying nothing to original claimants. The boundary is + // the monotonic claim sequence snapshotted at open_settlement; wall + // clock timestamps are too coarse and can collide inside one unix + // second. // `last_settled_epoch_seq != epoch_seq` additionally rejects claims // already paid in an earlier batch of this same epoch (multi-batch - // re-submission anti-replay). Using a monotonic sequence instead of - // a raw timestamp avoids same-second collisions between consecutive - // epochs. - let epoch_timestamp = ctx.accounts.settlement_state.timestamp; + // re-submission anti-replay). let epoch_seq = ctx.accounts.settlement_state.epoch_seq; let mut actual_total_remaining = 0u64; @@ -997,11 +1056,7 @@ pub mod bunkercash { if idx % 2 == 0 { let claim_data = claim_account_info.try_borrow_data()?; let claim = Claim::try_deserialize(&mut &claim_data[..])?; - if !claim.cancelled - && claim.paid_amount < claim.usdc_amount - && claim.timestamp < epoch_timestamp - && claim.last_settled_epoch_seq != epoch_seq - { + if claim_is_settleable_in_epoch(&claim, &ctx.accounts.settlement_state) { actual_total_remaining = actual_total_remaining .checked_add(claim.usdc_amount.saturating_sub(claim.paid_amount)) .ok_or_else(arithmetic_error)?; @@ -1079,11 +1134,7 @@ pub mod bunkercash { let mut claim_data = claim_account_info.try_borrow_mut_data()?; let claim = Claim::try_deserialize(&mut &claim_data[..])?; - if !claim.cancelled - && claim.paid_amount < claim.usdc_amount - && claim.timestamp < epoch_timestamp - && claim.last_settled_epoch_seq != epoch_seq - { + if claim_is_settleable_in_epoch(&claim, settlement) { let claim_usdc_amount = claim.usdc_amount; let claim_paid_amount = claim.paid_amount; let claim_remaining_amount = claim_usdc_amount.saturating_sub(claim.paid_amount); @@ -1336,7 +1387,7 @@ pub mod bunkercash { // other claim is still unsettled. (Only dust claims that // received a zero payout can reach this path; paid claims are // blocked from cancelling by the last_paid_epoch_seq guard.) - if claim.timestamp < settlement.timestamp + if claim_is_in_settlement_snapshot(claim, &settlement) && claim.last_settled_epoch_seq != settlement.epoch_seq { settlement.total_cancelled_usdc = settlement @@ -1421,6 +1472,7 @@ pub mod bunkercash { settlement.total_cancelled_usdc = 0; settlement.total_processed_usdc = 0; settlement.epoch_seq = pool.settlement_epoch_seq; + settlement.snapshot_claim_seq = pool.next_claim_seq; settlement.timestamp = timestamp; settlement.bump = ctx.bumps.settlement_state; @@ -1510,12 +1562,25 @@ pub mod bunkercash { msg!("Pool already uses the current layout; nothing to migrate"); return Ok(()); } - require!( - data.len() == LEGACY_POOL_SPACE, - ErrorCode::UnknownAccountLayout - ); - LegacyPool::deserialize(&mut &data[8..]) - .map_err(|_| error!(ErrorCode::InvalidMigrationAccount))? + match data.len() { + LEGACY_POOL_V1_SPACE => { + let v1 = LegacyPool::deserialize(&mut &data[8..]) + .map_err(|_| error!(ErrorCode::InvalidMigrationAccount))?; + LegacyPoolV2 { + master_wallet: v1.master_wallet, + nav: v1.nav, + total_bunkercash_supply: v1.total_bunkercash_supply, + total_pending_claims: v1.total_pending_claims, + claim_counter: v1.claim_counter, + withdrawal_counter: v1.withdrawal_counter, + settlement_epoch_seq: 0, + bump: v1.bump, + } + } + LEGACY_POOL_V2_SPACE => LegacyPoolV2::deserialize(&mut &data[8..]) + .map_err(|_| error!(ErrorCode::InvalidMigrationAccount))?, + _ => return err!(ErrorCode::UnknownAccountLayout), + } }; require!( @@ -1536,8 +1601,9 @@ pub mod bunkercash { total_bunkercash_supply: legacy.total_bunkercash_supply, total_pending_claims: legacy.total_pending_claims, claim_counter: legacy.claim_counter, + next_claim_seq: legacy.claim_counter, withdrawal_counter: legacy.withdrawal_counter, - settlement_epoch_seq: 0, + settlement_epoch_seq: legacy.settlement_epoch_seq, bump: legacy.bump, }; { @@ -1609,6 +1675,21 @@ pub mod bunkercash { bump: v2.bump, } } + LEGACY_CLAIM_V3_SPACE => { + let v3 = LegacyClaimV3::deserialize(&mut &data[8..]) + .map_err(|_| error!(ErrorCode::InvalidMigrationAccount))?; + LegacyClaimV1 { + user: v3.user, + usdc_amount: v3.usdc_amount, + timestamp: v3.timestamp, + processed: v3.processed, + paid_amount: v3.paid_amount, + bunkercash_escrow: v3.bunkercash_escrow, + bunkercash_remaining: v3.bunkercash_remaining, + cancelled: v3.cancelled, + bump: v3.bump, + } + } _ => return err!(ErrorCode::UnknownAccountLayout), }; (legacy, data.len() as u64) @@ -1632,6 +1713,7 @@ pub mod bunkercash { cancelled: legacy.cancelled, last_settled_epoch_seq: 0, last_paid_epoch_seq: 0, + claim_seq: 0, bump: legacy.bump, }; { @@ -2313,6 +2395,21 @@ pub struct SetSupportedUsdcMint<'info> { pub system_program: Program<'info, System>, } +#[derive(Accounts)] +pub struct UpdateMasterWallet<'info> { + #[account( + mut, + seeds = [POOL_SEED], + bump = pool.bump + )] + pub pool: Account<'info, Pool>, + + #[account( + address = pool.master_wallet @ ErrorCode::InvalidMasterWallet + )] + pub current_master_wallet: Signer<'info>, +} + #[derive(Accounts)] pub struct FileClaim<'info> { #[account( @@ -2860,6 +2957,7 @@ pub struct Pool { pub total_bunkercash_supply: u64, pub total_pending_claims: u64, pub claim_counter: u64, + pub next_claim_seq: u64, pub withdrawal_counter: u64, pub settlement_epoch_seq: u64, pub bump: u8, @@ -2888,6 +2986,9 @@ pub struct Claim { // non-zero payout. Used by cancel_claim to block cancellation only // when actual USDC was transferred this epoch. pub last_paid_epoch_seq: u64, + // Monotonic claim sequence assigned at file_claim. Settlement snapshots + // use this as their eligibility boundary instead of wall-clock time. + pub claim_seq: u64, pub bump: u8, } @@ -2906,6 +3007,18 @@ struct LegacyPool { bump: u8, } +#[derive(AnchorDeserialize)] +struct LegacyPoolV2 { + master_wallet: Pubkey, + nav: u64, + total_bunkercash_supply: u64, + total_pending_claims: u64, + claim_counter: u64, + withdrawal_counter: u64, + settlement_epoch_seq: u64, + bump: u8, +} + #[derive(AnchorDeserialize)] struct LegacyClaimV1 { user: Pubkey, @@ -2936,6 +3049,23 @@ struct LegacyClaimV2 { bump: u8, } +#[derive(AnchorDeserialize)] +struct LegacyClaimV3 { + user: Pubkey, + usdc_amount: u64, + timestamp: i64, + processed: bool, + paid_amount: u64, + bunkercash_escrow: u64, + bunkercash_remaining: u64, + cancelled: bool, + #[allow(dead_code)] + last_settled_epoch_seq: u64, + #[allow(dead_code)] + last_paid_epoch_seq: u64, + bump: u8, +} + #[account] #[derive(InitSpace)] pub struct Withdrawal { @@ -3003,6 +3133,7 @@ pub struct SettlementState { // happen while no settlement epoch is open. pub total_processed_usdc: u64, pub epoch_seq: u64, + pub snapshot_claim_seq: u64, pub timestamp: i64, pub bump: u8, } @@ -3024,6 +3155,15 @@ pub struct PoolInitializedEvent { pub timestamp: i64, } +#[event] +pub struct MasterWalletUpdatedEvent { + pub pool: Pubkey, + pub current_master_wallet: Pubkey, + pub new_master_wallet: Pubkey, + pub authority: Pubkey, + pub timestamp: i64, +} + #[event] pub struct UsdcDepositedEvent { pub pool: Pubkey, @@ -3310,19 +3450,54 @@ pub enum ErrorCode { mod tests { use super::{ apply_master_cancellation, apply_master_close_withdrawal, apply_master_profit, - apply_master_repayment, calculate_claim_usdc_value, calculate_fee_amount, + apply_master_repayment, apply_master_wallet_update, calculate_claim_usdc_value, + calculate_fee_amount, + claim_is_in_settlement_snapshot, claim_is_settleable_in_epoch, compute_settlement_payout_ratio, record_master_withdrawal, validate_fee_bps, validate_initializer, validate_open_withdrawal, validate_purchase_limit, validate_settlement_completeness, validate_settlement_pending_claims, validate_supported_usdc_mint, validate_supported_usdc_mint_change, validate_unique_settlement_claim_accounts, Claim, ErrorCode, MinClaimConfig, - MinSettlementConfig, Pool, PurchaseLimitConfig, SupportedUsdcConfig, Withdrawal, - DEFAULT_MIN_CLAIM_USDC, LEGACY_CLAIM_V1_SPACE, LEGACY_CLAIM_V2_SPACE, LEGACY_POOL_SPACE, - SQUADS_MEMBER_1, + MinSettlementConfig, Pool, PurchaseLimitConfig, SettlementState, SupportedUsdcConfig, + Withdrawal, DEFAULT_MIN_CLAIM_USDC, LEGACY_CLAIM_V1_SPACE, LEGACY_CLAIM_V2_SPACE, + LEGACY_CLAIM_V3_SPACE, LEGACY_POOL_V1_SPACE, LEGACY_POOL_V2_SPACE, SQUADS_MEMBER_1, }; use anchor_lang::prelude::Pubkey; use anchor_lang::Space; + fn test_claim(claim_seq: u64, timestamp: i64, usdc_amount: u64) -> Claim { + Claim { + user: Pubkey::new_unique(), + usdc_amount, + timestamp, + processed: false, + paid_amount: 0, + bunkercash_escrow: usdc_amount, + bunkercash_remaining: usdc_amount, + cancelled: false, + last_settled_epoch_seq: 0, + last_paid_epoch_seq: 0, + claim_seq, + bump: 255, + } + } + + fn test_settlement(snapshot_claim_seq: u64, timestamp: i64) -> SettlementState { + SettlementState { + pool: Pubkey::new_unique(), + vault_snapshot: 1_000_000, + pending_snapshot: 1_000_000, + payout_ratio_ppm: 1_000_000, + total_settled_usdc: 0, + total_cancelled_usdc: 0, + total_processed_usdc: 0, + epoch_seq: 1, + snapshot_claim_seq, + timestamp, + bump: 255, + } + } + #[test] fn claim_value_rejects_zero_burn_amount() { assert_eq!(calculate_claim_usdc_value(0, 1_000_000, 1_000_000), None); @@ -3360,6 +3535,7 @@ mod tests { total_bunkercash_supply: 7_500_000, total_pending_claims: 0, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 3, settlement_epoch_seq: 0, bump: 255, @@ -3395,6 +3571,7 @@ mod tests { total_bunkercash_supply: 7_500_000, total_pending_claims: 0, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 1, settlement_epoch_seq: 0, bump: 255, @@ -3422,6 +3599,7 @@ mod tests { total_bunkercash_supply: 7_500_000, total_pending_claims: 0, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 1, settlement_epoch_seq: 0, bump: 255, @@ -3450,6 +3628,7 @@ mod tests { total_bunkercash_supply: 7_500_000, total_pending_claims: 0, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 1, settlement_epoch_seq: 0, bump: 255, @@ -3477,6 +3656,7 @@ mod tests { total_bunkercash_supply: 7_500_000, total_pending_claims: 0, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 1, settlement_epoch_seq: 0, bump: 255, @@ -3504,6 +3684,7 @@ mod tests { total_bunkercash_supply: 7_500_000, total_pending_claims: 0, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 1, settlement_epoch_seq: 0, bump: 255, @@ -3532,6 +3713,7 @@ mod tests { total_bunkercash_supply: 7_500_000, total_pending_claims: 0, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 1, settlement_epoch_seq: 0, bump: 255, @@ -3576,6 +3758,7 @@ mod tests { total_bunkercash_supply: 7_500_000, total_pending_claims: 0, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 1, settlement_epoch_seq: 0, bump: 255, @@ -3603,6 +3786,7 @@ mod tests { total_bunkercash_supply: 7_500_000, total_pending_claims: 0, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 1, settlement_epoch_seq: 0, bump: 255, @@ -3630,6 +3814,7 @@ mod tests { total_bunkercash_supply: 7_500_000, total_pending_claims: 0, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 1, settlement_epoch_seq: 0, bump: 255, @@ -3657,6 +3842,7 @@ mod tests { total_bunkercash_supply: 7_500_000, total_pending_claims: 0, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 1, settlement_epoch_seq: 0, bump: 255, @@ -3691,6 +3877,7 @@ mod tests { total_bunkercash_supply: 7_500_000, total_pending_claims: 0, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 1, settlement_epoch_seq: 0, bump: 255, @@ -3765,6 +3952,28 @@ mod tests { assert_eq!(err, ErrorCode::Unauthorized.into()); } + #[test] + fn master_wallet_update_rotates_to_new_authority() { + let old_master_wallet = Pubkey::new_unique(); + let new_master_wallet = Pubkey::new_unique(); + let mut pool = Pool { + master_wallet: old_master_wallet, + nav: 0, + total_bunkercash_supply: 0, + total_pending_claims: 0, + claim_counter: 0, + next_claim_seq: 0, + withdrawal_counter: 0, + settlement_epoch_seq: 0, + bump: 255, + }; + + let previous = apply_master_wallet_update(&mut pool, new_master_wallet); + + assert_eq!(previous, old_master_wallet); + assert_eq!(pool.master_wallet, new_master_wallet); + } + #[test] fn supported_usdc_mint_change_allows_noop_update() { let pool = Pool { @@ -3773,6 +3982,7 @@ mod tests { total_bunkercash_supply: 5_000_000, total_pending_claims: 1_000_000, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 0, settlement_epoch_seq: 0, bump: 255, @@ -3790,6 +4000,7 @@ mod tests { total_bunkercash_supply: 0, total_pending_claims: 0, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 0, settlement_epoch_seq: 0, bump: 255, @@ -3813,6 +4024,7 @@ mod tests { total_bunkercash_supply: 5_000_000, total_pending_claims: 0, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 0, settlement_epoch_seq: 0, bump: 255, @@ -3836,6 +4048,7 @@ mod tests { total_bunkercash_supply: 0, total_pending_claims: 5_000, claim_counter: 0, + next_claim_seq: 0, withdrawal_counter: 0, settlement_epoch_seq: 0, bump: 255, @@ -4022,16 +4235,62 @@ mod tests { ); } + #[test] + fn same_second_pre_open_claim_is_eligible_by_sequence() { + let settlement = test_settlement(11, 1_700_000_000); + let claim = test_claim(10, 1_700_000_000, 250_000); + + assert!(claim_is_in_settlement_snapshot(&claim, &settlement)); + assert!(claim_is_settleable_in_epoch(&claim, &settlement)); + } + + #[test] + fn same_second_post_open_claim_is_not_eligible_by_sequence() { + let settlement = test_settlement(11, 1_700_000_000); + let claim = test_claim(11, 1_700_000_000, 250_000); + + assert!(!claim_is_in_settlement_snapshot(&claim, &settlement)); + assert!(!claim_is_settleable_in_epoch(&claim, &settlement)); + } + + #[test] + fn same_second_cancel_path_counts_only_snapshot_claims() { + let settlement = test_settlement(11, 1_700_000_000); + let pre_open_claim = test_claim(10, 1_700_000_000, 300_000); + let post_open_claim = test_claim(11, 1_700_000_000, 700_000); + + let mut cancelled = 0u64; + if claim_is_in_settlement_snapshot(&pre_open_claim, &settlement) + && pre_open_claim.last_settled_epoch_seq != settlement.epoch_seq + { + cancelled = cancelled + .checked_add(pre_open_claim.usdc_amount - pre_open_claim.paid_amount) + .unwrap(); + } + if claim_is_in_settlement_snapshot(&post_open_claim, &settlement) + && post_open_claim.last_settled_epoch_seq != settlement.epoch_seq + { + cancelled = cancelled + .checked_add(post_open_claim.usdc_amount - post_open_claim.paid_amount) + .unwrap(); + } + + assert_eq!(cancelled, 300_000); + assert!(validate_settlement_completeness(700_000, 1_000_000, cancelled).is_ok()); + } + #[test] fn legacy_layout_sizes_match_migration_constants() { // The migrate_* instructions key off exact account sizes; if the // current structs change again these assertions force the legacy // constants (and migration logic) to be revisited. - assert_eq!(LEGACY_POOL_SPACE, 81); - assert_eq!(8 + Pool::INIT_SPACE, LEGACY_POOL_SPACE + 8); + assert_eq!(LEGACY_POOL_V1_SPACE, 81); + assert_eq!(LEGACY_POOL_V2_SPACE, LEGACY_POOL_V1_SPACE + 8); + assert_eq!(8 + Pool::INIT_SPACE, LEGACY_POOL_V2_SPACE + 8); assert_eq!(LEGACY_CLAIM_V1_SPACE, 83); assert_eq!(LEGACY_CLAIM_V2_SPACE, 91); - assert_eq!(8 + Claim::INIT_SPACE, LEGACY_CLAIM_V2_SPACE + 8); + assert_eq!(LEGACY_CLAIM_V3_SPACE, LEGACY_CLAIM_V2_SPACE + 8); + assert_eq!(8 + Claim::INIT_SPACE, LEGACY_CLAIM_V3_SPACE + 8); } // Regression note — multi-batch re-submission attack diff --git a/rs/scripts/bootstrap-fixed-price.ts b/rs/scripts/bootstrap-fixed-price.ts index 905b634..4f53f29 100644 --- a/rs/scripts/bootstrap-fixed-price.ts +++ b/rs/scripts/bootstrap-fixed-price.ts @@ -22,6 +22,7 @@ import { createAssociatedTokenAccountIdempotentInstruction, getAssociatedTokenAddressSync, } from "@solana/spl-token"; +import { assertMainnetFundingAllowed } from "./governance"; // Import the webapp's IDL so this script doesn't depend on generated types. // eslint-disable-next-line @typescript-eslint/no-var-requires @@ -37,7 +38,9 @@ const POOL_SIGNER_SEED = "bunkercash_pool_signer"; function requireUsdcMint(): PublicKey { const mint = process.env.USDC_MINT; if (!mint) { - throw new Error("USDC_MINT must be set explicitly before running bootstrap-fixed-price.ts."); + throw new Error( + "USDC_MINT must be set explicitly before running bootstrap-fixed-price.ts." + ); } return new PublicKey(mint); } @@ -58,7 +61,10 @@ async function ensureAta(params: { ASSOCIATED_TOKEN_PROGRAM_ID ); - const info = await params.provider.connection.getAccountInfo(ata, "confirmed"); + const info = await params.provider.connection.getAccountInfo( + ata, + "confirmed" + ); if (info) return ata; const ix = createAssociatedTokenAccountIdempotentInstruction( @@ -92,6 +98,14 @@ async function main() { const program = new Program(idlJson as unknown as Idl, provider); console.log("Program:", program.programId.toBase58()); + if (process.env.TEST_BUY_USDC) { + await assertMainnetFundingAllowed({ + provider, + programId: program.programId, + action: "test buy", + }); + } + const [poolPda] = PublicKey.findProgramAddressSync( [Buffer.from(POOL_SEED)], program.programId @@ -117,7 +131,10 @@ async function main() { console.log("Admin (pool admin):", adminPubkey.toBase58()); // Initialize pool + mint if not already initialized. - const poolInfo = await provider.connection.getAccountInfo(poolPda, "confirmed"); + const poolInfo = await provider.connection.getAccountInfo( + poolPda, + "confirmed" + ); if (!poolInfo) { const priceUsdcPerToken = new BN(1_000_000); // 1 USDC per 1 token (USDC has 6 decimals) const initSig = await (program.methods as any) @@ -165,7 +182,10 @@ async function main() { }); console.log("User USDC ATA:", userUsdcAta.toBase58()); - console.log("Payout USDC vault ATA (Pool Signer):", payoutUsdcVaultAta.toBase58()); + console.log( + "Payout USDC vault ATA (Pool Signer):", + payoutUsdcVaultAta.toBase58() + ); console.log("User BunkerCash ATA:", userBunkercashAta.toBase58()); // Optional test buy (set TEST_BUY_USDC=2.5 to buy 2.5 USDC worth). diff --git a/rs/scripts/check-pool-balances.ts b/rs/scripts/check-pool-balances.ts index 6ec5d82..0211212 100644 --- a/rs/scripts/check-pool-balances.ts +++ b/rs/scripts/check-pool-balances.ts @@ -39,7 +39,9 @@ const MINT_SEED = "bunkercash_mint"; function requireUsdcMint(): PublicKey { const mint = process.env.USDC_MINT; if (!mint) { - throw new Error("USDC_MINT must be set explicitly before running check-pool-balances.ts."); + throw new Error( + "USDC_MINT must be set explicitly before running check-pool-balances.ts." + ); } return new PublicKey(mint); } @@ -49,10 +51,19 @@ async function balanceOrMissing( tokenAccount: PublicKey, label: string ): Promise { - const info = await provider.connection.getAccountInfo(tokenAccount, "confirmed"); - if (!info) return `${label}: (missing / not initialized) ${tokenAccount.toBase58()}`; - const bal = await provider.connection.getTokenAccountBalance(tokenAccount, "confirmed"); - return `${label}: ${bal.value.uiAmountString ?? bal.value.amount} (${bal.value.amount} raw) acct=${tokenAccount.toBase58()}`; + const info = await provider.connection.getAccountInfo( + tokenAccount, + "confirmed" + ); + if (!info) + return `${label}: (missing / not initialized) ${tokenAccount.toBase58()}`; + const bal = await provider.connection.getTokenAccountBalance( + tokenAccount, + "confirmed" + ); + return `${label}: ${bal.value.uiAmountString ?? bal.value.amount} (${ + bal.value.amount + } raw) acct=${tokenAccount.toBase58()}`; } async function main() { @@ -118,20 +129,45 @@ async function main() { console.log("PoolState:", { admin: (pool.masterWallet as PublicKey).toBase58(), nav: pool.nav?.toString?.() ?? String(pool.nav), - totalBrentSupply: pool.totalBrentSupply?.toString?.() ?? String(pool.totalBrentSupply), - totalPendingClaims: pool.totalPendingClaims?.toString?.() ?? String(pool.totalPendingClaims), - claimCounter: pool.claimCounter?.toString?.() ?? String(pool.claimCounter), - withdrawalCounter: pool.withdrawalCounter?.toString?.() ?? String(pool.withdrawalCounter), + totalBrentSupply: + pool.totalBrentSupply?.toString?.() ?? String(pool.totalBrentSupply), + totalPendingClaims: + pool.totalPendingClaims?.toString?.() ?? + String(pool.totalPendingClaims), + claimCounter: + pool.claimCounter?.toString?.() ?? String(pool.claimCounter), + withdrawalCounter: + pool.withdrawalCounter?.toString?.() ?? String(pool.withdrawalCounter), bump: pool.bump, }); } catch (e) { console.log("PoolState: (missing / not initialized)", (e as Error).message); } - console.log(await balanceOrMissing(provider, userUsdcAta, "User USDC (legacy)")); - console.log(await balanceOrMissing(provider, payoutUsdcVaultAta, "Payout USDC vault (legacy, Pool Signer ATA)")); - console.log(await balanceOrMissing(provider, userBunkercashAta, "User BNKR (Token-2022)")); - console.log(await balanceOrMissing(provider, escrowBunkercashVaultAta, "Escrow BNKR vault (Token-2022)")); + console.log( + await balanceOrMissing(provider, userUsdcAta, "User USDC (legacy)") + ); + console.log( + await balanceOrMissing( + provider, + payoutUsdcVaultAta, + "Payout USDC vault (legacy, Pool Signer ATA)" + ) + ); + console.log( + await balanceOrMissing( + provider, + userBunkercashAta, + "User BNKR (Token-2022)" + ) + ); + console.log( + await balanceOrMissing( + provider, + escrowBunkercashVaultAta, + "Escrow BNKR vault (Token-2022)" + ) + ); } main().catch((e) => { diff --git a/rs/scripts/create-squads-v4-multisig.ts b/rs/scripts/create-squads-v4-multisig.ts index f77e4ec..bb1c101 100644 --- a/rs/scripts/create-squads-v4-multisig.ts +++ b/rs/scripts/create-squads-v4-multisig.ts @@ -29,7 +29,10 @@ function mustPubkey(envKey: string): PublicKey { async function main() { const provider = AnchorProvider.env(); const connection: Connection = provider.connection; - const creator = provider.wallet as unknown as { publicKey: PublicKey; payer: Keypair }; + const creator = provider.wallet as unknown as { + publicKey: PublicKey; + payer: Keypair; + }; const threshold = Number(process.env.THRESHOLD ?? "2"); if (!Number.isFinite(threshold) || threshold <= 0) { @@ -37,18 +40,31 @@ async function main() { } const createKey = Keypair.generate(); - const [multisigPda] = multisig.getMultisigPda({ createKey: createKey.publicKey }); + const [multisigPda] = multisig.getMultisigPda({ + createKey: createKey.publicKey, + }); const programConfigPda = multisig.getProgramConfigPda({})[0]; - const programConfig = await multisig.accounts.ProgramConfig.fromAccountAddress(connection, programConfigPda); + const programConfig = + await multisig.accounts.ProgramConfig.fromAccountAddress( + connection, + programConfigPda + ); const members: MemberInput[] = [ { key: creator.publicKey, permissions: multisig.types.Permissions.all() }, - { key: mustPubkey("MEMBER_2_PUBKEY"), permissions: multisig.types.Permissions.all() }, + { + key: mustPubkey("MEMBER_2_PUBKEY"), + permissions: multisig.types.Permissions.all(), + }, ]; for (const k of ["MEMBER_3_PUBKEY", "MEMBER_4_PUBKEY"] as const) { const v = process.env[k]; - if (v) members.push({ key: new PublicKey(v), permissions: multisig.types.Permissions.all() }); + if (v) + members.push({ + key: new PublicKey(v), + permissions: multisig.types.Permissions.all(), + }); } const sig = await multisig.rpc.multisigCreateV2({ @@ -81,4 +97,3 @@ main().catch((e) => { console.error(e); process.exit(1); }); - diff --git a/rs/scripts/deploy-governed.ts b/rs/scripts/deploy-governed.ts new file mode 100644 index 0000000..4cafb7c --- /dev/null +++ b/rs/scripts/deploy-governed.ts @@ -0,0 +1,80 @@ +/** + * Deploys the BunkerCash program and immediately hands program upgrade authority + * to the configured Squads-controlled authority. + * + * Required: + * SQUADS_PROGRAM_UPGRADE_AUTHORITY= + */ +import * as anchor from "@coral-xyz/anchor"; +import { AnchorProvider, type Idl } from "@coral-xyz/anchor"; +import { PublicKey } from "@solana/web3.js"; +import { spawnSync } from "child_process"; +import { + getProgramUpgradeAuthority, + printUpgradeAuthorityStatus, + requireProgramUpgradeAuthorityEnv, + verifyProgramUpgradeAuthority, +} from "./governance"; + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const idlJson = require("../../ts/apps/web/lib/bunkercash.fixed.idl.json") as { + address: string; +} & Idl; + +function run(cmd: string, args: string[]) { + console.log(`\n$ ${[cmd, ...args].join(" ")}`); + const result = spawnSync(cmd, args, { stdio: "inherit" }); + if (result.error) throw result.error; + if (result.status !== 0) { + throw new Error( + `${cmd} ${args.join(" ")} failed with status ${result.status}` + ); + } +} + +async function main() { + const programId = new PublicKey(idlJson.address); + const expectedAuthority = requireProgramUpgradeAuthorityEnv(); + + const provider = AnchorProvider.env(); + anchor.setProvider(provider); + + console.log("Program ID:", programId.toBase58()); + console.log("Configured upgrade authority:", expectedAuthority.toBase58()); + + run("anchor", ["deploy"]); + + const currentAuthority = await getProgramUpgradeAuthority( + provider, + programId + ); + if (currentAuthority?.equals(expectedAuthority)) { + console.log( + "\nProgram upgrade authority already matches configured authority." + ); + } else if (currentAuthority === null) { + console.log("\nProgram is immutable; no authority transfer is possible."); + } else { + run("solana", [ + "program", + "set-upgrade-authority", + programId.toBase58(), + "--new-upgrade-authority", + expectedAuthority.toBase58(), + "--skip-new-upgrade-authority-signer-check", + ]); + } + + const status = await verifyProgramUpgradeAuthority({ + provider, + programId, + deployerWallet: provider.wallet.publicKey, + }); + printUpgradeAuthorityStatus(status); + console.log(`CLI check: solana program show ${programId.toBase58()}`); +} + +main().catch((e) => { + console.error((e as Error).message); + process.exit(1); +}); diff --git a/rs/scripts/devnet.env.example.sh b/rs/scripts/devnet.env.example.sh index 69fb0f7..a58b308 100644 --- a/rs/scripts/devnet.env.example.sh +++ b/rs/scripts/devnet.env.example.sh @@ -20,7 +20,13 @@ export USDC_MINT="${USDC_MINT:-}" # Optional: pool admin pubkey (e.g. your Phantom address). If unset, ANCHOR_WALLET becomes admin. # export ADMIN_PUBKEY="YourPhantomOrAdminBase58Address" +# Required for governed deploys and governance verification. +# This is the Squads-controlled authority for program upgrades. Confirm it separately; +# it is not automatically the same address as ADMIN_PUBKEY or the pool master wallet. +# export SQUADS_PROGRAM_UPGRADE_AUTHORITY="YourSquadsControlledProgramUpgradeAuthority" + echo "RPC=$RPC" echo "ANCHOR_WALLET=$ANCHOR_WALLET" echo "USDC_MINT=$USDC_MINT" [ -n "${ADMIN_PUBKEY:-}" ] && echo "ADMIN_PUBKEY=$ADMIN_PUBKEY" +[ -n "${SQUADS_PROGRAM_UPGRADE_AUTHORITY:-}" ] && echo "SQUADS_PROGRAM_UPGRADE_AUTHORITY=$SQUADS_PROGRAM_UPGRADE_AUTHORITY" diff --git a/rs/scripts/devnet.env.sh b/rs/scripts/devnet.env.sh index 3f02f8e..5aaff13 100644 --- a/rs/scripts/devnet.env.sh +++ b/rs/scripts/devnet.env.sh @@ -20,6 +20,11 @@ export USDC_MINT="${USDC_MINT:-}" # Optional: pool admin pubkey (e.g. your Phantom address). If unset, ANCHOR_WALLET becomes admin at bootstrap. export ADMIN_PUBKEY="2epuXd6vjC4nYUEGZw8gSFhX3J73NDP5tpDtSf1XyqnQ" +# Required for governed deploys and governance verification. +# Confirm this Squads-controlled authority separately; it is not automatically +# the same address as ADMIN_PUBKEY or the pool master wallet. +export SQUADS_PROGRAM_UPGRADE_AUTHORITY="${SQUADS_PROGRAM_UPGRADE_AUTHORITY:-HMH1Ye2VJxWHfzRHNW6hU52gnsU1xpAsYa6t2ofxUrff}" + # Program ID (devnet) – for reference; scripts read from IDL. # bRENT mint is derived from PDA seeds in the scripts; no env var needed. @@ -27,3 +32,4 @@ echo "RPC=$RPC" echo "ANCHOR_WALLET=$ANCHOR_WALLET" echo "USDC_MINT=$USDC_MINT" [ -n "${ADMIN_PUBKEY:-}" ] && echo "ADMIN_PUBKEY=$ADMIN_PUBKEY" +[ -n "${SQUADS_PROGRAM_UPGRADE_AUTHORITY:-}" ] && echo "SQUADS_PROGRAM_UPGRADE_AUTHORITY=$SQUADS_PROGRAM_UPGRADE_AUTHORITY" diff --git a/rs/scripts/e2e-buy-sell.ts b/rs/scripts/e2e-buy-sell.ts index a10aadf..037deb6 100644 --- a/rs/scripts/e2e-buy-sell.ts +++ b/rs/scripts/e2e-buy-sell.ts @@ -27,6 +27,7 @@ import { createAssociatedTokenAccountIdempotentInstruction, getAssociatedTokenAddressSync, } from "@solana/spl-token"; +import { assertMainnetFundingAllowed } from "./governance"; // eslint-disable-next-line @typescript-eslint/no-var-requires const idlJson = require("../../ts/apps/web/lib/bunkercash.fixed.idl.json") as { @@ -44,7 +45,8 @@ const BNKR_DECIMALS = 9; function uiToBaseUnits(uiAmount: string, decimals: number): BN { const s = uiAmount.trim(); if (!s) throw new Error("empty amount"); - if (!/^\d+(\.\d+)?$/.test(s)) throw new Error(`invalid amount: "${uiAmount}"`); + if (!/^\d+(\.\d+)?$/.test(s)) + throw new Error(`invalid amount: "${uiAmount}"`); const [head, tailRaw = ""] = s.split("."); const tail = tailRaw.padEnd(decimals, "0").slice(0, decimals); const raw = `${head}${tail}`.replace(/^0+/, "") || "0"; @@ -63,10 +65,7 @@ function errText(e: unknown): string { if (e && typeof e === "object") { const anyE = e as any; return ( - anyE.transactionMessage ?? - anyE.message ?? - anyE.toString?.() ?? - String(e) + anyE.transactionMessage ?? anyE.message ?? anyE.toString?.() ?? String(e) ); } return String(e); @@ -86,7 +85,9 @@ async function rpcWithBlockhashRetry( const msg = errText(e); const isBlockhash = /blockhash not found/i.test(msg); if (!isBlockhash || attempt === retries) throw e; - console.warn(`${label}: Blockhash not found, retrying (${attempt}/${retries})...`); + console.warn( + `${label}: Blockhash not found, retrying (${attempt}/${retries})...` + ); // small backoff helps devnet RPC consistency await sleep(600 * attempt); } @@ -111,7 +112,10 @@ async function ensureAta(params: { ASSOCIATED_TOKEN_PROGRAM_ID ); - const info = await params.provider.connection.getAccountInfo(ata, "confirmed"); + const info = await params.provider.connection.getAccountInfo( + ata, + "confirmed" + ); if (info) return ata; const ix = createAssociatedTokenAccountIdempotentInstruction( @@ -123,16 +127,30 @@ async function ensureAta(params: { ASSOCIATED_TOKEN_PROGRAM_ID ); const tx = new anchor.web3.Transaction().add(ix); - await anchor.web3.sendAndConfirmTransaction(params.provider.connection, tx, [params.payer], { - commitment: "confirmed", - }); + await anchor.web3.sendAndConfirmTransaction( + params.provider.connection, + tx, + [params.payer], + { + commitment: "confirmed", + } + ); return ata; } -async function tokenBalRaw(provider: AnchorProvider, tokenAccount: PublicKey): Promise { - const info = await provider.connection.getAccountInfo(tokenAccount, "confirmed"); +async function tokenBalRaw( + provider: AnchorProvider, + tokenAccount: PublicKey +): Promise { + const info = await provider.connection.getAccountInfo( + tokenAccount, + "confirmed" + ); if (!info) return null; - const bal = await provider.connection.getTokenAccountBalance(tokenAccount, "confirmed"); + const bal = await provider.connection.getTokenAccountBalance( + tokenAccount, + "confirmed" + ); return new BN(bal.value.amount); } @@ -180,8 +198,10 @@ async function printSnapshot(params: { const pool = await (program.account as any).poolState.fetch(poolPda); console.log("PoolState:", { admin: (pool.admin as PublicKey).toBase58(), - priceUsdcPerToken: pool.priceUsdcPerToken?.toString?.() ?? String(pool.priceUsdcPerToken), - claimCounter: pool.claimCounter?.toString?.() ?? String(pool.claimCounter), + priceUsdcPerToken: + pool.priceUsdcPerToken?.toString?.() ?? String(pool.priceUsdcPerToken), + claimCounter: + pool.claimCounter?.toString?.() ?? String(pool.claimCounter), bump: pool.bump, }); } catch (e) { @@ -195,22 +215,30 @@ async function printSnapshot(params: { console.log( "User USDC (legacy):", - uUsdc ? `${formatUnits(uUsdc, USDC_DECIMALS)} (${uUsdc.toString()} raw)` : "(missing)", + uUsdc + ? `${formatUnits(uUsdc, USDC_DECIMALS)} (${uUsdc.toString()} raw)` + : "(missing)", "acct=" + userUsdcAta.toBase58() ); console.log( "Payout USDC vault (legacy, Pool Signer ATA):", - pUsdc ? `${formatUnits(pUsdc, USDC_DECIMALS)} (${pUsdc.toString()} raw)` : "(missing)", + pUsdc + ? `${formatUnits(pUsdc, USDC_DECIMALS)} (${pUsdc.toString()} raw)` + : "(missing)", "acct=" + payoutUsdcVaultAta.toBase58() ); console.log( "User BNKR (Token-2022):", - uBnkr ? `${formatUnits(uBnkr, BNKR_DECIMALS)} (${uBnkr.toString()} raw)` : "(missing)", + uBnkr + ? `${formatUnits(uBnkr, BNKR_DECIMALS)} (${uBnkr.toString()} raw)` + : "(missing)", "acct=" + userBnkrAta.toBase58() ); console.log( "Escrow BNKR vault (Token-2022):", - eBnkr ? `${formatUnits(eBnkr, BNKR_DECIMALS)} (${eBnkr.toString()} raw)` : "(missing)", + eBnkr + ? `${formatUnits(eBnkr, BNKR_DECIMALS)} (${eBnkr.toString()} raw)` + : "(missing)", "acct=" + escrowBnkrVaultAta.toBase58() ); } @@ -219,8 +247,13 @@ async function main() { const provider = AnchorProvider.env(); anchor.setProvider(provider); - const payer = (provider.wallet as any).payer as anchor.web3.Keypair | undefined; - if (!payer) throw new Error("Provider wallet payer not available (need a local keypair wallet)."); + const payer = (provider.wallet as any).payer as + | anchor.web3.Keypair + | undefined; + if (!payer) + throw new Error( + "Provider wallet payer not available (need a local keypair wallet)." + ); const wallet = provider.wallet.publicKey; const program = new Program(idlJson as unknown as Idl, provider); @@ -231,7 +264,10 @@ async function main() { console.log("-", ix.name); } - const [poolPda] = PublicKey.findProgramAddressSync([Buffer.from(POOL_SEED)], program.programId); + const [poolPda] = PublicKey.findProgramAddressSync( + [Buffer.from(POOL_SEED)], + program.programId + ); const [bunkercashMintPda] = PublicKey.findProgramAddressSync( [Buffer.from(MINT_SEED)], program.programId @@ -243,12 +279,27 @@ async function main() { const usdcMintEnv = process.env.USDC_MINT; if (!usdcMintEnv) { - throw new Error("USDC_MINT must be set explicitly before running e2e-buy-sell.ts."); + throw new Error( + "USDC_MINT must be set explicitly before running e2e-buy-sell.ts." + ); } const usdcMint = new PublicKey(usdcMintEnv); + const buyUi = process.env.BUY_USDC ?? "1"; + const buyAmount = uiToBaseUnits(buyUi, USDC_DECIMALS); + + if (buyAmount.gt(new BN(0)) || process.env.LIQ_USDC) { + await assertMainnetFundingAllowed({ + provider, + programId: program.programId, + action: "funding", + }); + } // Initialize pool + mint if missing. - const poolInfo = await provider.connection.getAccountInfo(poolPda, "confirmed"); + const poolInfo = await provider.connection.getAccountInfo( + poolPda, + "confirmed" + ); if (!poolInfo) { const priceUsdcPerToken = new BN(1_000_000); // 1 USDC (6 decimals) per 1 token const initSig = await (program.methods as any) @@ -312,56 +363,56 @@ async function main() { }); // BUY - const buyUi = process.env.BUY_USDC ?? "1"; - const buyAmount = uiToBaseUnits(buyUi, USDC_DECIMALS); if (buyAmount.lte(new BN(0))) { console.log(`\nSkipping buy_primary (BUY_USDC=${buyUi})`); } else { - const userUsdcBefore = await tokenBalRaw(provider, userUsdcAta); - if (!userUsdcBefore || userUsdcBefore.lt(buyAmount)) { - console.error( - `\nInsufficient USDC for buy. Have ${userUsdcBefore ? formatUnits(userUsdcBefore, USDC_DECIMALS) : "0"} USDC, need ${buyUi} USDC.` - ); - console.error("Fund this wallet on the same cluster/mint, then re-run."); - console.error("Wallet:", wallet.toBase58()); - console.error("USDC mint:", usdcMint.toBase58()); - process.exitCode = 1; - return; - } - - const buySig = await rpcWithBlockhashRetry("buy_primary", async () => { - return await (program.methods as any) - .buyPrimary(buyAmount) - .accounts({ - pool: poolPda, - poolSigner: poolSignerPda, - bunkercashMint: bunkercashMintPda, - user: wallet, - usdcMint, - userUsdc: userUsdcAta, - payoutUsdcVault: payoutUsdcVaultAta, - userBunkercash: userBnkrAta, - usdcTokenProgram: TOKEN_PROGRAM_ID, - tokenProgram: TOKEN_2022_PROGRAM_ID, - associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, - systemProgram: SystemProgram.programId, - }) - .rpc({ commitment: "confirmed" }); - }); - console.log("\nbuy_primary tx:", buySig); + const userUsdcBefore = await tokenBalRaw(provider, userUsdcAta); + if (!userUsdcBefore || userUsdcBefore.lt(buyAmount)) { + console.error( + `\nInsufficient USDC for buy. Have ${ + userUsdcBefore ? formatUnits(userUsdcBefore, USDC_DECIMALS) : "0" + } USDC, need ${buyUi} USDC.` + ); + console.error("Fund this wallet on the same cluster/mint, then re-run."); + console.error("Wallet:", wallet.toBase58()); + console.error("USDC mint:", usdcMint.toBase58()); + process.exitCode = 1; + return; + } - await printSnapshot({ - provider, - program, - poolPda, - bunkercashMintPda, - poolSignerPda, - usdcMint, - userUsdcAta, - payoutUsdcVaultAta, - userBnkrAta, - escrowBnkrVaultAta, - }); + const buySig = await rpcWithBlockhashRetry("buy_primary", async () => { + return await (program.methods as any) + .buyPrimary(buyAmount) + .accounts({ + pool: poolPda, + poolSigner: poolSignerPda, + bunkercashMint: bunkercashMintPda, + user: wallet, + usdcMint, + userUsdc: userUsdcAta, + payoutUsdcVault: payoutUsdcVaultAta, + userBunkercash: userBnkrAta, + usdcTokenProgram: TOKEN_PROGRAM_ID, + tokenProgram: TOKEN_2022_PROGRAM_ID, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }) + .rpc({ commitment: "confirmed" }); + }); + console.log("\nbuy_primary tx:", buySig); + + await printSnapshot({ + provider, + program, + poolPda, + bunkercashMintPda, + poolSignerPda, + usdcMint, + userUsdcAta, + payoutUsdcVaultAta, + userBnkrAta, + escrowBnkrVaultAta, + }); } // SELL (register_sell escrow lock) - create multiple claims for pro-rata testing. @@ -377,30 +428,35 @@ async function main() { // Derive the Claim PDA from the latest on-chain counter. // This avoids failures if we have to retry due to blockhash/RPC hiccups. let claimPda: PublicKey | null = null; - const sellSig = await rpcWithBlockhashRetry(`register_sell(${s.label})`, async () => { - const poolState = await (program.account as any).poolState.fetch(poolPda); - const claimCounter: BN = poolState.claimCounter as BN; - const [pda] = PublicKey.findProgramAddressSync( - [Buffer.from("claim"), poolPda.toBuffer(), bnU64LE(claimCounter)], - program.programId - ); - claimPda = pda; - return await (program.methods as any) - .registerSell(s.amount) - .accounts({ - pool: poolPda, - poolSigner: poolSignerPda, - bunkercashMint: bunkercashMintPda, - claim: pda, - user: wallet, - userBunkercash: userBnkrAta, - escrowBunkercashVault: escrowBnkrVaultAta, - tokenProgram: TOKEN_2022_PROGRAM_ID, - associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, - systemProgram: SystemProgram.programId, - }) - .rpc({ commitment: "confirmed" }); - }); + const sellSig = await rpcWithBlockhashRetry( + `register_sell(${s.label})`, + async () => { + const poolState = await (program.account as any).poolState.fetch( + poolPda + ); + const claimCounter: BN = poolState.claimCounter as BN; + const [pda] = PublicKey.findProgramAddressSync( + [Buffer.from("claim"), poolPda.toBuffer(), bnU64LE(claimCounter)], + program.programId + ); + claimPda = pda; + return await (program.methods as any) + .registerSell(s.amount) + .accounts({ + pool: poolPda, + poolSigner: poolSignerPda, + bunkercashMint: bunkercashMintPda, + claim: pda, + user: wallet, + userBunkercash: userBnkrAta, + escrowBunkercashVault: escrowBnkrVaultAta, + tokenProgram: TOKEN_2022_PROGRAM_ID, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }) + .rpc({ commitment: "confirmed" }); + } + ); console.log(`\nregister_sell(${s.label}) tx:`, sellSig); if (!claimPda) throw new Error("Claim PDA was not computed."); console.log("Claim PDA:", claimPda.toBase58()); @@ -424,18 +480,21 @@ async function main() { // Admin must equal pool.admin (and program requires pool.admin == SQUADS_VAULT_PUBKEY). // Use .env SQUADS_VAULT_PUBKEY = your test wallet so e2e can sign as admin. if (process.env.LIQ_USDC) { - const poolStateForLiq = await (program.account as any).poolState.fetch(poolPda); + const poolStateForLiq = await (program.account as any).poolState.fetch( + poolPda + ); const adminForLiq = poolStateForLiq.admin as PublicKey; const liqAmount = uiToBaseUnits(process.env.LIQ_USDC, USDC_DECIMALS); // Admin's USDC ATA: if admin is e2e wallet, use userUsdcAta; else would need to pass the vault ATA. - const adminUsdcAta = - adminForLiq.equals(wallet) ? userUsdcAta : await getAssociatedTokenAddressSync( - usdcMint, - adminForLiq, - false, - TOKEN_PROGRAM_ID, - ASSOCIATED_TOKEN_PROGRAM_ID - ); + const adminUsdcAta = adminForLiq.equals(wallet) + ? userUsdcAta + : await getAssociatedTokenAddressSync( + usdcMint, + adminForLiq, + false, + TOKEN_PROGRAM_ID, + ASSOCIATED_TOKEN_PROGRAM_ID + ); const addSig = await rpcWithBlockhashRetry("add_liquidity", async () => { return await (program.methods as any) .addLiquidity(liqAmount) @@ -470,8 +529,11 @@ async function main() { "-", (c.publicKey as PublicKey).toBase58(), "user=" + (c.account.user as PublicKey).toBase58(), - "locked=" + (c.account.tokenAmountLocked?.toString?.() ?? String(c.account.tokenAmountLocked)), - "paid=" + (c.account.usdcPaid?.toString?.() ?? String(c.account.usdcPaid)) + "locked=" + + (c.account.tokenAmountLocked?.toString?.() ?? + String(c.account.tokenAmountLocked)), + "paid=" + + (c.account.usdcPaid?.toString?.() ?? String(c.account.usdcPaid)) ); } @@ -527,7 +589,9 @@ async function main() { console.log("\nClaimState:", pk.toBase58(), { id: claim.id?.toString?.() ?? String(claim.id), user: claim.user?.toBase58?.() ?? String(claim.user), - tokenAmountLocked: claim.tokenAmountLocked?.toString?.() ?? String(claim.tokenAmountLocked), + tokenAmountLocked: + claim.tokenAmountLocked?.toString?.() ?? + String(claim.tokenAmountLocked), usdcPaid: claim.usdcPaid?.toString?.() ?? String(claim.usdcPaid), isClosed: claim.isClosed, createdAt: claim.createdAt?.toString?.() ?? String(claim.createdAt), diff --git a/rs/scripts/governance.ts b/rs/scripts/governance.ts new file mode 100644 index 0000000..5fa6a53 --- /dev/null +++ b/rs/scripts/governance.ts @@ -0,0 +1,132 @@ +import { AnchorProvider } from "@coral-xyz/anchor"; +import { fetchData } from "@coral-xyz/anchor/dist/cjs/utils/registry"; +import { PublicKey } from "@solana/web3.js"; + +export const PROGRAM_UPGRADE_AUTHORITY_ENV = "SQUADS_PROGRAM_UPGRADE_AUTHORITY"; +export const ALLOW_IMMUTABLE_PROGRAM_ENV = "ALLOW_IMMUTABLE_PROGRAM"; + +export type UpgradeAuthorityStatus = { + programId: PublicKey; + upgradeAuthority: PublicKey | null; + expectedAuthority: PublicKey; + isImmutable: boolean; + isExpectedAuthority: boolean; +}; + +export function requireProgramUpgradeAuthorityEnv(): PublicKey { + const raw = process.env[PROGRAM_UPGRADE_AUTHORITY_ENV]?.trim(); + if (!raw) { + throw new Error( + `${PROGRAM_UPGRADE_AUTHORITY_ENV} must be set to the confirmed Squads-controlled program upgrade authority.` + ); + } + return new PublicKey(raw); +} + +export function allowsImmutableProgram(): boolean { + return process.env[ALLOW_IMMUTABLE_PROGRAM_ENV] === "true"; +} + +export function clusterLooksMainnet(provider: AnchorProvider): boolean { + const endpoint = provider.connection.rpcEndpoint.toLowerCase(); + return endpoint.includes("mainnet"); +} + +export async function getProgramUpgradeAuthority( + provider: AnchorProvider, + programId: PublicKey +): Promise { + const programData = await fetchData(provider.connection, programId); + return programData.upgradeAuthorityAddress; +} + +export async function verifyProgramUpgradeAuthority(params: { + provider: AnchorProvider; + programId: PublicKey; + deployerWallet?: PublicKey; +}): Promise { + const expectedAuthority = requireProgramUpgradeAuthorityEnv(); + const upgradeAuthority = await getProgramUpgradeAuthority( + params.provider, + params.programId + ); + const isImmutable = upgradeAuthority === null; + const isExpectedAuthority = + !!upgradeAuthority && upgradeAuthority.equals(expectedAuthority); + + if (isImmutable && allowsImmutableProgram()) { + return { + programId: params.programId, + upgradeAuthority, + expectedAuthority, + isImmutable, + isExpectedAuthority, + }; + } + + if (!isExpectedAuthority) { + const actual = upgradeAuthority ? upgradeAuthority.toBase58() : "none"; + const expected = expectedAuthority.toBase58(); + const deployer = params.deployerWallet?.toBase58(); + const deployerMsg = + deployer && upgradeAuthority?.equals(params.deployerWallet) + ? ` Current authority is the deployer wallet (${deployer}).` + : ""; + + throw new Error( + `Program upgrade authority is not verified. Expected ${expected}, got ${actual}.${deployerMsg}` + ); + } + + return { + programId: params.programId, + upgradeAuthority, + expectedAuthority, + isImmutable, + isExpectedAuthority, + }; +} + +export async function assertMainnetFundingAllowed(params: { + provider: AnchorProvider; + programId: PublicKey; + action: string; +}): Promise { + if (!clusterLooksMainnet(params.provider)) return; + + await verifyProgramUpgradeAuthority({ + provider: params.provider, + programId: params.programId, + deployerWallet: params.provider.wallet.publicKey, + }).catch((e) => { + throw new Error( + `Blocked mainnet ${ + params.action + }: program upgrade authority must be verified before moving funds. ${ + (e as Error).message + }` + ); + }); +} + +export function printUpgradeAuthorityStatus( + status: UpgradeAuthorityStatus +): void { + console.log("Program ID:", status.programId.toBase58()); + console.log( + "Expected upgrade authority:", + status.expectedAuthority.toBase58() + ); + console.log( + "Current upgrade authority:", + status.upgradeAuthority ? status.upgradeAuthority.toBase58() : "none" + ); + console.log( + "Status:", + status.isImmutable + ? "immutable" + : status.isExpectedAuthority + ? "verified" + : "unverified" + ); +} diff --git a/rs/scripts/init-brent-mint.ts b/rs/scripts/init-brent-mint.ts index 9951e85..0a347b4 100644 --- a/rs/scripts/init-brent-mint.ts +++ b/rs/scripts/init-brent-mint.ts @@ -2,7 +2,9 @@ import * as anchor from "@coral-xyz/anchor"; import type { Idl } from "@coral-xyz/anchor"; import { PublicKey, SystemProgram } from "@solana/web3.js"; -const idlJson = require("../target/idl/bunkercash.json") as { address: string } & Idl; +const idlJson = require("../target/idl/bunkercash.json") as { + address: string; +} & Idl; const PROGRAM_ID = new PublicKey(idlJson.address); @@ -11,13 +13,19 @@ async function main() { anchor.setProvider(provider); const program = new anchor.Program(idlJson as unknown as Idl, provider); - const [poolPda] = PublicKey.findProgramAddressSync([Buffer.from("pool")], PROGRAM_ID); + const [poolPda] = PublicKey.findProgramAddressSync( + [Buffer.from("pool")], + PROGRAM_ID + ); const [mintPda] = PublicKey.findProgramAddressSync( [Buffer.from("bunkercash_mint")], - PROGRAM_ID, + PROGRAM_ID ); - const existing = await provider.connection.getAccountInfo(mintPda, "confirmed"); + const existing = await provider.connection.getAccountInfo( + mintPda, + "confirmed" + ); if (existing) { console.log("BunkerCash mint already exists:", mintPda.toBase58()); return; @@ -29,7 +37,9 @@ async function main() { pool: poolPda, bunkercashMint: mintPda, admin: provider.wallet.publicKey, - tokenProgram: new PublicKey("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"), + tokenProgram: new PublicKey( + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" + ), systemProgram: SystemProgram.programId, }) .rpc(); diff --git a/rs/scripts/init-mint-metadata.ts b/rs/scripts/init-mint-metadata.ts index ffc89e3..04ac275 100644 --- a/rs/scripts/init-mint-metadata.ts +++ b/rs/scripts/init-mint-metadata.ts @@ -1,13 +1,21 @@ import * as anchor from "@coral-xyz/anchor"; import { AnchorProvider, Program, type Idl } from "@coral-xyz/anchor"; -import { PublicKey, SystemProgram, SYSVAR_INSTRUCTIONS_PUBKEY } from "@solana/web3.js"; +import { + PublicKey, + SystemProgram, + SYSVAR_INSTRUCTIONS_PUBKEY, +} from "@solana/web3.js"; let idlJson: { address: string } & Idl; try { // eslint-disable-next-line @typescript-eslint/no-var-requires - idlJson = require("../target/idl/bunkercash.json") as { address: string } & Idl; + idlJson = require("../target/idl/bunkercash.json") as { + address: string; + } & Idl; } catch (e) { - console.error("Failed to load target/idl/bunkercash.json. Run 'anchor build' first."); + console.error( + "Failed to load target/idl/bunkercash.json. Run 'anchor build' first." + ); throw e; } @@ -70,7 +78,9 @@ async function main() { admin: provider.wallet.publicKey, metadata: metadataPda, tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, - tokenProgram: new PublicKey("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"), + tokenProgram: new PublicKey( + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" + ), systemProgram: SystemProgram.programId, sysvarInstructions: SYSVAR_INSTRUCTIONS_PUBKEY, }) diff --git a/rs/scripts/init-pool.ts b/rs/scripts/init-pool.ts index 4327059..ff9ea2a 100644 --- a/rs/scripts/init-pool.ts +++ b/rs/scripts/init-pool.ts @@ -6,7 +6,9 @@ import { getAssociatedTokenAddressSync, } from "@solana/spl-token"; -const idlJson = require("../target/idl/bunkercash.json") as { address: string } & Idl; +const idlJson = require("../target/idl/bunkercash.json") as { + address: string; +} & Idl; const PROGRAM_ID = new PublicKey(idlJson.address); const PURCHASE_LIMIT_SEED = Buffer.from("purchase_limit"); @@ -24,7 +26,9 @@ const SKIP_EXISTENCE_CHECK = process.env.SKIP_EXISTENCE_CHECK === "true"; function requireUsdcMint(): PublicKey { const mint = process.env.USDC_MINT; if (!mint) { - throw new Error("USDC_MINT must be set explicitly before running init-pool.ts."); + throw new Error( + "USDC_MINT must be set explicitly before running init-pool.ts." + ); } return new PublicKey(mint); } @@ -38,13 +42,19 @@ async function main() { const bootstrapAuthority = provider.wallet.publicKey; let usdcTokenProgram = USDC_TOKEN_PROGRAM; if (!usdcTokenProgram) { - const mintInfo = await provider.connection.getAccountInfo(usdcMint, "confirmed"); + const mintInfo = await provider.connection.getAccountInfo( + usdcMint, + "confirmed" + ); usdcTokenProgram = mintInfo?.owner ?? null; } if (!usdcTokenProgram) { throw new Error(`Unable to load mint owner for ${usdcMint.toBase58()}`); } - const [poolPda] = PublicKey.findProgramAddressSync([Buffer.from("pool")], PROGRAM_ID); + const [poolPda] = PublicKey.findProgramAddressSync( + [Buffer.from("pool")], + PROGRAM_ID + ); const [supportedUsdcConfigPda] = PublicKey.findProgramAddressSync( [SUPPORTED_USDC_CONFIG_SEED], PROGRAM_ID @@ -58,11 +68,14 @@ async function main() { poolPda, true, usdcTokenProgram, - ASSOCIATED_TOKEN_PROGRAM_ID, + ASSOCIATED_TOKEN_PROGRAM_ID ); if (!SKIP_EXISTENCE_CHECK) { - const existing = await provider.connection.getAccountInfo(poolPda, "confirmed"); + const existing = await provider.connection.getAccountInfo( + poolPda, + "confirmed" + ); if (existing) { console.log("Pool already exists:", poolPda.toBase58()); return; diff --git a/rs/scripts/inspect-open-claims.ts b/rs/scripts/inspect-open-claims.ts index 0dbbfa1..2f4e423 100644 --- a/rs/scripts/inspect-open-claims.ts +++ b/rs/scripts/inspect-open-claims.ts @@ -30,11 +30,15 @@ async function main() { pubkey: (x.publicKey as PublicKey).toBase58(), user: (x.account.user as PublicKey).toBase58(), id: x.account.id?.toString?.() ?? String(x.account.id), - locked: x.account.tokenAmountLocked?.toString?.() ?? String(x.account.tokenAmountLocked), + locked: + x.account.tokenAmountLocked?.toString?.() ?? + String(x.account.tokenAmountLocked), paid: x.account.usdcPaid?.toString?.() ?? String(x.account.usdcPaid), })); - normalized.sort((a: any, b: any) => BigInt(b.locked) > BigInt(a.locked) ? 1 : -1); + normalized.sort((a: any, b: any) => + BigInt(b.locked) > BigInt(a.locked) ? 1 : -1 + ); const topN = Number(process.env.TOP_N ?? "10"); console.log("Cluster:", provider.connection.rpcEndpoint); @@ -52,4 +56,3 @@ main().catch((e) => { console.error(e); process.exit(1); }); - diff --git a/rs/scripts/migrate-accounts.ts b/rs/scripts/migrate-accounts.ts index bdd774e..31e7723 100644 --- a/rs/scripts/migrate-accounts.ts +++ b/rs/scripts/migrate-accounts.ts @@ -17,7 +17,9 @@ import * as anchor from "@coral-xyz/anchor"; import type { Idl } from "@coral-xyz/anchor"; import { PublicKey, SystemProgram } from "@solana/web3.js"; -const idlJson = require("../target/idl/bunkercash.json") as { address: string } & Idl; +const idlJson = require("../target/idl/bunkercash.json") as { + address: string; +} & Idl; const PROGRAM_ID = new PublicKey(idlJson.address); const POOL_SEED = Buffer.from("pool"); @@ -48,7 +50,10 @@ async function main() { console.log(`Wallet: ${wallet.toBase58()}`); if (DRY_RUN) console.log("DRY_RUN=true — no transactions will be sent"); - const settlementInfo = await connection.getAccountInfo(settlementPda, "confirmed"); + const settlementInfo = await connection.getAccountInfo( + settlementPda, + "confirmed" + ); if (settlementInfo && settlementInfo.data.length > 0) { throw new Error( "A settlement epoch is open; close it before migrating accounts. " + @@ -64,7 +69,9 @@ async function main() { if (poolInfo.data.length === CURRENT_POOL_SIZE) { console.log("Pool already uses the current layout."); } else if (poolInfo.data.length === LEGACY_POOL_SIZE) { - console.log(`Pool uses legacy layout (${poolInfo.data.length} bytes); migrating...`); + console.log( + `Pool uses legacy layout (${poolInfo.data.length} bytes); migrating...` + ); if (!DRY_RUN) { const sig = await program.methods .migratePool() @@ -91,7 +98,9 @@ async function main() { commitment: "confirmed", filters: [{ dataSize }], }); - console.log(`Found ${legacyClaims.length} claim account(s) with legacy size ${dataSize}.`); + console.log( + `Found ${legacyClaims.length} claim account(s) with legacy size ${dataSize}.` + ); for (const { pubkey } of legacyClaims) { if (DRY_RUN) { diff --git a/rs/scripts/register-sell-escrow.ts b/rs/scripts/register-sell-escrow.ts index da60df1..941a31b 100644 --- a/rs/scripts/register-sell-escrow.ts +++ b/rs/scripts/register-sell-escrow.ts @@ -64,7 +64,9 @@ async function main() { const tokenAmountStr = process.env.SELL_TOKEN_AMOUNT ?? "0"; const tokenAmount = new BN(tokenAmountStr); if (tokenAmount.lte(new BN(0))) { - throw new Error("Set SELL_TOKEN_AMOUNT to a positive integer (base units, 9 decimals)."); + throw new Error( + "Set SELL_TOKEN_AMOUNT to a positive integer (base units, 9 decimals)." + ); } // Token-2022 ATAs @@ -93,8 +95,12 @@ async function main() { program.programId ); - const beforeUser = await provider.connection.getTokenAccountBalance(userBunkercashAta, "confirmed").catch(() => null); - const beforeEscrow = await provider.connection.getTokenAccountBalance(escrowVaultAta, "confirmed").catch(() => null); + const beforeUser = await provider.connection + .getTokenAccountBalance(userBunkercashAta, "confirmed") + .catch(() => null); + const beforeEscrow = await provider.connection + .getTokenAccountBalance(escrowVaultAta, "confirmed") + .catch(() => null); console.log("Pool:", poolPda.toBase58()); console.log("Pool signer:", poolSignerPda.toBase58()); @@ -122,8 +128,12 @@ async function main() { console.log("register_sell tx:", sig); - const afterUser = await provider.connection.getTokenAccountBalance(userBunkercashAta, "confirmed").catch(() => null); - const afterEscrow = await provider.connection.getTokenAccountBalance(escrowVaultAta, "confirmed").catch(() => null); + const afterUser = await provider.connection + .getTokenAccountBalance(userBunkercashAta, "confirmed") + .catch(() => null); + const afterEscrow = await provider.connection + .getTokenAccountBalance(escrowVaultAta, "confirmed") + .catch(() => null); const bu = beforeUser ? new BN(beforeUser.value.amount) : new BN(0); const be = beforeEscrow ? new BN(beforeEscrow.value.amount) : new BN(0); @@ -131,13 +141,19 @@ async function main() { const ae = afterEscrow ? new BN(afterEscrow.value.amount) : new BN(0); console.log("User balance before/after:", bu.toString(), "→", au.toString()); - console.log("Escrow balance before/after:", be.toString(), "→", ae.toString()); + console.log( + "Escrow balance before/after:", + be.toString(), + "→", + ae.toString() + ); const claim = await (program.account as any).claimState.fetch(claimPda); console.log("ClaimState:", { id: claim.id?.toString?.() ?? String(claim.id), user: claim.user?.toBase58?.() ?? String(claim.user), - tokenAmountLocked: claim.tokenAmountLocked?.toString?.() ?? String(claim.tokenAmountLocked), + tokenAmountLocked: + claim.tokenAmountLocked?.toString?.() ?? String(claim.tokenAmountLocked), usdcPaid: claim.usdcPaid?.toString?.() ?? String(claim.usdcPaid), isClosed: claim.isClosed, createdAt: claim.createdAt?.toString?.() ?? String(claim.createdAt), diff --git a/rs/scripts/require-program-upgrade-authority.ts b/rs/scripts/require-program-upgrade-authority.ts new file mode 100644 index 0000000..6fd4ce1 --- /dev/null +++ b/rs/scripts/require-program-upgrade-authority.ts @@ -0,0 +1,13 @@ +import { requireProgramUpgradeAuthorityEnv } from "./governance"; + +function main() { + const authority = requireProgramUpgradeAuthorityEnv(); + console.log("Program upgrade authority configured:", authority.toBase58()); +} + +try { + main(); +} catch (e) { + console.error((e as Error).message); + process.exit(1); +} diff --git a/rs/scripts/update-mint-metadata.ts b/rs/scripts/update-mint-metadata.ts index 1fbcb84..dedf3c1 100644 --- a/rs/scripts/update-mint-metadata.ts +++ b/rs/scripts/update-mint-metadata.ts @@ -2,13 +2,16 @@ import * as anchor from "@coral-xyz/anchor"; import { AnchorProvider, Program, type Idl } from "@coral-xyz/anchor"; import { PublicKey } from "@solana/web3.js"; - let idlJson: { address: string } & Idl; try { // eslint-disable-next-line @typescript-eslint/no-var-requires - idlJson = require("../target/idl/bunkercash.json") as { address: string } & Idl; + idlJson = require("../target/idl/bunkercash.json") as { + address: string; + } & Idl; } catch (e) { - console.error("Failed to load target/idl/bunkercash.json. Run 'anchor build' first."); + console.error( + "Failed to load target/idl/bunkercash.json. Run 'anchor build' first." + ); throw e; } const PROGRAM_ID = new PublicKey(idlJson.address); diff --git a/rs/scripts/update-price.ts b/rs/scripts/update-price.ts index e3c266c..764d39b 100644 --- a/rs/scripts/update-price.ts +++ b/rs/scripts/update-price.ts @@ -46,4 +46,3 @@ main() console.error(e); process.exit(1); }); - diff --git a/rs/scripts/verify-program-upgrade-authority.ts b/rs/scripts/verify-program-upgrade-authority.ts new file mode 100644 index 0000000..afae3e1 --- /dev/null +++ b/rs/scripts/verify-program-upgrade-authority.ts @@ -0,0 +1,42 @@ +/** + * Verifies the Solana upgrade authority for the deployed BunkerCash program. + * + * Run: + * cd rs + * export ANCHOR_PROVIDER_URL=https://api.devnet.solana.com + * export ANCHOR_WALLET=~/.config/solana/id.json + * export SQUADS_PROGRAM_UPGRADE_AUTHORITY= + * npx ts-node -P tsconfig.json scripts/verify-program-upgrade-authority.ts + */ +import * as anchor from "@coral-xyz/anchor"; +import { AnchorProvider, type Idl } from "@coral-xyz/anchor"; +import { PublicKey } from "@solana/web3.js"; +import { + printUpgradeAuthorityStatus, + verifyProgramUpgradeAuthority, +} from "./governance"; + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const idlJson = require("../../ts/apps/web/lib/bunkercash.fixed.idl.json") as { + address: string; +} & Idl; + +async function main() { + const provider = AnchorProvider.env(); + anchor.setProvider(provider); + + const programId = new PublicKey(idlJson.address); + const status = await verifyProgramUpgradeAuthority({ + provider, + programId, + deployerWallet: provider.wallet.publicKey, + }); + + printUpgradeAuthorityStatus(status); + console.log(`CLI check: solana program show ${programId.toBase58()}`); +} + +main().catch((e) => { + console.error((e as Error).message); + process.exit(1); +}); diff --git a/rs/scripts/verify-squads-setup.ts b/rs/scripts/verify-squads-setup.ts index 88888ff..9bb6c74 100644 --- a/rs/scripts/verify-squads-setup.ts +++ b/rs/scripts/verify-squads-setup.ts @@ -6,177 +6,318 @@ * 2. Squads multisig account (members, threshold, txIndex) * 3. Vault PDA derivation * 4. Whether vault PDA matches pool.admin - * 5. USDC balances (vault ATA, payout vault) + * 5. Program upgrade authority + * 6. USDC balances (vault ATA, payout vault) * * Run: * cd rs * export ANCHOR_PROVIDER_URL=https://api.devnet.solana.com * export ANCHOR_WALLET=~/.config/solana/id.json * export SQUADS_MULTISIG_PUBKEY= + * export SQUADS_PROGRAM_UPGRADE_AUTHORITY= * export USDC_MINT=4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU * npx ts-node -P tsconfig.json scripts/verify-squads-setup.ts */ -import { AnchorProvider, Program, type Idl } from "@coral-xyz/anchor" -import * as anchor from "@coral-xyz/anchor" -import { PublicKey } from "@solana/web3.js" -import * as multisig from "@sqds/multisig" +import { AnchorProvider, Program, type Idl } from "@coral-xyz/anchor"; +import * as anchor from "@coral-xyz/anchor"; +import { PublicKey } from "@solana/web3.js"; +import * as multisig from "@sqds/multisig"; import { getAssociatedTokenAddressSync, TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID, -} from "@solana/spl-token" +} from "@solana/spl-token"; +import { + printUpgradeAuthorityStatus, + verifyProgramUpgradeAuthority, +} from "./governance"; const idlJson = require("../../ts/apps/web/lib/bunkercash.fixed.idl.json") as { - address: string -} & Idl + address: string; +} & Idl; + +const POOL_SEED = "bunkercash_pool"; +const LEGACY_POOL_SEED = "pool"; +const POOL_SIGNER_SEED = "bunkercash_pool_signer"; + +function ok(msg: string) { + console.log(" ✅", msg); +} +function warn(msg: string) { + console.log(" ⚠️ ", msg); +} +function err(msg: string) { + console.log(" ❌", msg); +} +function section(title: string) { + console.log(`\n── ${title} ${"─".repeat(50 - title.length)}`); +} -const POOL_SEED = "bunkercash_pool" -const POOL_SIGNER_SEED = "bunkercash_pool_signer" +async function fetchPoolGovernance(program: Program): Promise<{ + pool: any; + poolPda: PublicKey; + poolSignerPda: PublicKey; + poolAdmin: PublicKey; +}> { + const connection = (program.provider as AnchorProvider).connection; + const [fixedPoolPda] = PublicKey.findProgramAddressSync( + [Buffer.from(POOL_SEED)], + program.programId + ); + const [fixedPoolSignerPda] = PublicKey.findProgramAddressSync( + [Buffer.from(POOL_SIGNER_SEED), fixedPoolPda.toBuffer()], + program.programId + ); + if ((program.account as any).poolState) { + try { + const pool = await (program.account as any).poolState.fetch(fixedPoolPda); + return { + pool, + poolPda: fixedPoolPda, + poolSignerPda: fixedPoolSignerPda, + poolAdmin: pool.admin as PublicKey, + }; + } catch { + const info = await connection.getAccountInfo(fixedPoolPda, "confirmed"); + if (info && info.data.length >= 40) { + return { + pool: {}, + poolPda: fixedPoolPda, + poolSignerPda: fixedPoolSignerPda, + poolAdmin: new PublicKey(info.data.subarray(8, 40)), + }; + } + } + } -function ok(msg: string) { console.log(" ✅", msg) } -function warn(msg: string) { console.log(" ⚠️ ", msg) } -function err(msg: string) { console.log(" ❌", msg) } -function section(title: string) { console.log(`\n── ${title} ${"─".repeat(50 - title.length)}`) } + const [legacyPoolPda] = PublicKey.findProgramAddressSync( + [Buffer.from(LEGACY_POOL_SEED)], + program.programId + ); + if ((program.account as any).pool) { + try { + const pool = await (program.account as any).pool.fetch(legacyPoolPda); + return { + pool, + poolPda: legacyPoolPda, + poolSignerPda: legacyPoolPda, + poolAdmin: pool.masterWallet as PublicKey, + }; + } catch { + const info = await connection.getAccountInfo(legacyPoolPda, "confirmed"); + if (info && info.data.length >= 40) { + return { + pool: {}, + poolPda: legacyPoolPda, + poolSignerPda: legacyPoolPda, + poolAdmin: new PublicKey(info.data.subarray(8, 40)), + }; + } + } + } + + throw new Error("IDL does not expose poolState or pool account clients"); +} async function main() { - const provider = AnchorProvider.env() - anchor.setProvider(provider) - const connection = provider.connection - const program = new Program(idlJson as unknown as Idl, provider) + const provider = AnchorProvider.env(); + anchor.setProvider(provider); + const connection = provider.connection; + const program = new Program(idlJson as unknown as Idl, provider); - console.log("Cluster :", connection.rpcEndpoint) - console.log("Wallet :", provider.wallet.publicKey.toBase58()) + console.log("Cluster :", connection.rpcEndpoint); + console.log("Wallet :", provider.wallet.publicKey.toBase58()); // ── 1. Pool state ────────────────────────────────────────────────────────── - section("Pool state") - const [poolPda] = PublicKey.findProgramAddressSync( - [Buffer.from(POOL_SEED)], - program.programId, - ) - const [poolSignerPda] = PublicKey.findProgramAddressSync( - [Buffer.from(POOL_SIGNER_SEED), poolPda.toBuffer()], - program.programId, - ) - - let poolAdmin: PublicKey | null = null + section("Pool state"); + let poolAdmin: PublicKey | null = null; + let poolSignerPda: PublicKey | null = null; try { - const pool = await (program.account as any).poolState.fetch(poolPda) - poolAdmin = pool.admin as PublicKey - console.log(" Pool PDA :", poolPda.toBase58()) - console.log(" Pool admin :", poolAdmin.toBase58()) - console.log(" Pool signer:", poolSignerPda.toBase58()) - console.log(" Price :", pool.priceUsdcPerToken.toString(), "USDC-base / token") - console.log(" Claims :", pool.claimCounter.toString()) + const poolGovernance = await fetchPoolGovernance(program); + const pool = poolGovernance.pool; + poolAdmin = poolGovernance.poolAdmin; + poolSignerPda = poolGovernance.poolSignerPda; + console.log(" Pool PDA :", poolGovernance.poolPda.toBase58()); + console.log(" Pool admin :", poolAdmin.toBase58()); + console.log(" Pool signer:", poolSignerPda.toBase58()); + if (pool.priceUsdcPerToken) { + console.log( + " Price :", + pool.priceUsdcPerToken.toString(), + "USDC-base / token" + ); + } + if (pool.claimCounter) { + console.log(" Claims :", pool.claimCounter.toString()); + } } catch (e) { - err(`Could not fetch pool state: ${(e as Error).message}`) - return + err(`Could not fetch pool state: ${(e as Error).message}`); + process.exitCode = 1; + return; } // ── 2. Squads multisig ──────────────────────────────────────────────────── - section("Squads V4 multisig") - const multisigPdaStr = process.env.SQUADS_MULTISIG_PUBKEY + section("Squads V4 multisig"); + const multisigPdaStr = process.env.SQUADS_MULTISIG_PUBKEY; if (!multisigPdaStr) { - err("SQUADS_MULTISIG_PUBKEY env var is not set — export it and re-run") - return + err("SQUADS_MULTISIG_PUBKEY env var is not set — export it and re-run"); + process.exitCode = 1; + return; } - let multisigPda: PublicKey + let multisigPda: PublicKey; try { - multisigPda = new PublicKey(multisigPdaStr) + multisigPda = new PublicKey(multisigPdaStr); } catch { - err(`Invalid SQUADS_MULTISIG_PUBKEY: ${multisigPdaStr}`) - return + err(`Invalid SQUADS_MULTISIG_PUBKEY: ${multisigPdaStr}`); + process.exitCode = 1; + return; } - console.log(" Multisig PDA:", multisigPda.toBase58()) + console.log(" Multisig PDA:", multisigPda.toBase58()); - let ms: Awaited> + let ms: Awaited< + ReturnType + >; try { - ms = await multisig.accounts.Multisig.fromAccountAddress(connection, multisigPda) - ok("Multisig account exists on-chain") + ms = await multisig.accounts.Multisig.fromAccountAddress( + connection, + multisigPda + ); + ok("Multisig account exists on-chain"); } catch (e) { - err(`Multisig account NOT found on devnet: ${(e as Error).message}`) - err("Run: npx ts-node scripts/create-squads-v4-multisig.ts") - return + err(`Multisig account NOT found on devnet: ${(e as Error).message}`); + err("Run: npx ts-node scripts/create-squads-v4-multisig.ts"); + process.exitCode = 1; + return; } - console.log(" Threshold :", ms.threshold) - console.log(" Tx index :", ms.transactionIndex.toString()) - console.log(" Members :") + console.log(" Threshold :", ms.threshold); + console.log(" Tx index :", ms.transactionIndex.toString()); + console.log(" Members :"); ms.members.forEach((m, i) => { - console.log(` [${i}] ${m.key.toBase58()} mask=${m.permissions.mask}`) - }) + console.log(` [${i}] ${m.key.toBase58()} mask=${m.permissions.mask}`); + }); // ── 3. Vault PDA ────────────────────────────────────────────────────────── - section("Vault PDA") - const [vaultPda] = multisig.getVaultPda({ multisigPda, index: 0 }) - console.log(" Vault PDA (index 0):", vaultPda.toBase58()) + section("Vault PDA"); + const [vaultPda] = multisig.getVaultPda({ multisigPda, index: 0 }); + console.log(" Vault PDA (index 0):", vaultPda.toBase58()); if (poolAdmin && poolAdmin.equals(vaultPda)) { - ok("pool.admin === vault PDA ← governance is active") + ok("pool.admin === vault PDA ← governance is active"); } else if (poolAdmin) { - warn(`pool.admin (${poolAdmin.toBase58()}) does NOT match vault PDA`) - warn("Run: export NEW_ADMIN_PUBKEY=" + vaultPda.toBase58()) - warn(" npx ts-node scripts/update-admin.ts") + warn(`pool.admin (${poolAdmin.toBase58()}) does NOT match vault PDA`); + warn("Run: export NEW_ADMIN_PUBKEY=" + vaultPda.toBase58()); + warn(" npx ts-node scripts/update-admin.ts"); } // ── 4. Wallet membership ────────────────────────────────────────────────── - section("Wallet membership") - const walletPk = provider.wallet.publicKey - const isMember = ms.members.some((m) => m.key.equals(walletPk)) + section("Wallet membership"); + const walletPk = provider.wallet.publicKey; + const isMember = ms.members.some((m) => m.key.equals(walletPk)); if (isMember) { - ok(`${walletPk.toBase58()} IS a member`) + ok(`${walletPk.toBase58()} IS a member`); } else { - err(`${walletPk.toBase58()} is NOT a member of this multisig`) - err("You need to connect a member wallet in the browser to propose transactions") + err(`${walletPk.toBase58()} is NOT a member of this multisig`); + err( + "You need to connect a member wallet in the browser to propose transactions" + ); } - // ── 5. USDC balances ────────────────────────────────────────────────────── - section("USDC balances") - const usdcMintStr = process.env.USDC_MINT - if (!usdcMintStr) { - warn("USDC_MINT env var not set — skipping balance check") - return + // ── 5. Program upgrade authority ────────────────────────────────────────── + section("Program upgrade authority"); + let upgradeAuthorityOk = false; + try { + const status = await verifyProgramUpgradeAuthority({ + provider, + programId: program.programId, + deployerWallet: provider.wallet.publicKey, + }); + printUpgradeAuthorityStatus(status); + ok("program upgrade authority is verified"); + console.log(" CLI check:"); + console.log(" solana program show " + program.programId.toBase58()); + upgradeAuthorityOk = true; + } catch (e) { + err((e as Error).message); + err("Do not bootstrap or fund mainnet until this passes"); } - const usdcMint = new PublicKey(usdcMintStr) - console.log(" USDC mint:", usdcMint.toBase58()) - - // Both vaultPda and poolSignerPda are PDAs (off-curve), so allowOwnerOffCurve=true - const vaultUsdcAta = getAssociatedTokenAddressSync( - usdcMint, vaultPda, true, TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID, - ) - const payoutVaultAta = getAssociatedTokenAddressSync( - usdcMint, poolSignerPda, true, TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID, - ) - - for (const [label, ata] of [ - ["Vault USDC ATA (source for deposits)", vaultUsdcAta], - ["Payout vault ATA (source for claims) ", payoutVaultAta], - ] as [string, PublicKey][]) { - const info = await connection.getAccountInfo(ata, "confirmed") - if (!info) { - warn(`${label}: NOT INITIALIZED ${ata.toBase58()}`) - warn(" → This ATA needs tokens before executing (not just proposing)") - } else { - const bal = await connection.getTokenAccountBalance(ata, "confirmed") - const ui = bal.value.uiAmountString ?? bal.value.amount - const icon = Number(bal.value.amount) > 0 ? "✅" : "⚠️ " - console.log(` ${icon} ${label}: ${ui} USDC ${ata.toBase58()}`) + + // ── 6. USDC balances ────────────────────────────────────────────────────── + section("USDC balances"); + const usdcMintStr = process.env.USDC_MINT; + let vaultUsdcAta: PublicKey | null = null; + if (!usdcMintStr) { + warn("USDC_MINT env var not set — skipping balance check"); + } else { + const usdcMint = new PublicKey(usdcMintStr); + console.log(" USDC mint:", usdcMint.toBase58()); + + // Both vaultPda and poolSignerPda are PDAs (off-curve), so allowOwnerOffCurve=true + vaultUsdcAta = getAssociatedTokenAddressSync( + usdcMint, + vaultPda, + true, + TOKEN_PROGRAM_ID, + ASSOCIATED_TOKEN_PROGRAM_ID + ); + const payoutVaultAta = getAssociatedTokenAddressSync( + usdcMint, + poolSignerPda!, + true, + TOKEN_PROGRAM_ID, + ASSOCIATED_TOKEN_PROGRAM_ID + ); + + for (const [label, ata] of [ + ["Vault USDC ATA (source for deposits)", vaultUsdcAta], + ["Payout vault ATA (source for claims) ", payoutVaultAta], + ] as [string, PublicKey][]) { + const info = await connection.getAccountInfo(ata, "confirmed"); + if (!info) { + warn(`${label}: NOT INITIALIZED ${ata.toBase58()}`); + warn(" → This ATA needs tokens before executing (not just proposing)"); + } else { + const bal = await connection.getTokenAccountBalance(ata, "confirmed"); + const ui = bal.value.uiAmountString ?? bal.value.amount; + const icon = Number(bal.value.amount) > 0 ? "✅" : "⚠️ "; + console.log(` ${icon} ${label}: ${ui} USDC ${ata.toBase58()}`); + } } } // ── Summary ──────────────────────────────────────────────────────────────── - section("Summary") - const allGood = poolAdmin?.equals(vaultPda) && isMember + section("Summary"); + const allGood = poolAdmin?.equals(vaultPda) && isMember && upgradeAuthorityOk; if (allGood) { - ok("Setup looks correct — you can propose transactions from the admin panel") - console.log("\n Squads app URL:") - console.log(" https://devnet.squads.so/multisig/" + multisigPda.toBase58()) - console.log("\n To fund the vault USDC ATA (needed for execution):") - console.log(" spl-token transfer " + vaultUsdcAta.toBase58() + " --url devnet --fund-recipient") + ok( + "Setup looks correct — you can propose transactions from the admin panel" + ); + console.log("\n Squads app URL:"); + console.log( + " https://devnet.squads.so/multisig/" + multisigPda.toBase58() + ); + if (vaultUsdcAta) { + console.log("\n To fund the vault USDC ATA (needed for execution):"); + console.log( + " spl-token transfer " + + vaultUsdcAta.toBase58() + + " --url devnet --fund-recipient" + ); + } } else { - warn("Fix the issues above, then re-run this script") + warn("Fix the issues above, then re-run this script"); + if (vaultUsdcAta && !upgradeAuthorityOk) { + warn( + "Funding command withheld until program upgrade authority is verified" + ); + } + process.exitCode = 1; } } -main().catch((e) => { console.error(e); process.exit(1) }) +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/rs/tests/bunkercash.ts b/rs/tests/bunkercash.ts index 0ce1cf3..67811d8 100644 --- a/rs/tests/bunkercash.ts +++ b/rs/tests/bunkercash.ts @@ -8,15 +8,22 @@ * cd rs && anchor test * * Or run only this file: - * cd rs && yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/bunkercash.ts + * cd rs && npx ts-mocha -p ./tsconfig.json -t 1000000 tests/bunkercash.ts * - * Requires: ANCHOR_PROVIDER_URL, ANCHOR_WALLET (keypair with SOL on devnet). + * Localnet creates a temporary 6-decimal test mint when USDC_MINT is omitted. + * Non-local clusters require USDC_MINT to be set explicitly. */ import * as anchor from "@coral-xyz/anchor"; import type { Idl } from "@coral-xyz/anchor"; -import { PublicKey, SystemProgram } from "@solana/web3.js"; +import { + Keypair, + LAMPORTS_PER_SOL, + PublicKey, + SystemProgram, +} from "@solana/web3.js"; import { ASSOCIATED_TOKEN_PROGRAM_ID, + createMint, getAssociatedTokenAddressSync, } from "@solana/spl-token"; import { createRequire } from "node:module"; @@ -32,12 +39,78 @@ const POOL_SEED = "pool"; const PURCHASE_LIMIT_SEED = "purchase_limit"; const SUPPORTED_USDC_CONFIG_SEED = "supported_usdc_config"; -function requireUsdcMint(): PublicKey { +type ProgramMethod = { + accounts(accounts: Record): { + rpc(): Promise; + }; +}; +type ProgramMethods = Record ProgramMethod>; + +function isLocalProviderUrl(rpcEndpoint: string): boolean { + return rpcEndpoint.includes("127.0.0.1") || rpcEndpoint.includes("localhost"); +} + +async function confirmAirdrop( + connection: anchor.web3.Connection, + signature: string +) { + const latestBlockhash = await connection.getLatestBlockhash("confirmed"); + await connection.confirmTransaction( + { + signature, + ...latestBlockhash, + }, + "confirmed" + ); +} + +function sleep(ms: number): Promise { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +} + +async function getAccountInfoWithRetry( + connection: anchor.web3.Connection, + pubkey: PublicKey +) { + for (let attempt = 0; attempt < 20; attempt += 1) { + const accountInfo = + (await connection.getAccountInfo(pubkey, "confirmed")) ?? + (await connection.getAccountInfo(pubkey, "processed")); + if (accountInfo) { + return accountInfo; + } + await sleep(100); + } + + return null; +} + +async function resolveUsdcMint( + provider: anchor.AnchorProvider +): Promise { const mint = process.env.USDC_MINT; - if (!mint) { - throw new Error("USDC_MINT must be set explicitly for this test run."); + if (mint) { + return new PublicKey(mint); + } + + if (!isLocalProviderUrl(provider.connection.rpcEndpoint)) { + throw new Error( + "USDC_MINT must be set explicitly for non-local test runs." + ); } - return new PublicKey(mint); + + const payer = Keypair.generate(); + await confirmAirdrop( + provider.connection, + await provider.connection.requestAirdrop( + payer.publicKey, + 2 * LAMPORTS_PER_SOL + ) + ); + + return createMint(provider.connection, payer, payer.publicKey, null, 6); } describe("bunkercash", () => { @@ -45,11 +118,19 @@ describe("bunkercash", () => { anchor.setProvider(provider); const program = new anchor.Program(idlJson as unknown as Idl, provider); + const methods = program.methods as unknown as ProgramMethods; const wallet = provider.wallet.publicKey; - const usdcMint = requireUsdcMint(); + let usdcMint: PublicKey; - it("initializes the pool (or skips if already initialized)", async () => { - const mintInfo = await provider.connection.getAccountInfo(usdcMint, "confirmed"); + before(async () => { + usdcMint = await resolveUsdcMint(provider); + }); + + it("rejects unauthorized pool initialization (or skips if already initialized)", async () => { + const mintInfo = await getAccountInfoWithRetry( + provider.connection, + usdcMint + ); const usdcTokenProgram = mintInfo?.owner; if (!usdcTokenProgram) { throw new Error(`Unable to load mint owner for ${usdcMint.toBase58()}`); @@ -74,24 +155,36 @@ describe("bunkercash", () => { ASSOCIATED_TOKEN_PROGRAM_ID ); - const poolInfo = await provider.connection.getAccountInfo(poolPda, "confirmed"); + const poolInfo = await provider.connection.getAccountInfo( + poolPda, + "confirmed" + ); if (!poolInfo) { - const tx = await (program.methods as any) - .initialize(wallet) - .accounts({ - pool: poolPda, - usdcMint, - poolUsdc, - supportedUsdcConfig: supportedUsdcConfigPda, - purchaseLimitConfig: purchaseLimitConfigPda, - bootstrapAuthority: wallet, - payer: wallet, - usdcTokenProgram, - associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, - systemProgram: SystemProgram.programId, - }) - .rpc(); - console.log("initialize tx:", tx); + try { + await methods + .initialize(wallet) + .accounts({ + pool: poolPda, + usdcMint, + poolUsdc, + supportedUsdcConfig: supportedUsdcConfigPda, + purchaseLimitConfig: purchaseLimitConfigPda, + bootstrapAuthority: wallet, + payer: wallet, + usdcTokenProgram, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }) + .rpc(); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + if (message.includes("Unauthorized")) { + return; + } + throw error; + } + + throw new Error("Expected initialize to reject a non-bootstrap wallet"); } else { console.log("Pool already initialized; skipping."); } diff --git a/rs/vendor/indexmap/Cargo.toml b/rs/vendor/indexmap/Cargo.toml deleted file mode 100644 index 63281ff..0000000 --- a/rs/vendor/indexmap/Cargo.toml +++ /dev/null @@ -1,167 +0,0 @@ -# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO -# -# When uploading crates to the registry Cargo will automatically -# "normalize" Cargo.toml files for maximal compatibility -# with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g., crates.io) dependencies. -# -# If you are reading this file be aware that the original Cargo.toml -# will likely look very different (and much more reasonable). -# See Cargo.toml.orig for the original contents. - -[package] -edition = "2021" -rust-version = "1.79" -name = "indexmap" -version = "2.12.0" -build = false -autolib = false -autobins = false -autoexamples = false -autotests = false -autobenches = false -description = "A hash table with consistent order and fast iteration." -documentation = "https://docs.rs/indexmap/" -readme = "README.md" -keywords = [ - "hashmap", - "no_std", -] -categories = [ - "data-structures", - "no-std", -] -license = "Apache-2.0 OR MIT" -repository = "https://github.com/indexmap-rs/indexmap" - -[package.metadata.release] -allow-branch = ["main"] -sign-tag = true -tag-name = "{{version}}" - -[package.metadata.docs.rs] -features = [ - "arbitrary", - "quickcheck", - "serde", - "borsh", - "rayon", - "sval", -] -rustdoc-args = [ - "--cfg", - "docsrs", -] - -[features] -default = ["std"] -serde = [ - "dep:serde_core", - "dep:serde", -] -std = [] -test_debug = [] - -[lib] -name = "indexmap" -path = "src/lib.rs" -bench = false - -[[test]] -name = "equivalent_trait" -path = "tests/equivalent_trait.rs" - -[[test]] -name = "macros_full_path" -path = "tests/macros_full_path.rs" - -[[test]] -name = "quick" -path = "tests/quick.rs" - -[[test]] -name = "tests" -path = "tests/tests.rs" - -[[bench]] -name = "bench" -path = "benches/bench.rs" - -[[bench]] -name = "faststring" -path = "benches/faststring.rs" - -[dependencies.arbitrary] -version = "1.0" -optional = true -default-features = false - -[dependencies.borsh] -version = "1.2" -optional = true -default-features = false - -[dependencies.equivalent] -version = "1.0" -default-features = false - -[dependencies.hashbrown] -version = "0.16" -default-features = false - -[dependencies.quickcheck] -version = "1.0" -optional = true -default-features = false - -[dependencies.rayon] -version = "1.9" -optional = true - -[dependencies.serde_core] -version = "1.0.220" -optional = true -default-features = false - -[dependencies.sval] -version = "2" -optional = true -default-features = false - -[dev-dependencies.fastrand] -version = "2" -default-features = false - -[dev-dependencies.fnv] -version = "1.0" - -[dev-dependencies.itertools] -version = "0.14" - -[dev-dependencies.quickcheck] -version = "1.0" -default-features = false - -[dev-dependencies.serde] -version = "1.0" -features = ["derive"] -default-features = false - -[target."cfg(any())".dependencies.serde] -version = "1.0.220" -optional = true -default-features = false - -[lints.clippy] -style = "allow" - -[lints.rust] -private-bounds = "deny" -private-interfaces = "deny" -rust-2018-idioms = "warn" -unnameable-types = "deny" -unreachable-pub = "deny" -unsafe-code = "deny" - -[profile.bench] -debug = 2 diff --git a/rs/yarn.lock b/rs/yarn.lock deleted file mode 100644 index c495d58..0000000 --- a/rs/yarn.lock +++ /dev/null @@ -1,1927 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/runtime@^7.25.0": - version "7.28.4" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz" - integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ== - -"@coral-xyz/anchor-errors@^0.31.1": - version "0.31.1" - resolved "https://registry.npmjs.org/@coral-xyz/anchor-errors/-/anchor-errors-0.31.1.tgz" - integrity sha512-NhNEku4F3zzUSBtrYz84FzYWm48+9OvmT1Hhnwr6GnPQry2dsEqH/ti/7ASjjpoFTWRnPXrjAIT1qM6Isop+LQ== - -"@coral-xyz/anchor@=0.31.1": - version "0.31.1" - resolved "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.31.1.tgz" - integrity sha512-QUqpoEK+gi2S6nlYc2atgT2r41TT3caWr/cPUEL8n8Md9437trZ68STknq897b82p5mW0XrTBNOzRbmIRJtfsA== - dependencies: - "@coral-xyz/anchor-errors" "^0.31.1" - "@coral-xyz/borsh" "^0.31.1" - "@noble/hashes" "^1.3.1" - "@solana/web3.js" "^1.69.0" - bn.js "^5.1.2" - bs58 "^4.0.1" - buffer-layout "^1.2.2" - camelcase "^6.3.0" - cross-fetch "^3.1.5" - eventemitter3 "^4.0.7" - pako "^2.0.3" - superstruct "^0.15.4" - toml "^3.0.0" - -"@coral-xyz/borsh@^0.31.1": - version "0.31.1" - resolved "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.31.1.tgz" - integrity sha512-9N8AU9F0ubriKfNE3g1WF0/4dtlGXoBN/hd1PvbNBamBNwRgHxH4P+o3Zt7rSEloW1HUs6LfZEchlx9fW7POYw== - dependencies: - bn.js "^5.1.2" - buffer-layout "^1.2.0" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.2" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.5.5" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" - integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@metaplex-foundation/beet-solana@0.4.0": - version "0.4.0" - resolved "https://registry.npmjs.org/@metaplex-foundation/beet-solana/-/beet-solana-0.4.0.tgz" - integrity sha512-B1L94N3ZGMo53b0uOSoznbuM5GBNJ8LwSeznxBxJ+OThvfHQ4B5oMUqb+0zdLRfkKGS7Q6tpHK9P+QK0j3w2cQ== - dependencies: - "@metaplex-foundation/beet" ">=0.1.0" - "@solana/web3.js" "^1.56.2" - bs58 "^5.0.0" - debug "^4.3.4" - -"@metaplex-foundation/beet@>=0.1.0", "@metaplex-foundation/beet@0.7.1": - version "0.7.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/beet/-/beet-0.7.1.tgz" - integrity sha512-hNCEnS2WyCiYyko82rwuISsBY3KYpe828ubsd2ckeqZr7tl0WVLivGkoyA/qdiaaHEBGdGl71OpfWa2rqL3DiA== - dependencies: - ansicolors "^0.3.2" - bn.js "^5.2.0" - debug "^4.3.3" - -"@metaplex-foundation/cusper@^0.0.2": - version "0.0.2" - resolved "https://registry.npmjs.org/@metaplex-foundation/cusper/-/cusper-0.0.2.tgz" - integrity sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA== - -"@metaplex-foundation/mpl-token-metadata@=3.4.0": - version "3.4.0" - resolved "https://registry.npmjs.org/@metaplex-foundation/mpl-token-metadata/-/mpl-token-metadata-3.4.0.tgz" - integrity sha512-AxBAYCK73JWxY3g9//z/C9krkR0t1orXZDknUPS4+GjwGH2vgPfsk04yfZ31Htka2AdS9YE/3wH7sMUBHKn9Rg== - dependencies: - "@metaplex-foundation/mpl-toolbox" "^0.10.0" - -"@metaplex-foundation/mpl-toolbox@^0.10.0": - version "0.10.0" - resolved "https://registry.npmjs.org/@metaplex-foundation/mpl-toolbox/-/mpl-toolbox-0.10.0.tgz" - integrity sha512-84KD1L5cFyw5xnntHwL4uPwfcrkKSiwuDeypiVr92qCUFuF3ZENa2zlFVPu+pQcjTlod2LmEX3MhBmNjRMpdKg== - -"@metaplex-foundation/umi-bundle-defaults@=1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-bundle-defaults/-/umi-bundle-defaults-1.4.1.tgz" - integrity sha512-c0o0bgKgSN4CGggriwImD9FmQbcCku/ztmwDdjNKGCDzbz0oYaoOezpDRRpcP+HGz/s2okVTf02z/ogj+DndPg== - dependencies: - "@metaplex-foundation/umi-downloader-http" "^1.4.1" - "@metaplex-foundation/umi-eddsa-web3js" "^1.4.1" - "@metaplex-foundation/umi-http-fetch" "^1.4.1" - "@metaplex-foundation/umi-program-repository" "^1.4.1" - "@metaplex-foundation/umi-rpc-chunk-get-accounts" "^1.4.1" - "@metaplex-foundation/umi-rpc-web3js" "^1.4.1" - "@metaplex-foundation/umi-serializer-data-view" "^1.4.1" - "@metaplex-foundation/umi-transaction-factory-web3js" "^1.4.1" - -"@metaplex-foundation/umi-downloader-http@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-downloader-http/-/umi-downloader-http-1.4.1.tgz" - integrity sha512-gncYvRtN+s6pJ6gfwjlDD3JQDW+gNBBw0F76P0hJq3i+sTwaCeVQBs161Zes0rCPB6oEJWngqowATl/kIxnXqA== - -"@metaplex-foundation/umi-eddsa-web3js@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-eddsa-web3js/-/umi-eddsa-web3js-1.4.1.tgz" - integrity sha512-SFbme/y43X6t/aiiE2PKkzNE8UOgJyTFb4dnXU23ZMalk+LbGCyZNBMWix+ztjeCrdBQhILfbLLZzHuFikAd0g== - dependencies: - "@metaplex-foundation/umi-web3js-adapters" "^1.4.1" - "@noble/curves" "^1.0.0" - yaml "^2.7.0" - -"@metaplex-foundation/umi-http-fetch@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-http-fetch/-/umi-http-fetch-1.4.1.tgz" - integrity sha512-ItvPkRPTXWH6YeBB7WTS3qKCDVrjEhGpb+fCBypzCkdXvS9zRwN+I/I6IcB+GJnEFdTIip8+XSeWMOrW8ZDCkQ== - dependencies: - node-fetch "^2.6.7" - -"@metaplex-foundation/umi-options@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-options/-/umi-options-1.4.1.tgz" - integrity sha512-+36Sm16a9GFlheAnqIjsi5lV7+9J9/lhYOcwXK9bkRARucA9evT/dajmpXHUkPOi3JjlVbl3knWvcPkbhyP2Og== - -"@metaplex-foundation/umi-program-repository@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-program-repository/-/umi-program-repository-1.4.1.tgz" - integrity sha512-Cy0siWwNC3kUf8UxlYgR8aDmBPizNhER7icEcd4b9itNTZf3XjekE3rEPFO1UFys+bql4UcJ42SepkDtVzsDsw== - -"@metaplex-foundation/umi-public-keys@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-public-keys/-/umi-public-keys-1.4.1.tgz" - integrity sha512-UB+MVzK8GIMLYS7qgtl7Qr5fUW36EelUk2VA/VyQJZb2rlQYZu08/whc75uwGhPX2Mr67NzVSoSTkTpUb29zrg== - dependencies: - "@metaplex-foundation/umi-serializers-encodings" "^1.4.1" - -"@metaplex-foundation/umi-rpc-chunk-get-accounts@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-rpc-chunk-get-accounts/-/umi-rpc-chunk-get-accounts-1.4.1.tgz" - integrity sha512-3aHQe/XT9+LZe6f3PHX0RSmUPeDB+3J2l29dQDq80KdGDfL19ELogaP5OutsKB1W3NoXBSwzhuOjtE6gG9aQgA== - -"@metaplex-foundation/umi-rpc-web3js@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-rpc-web3js/-/umi-rpc-web3js-1.4.1.tgz" - integrity sha512-xR0KVz6n3RZ3qO8axxIhDCBjki9jj7fYgKijO0zJC85YZeuos6A6vuA14LpTaonWlkD892M3Ua0YC7dUOL9CzQ== - dependencies: - "@metaplex-foundation/umi-web3js-adapters" "^1.4.1" - -"@metaplex-foundation/umi-serializer-data-view@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-serializer-data-view/-/umi-serializer-data-view-1.4.1.tgz" - integrity sha512-SSJvXkjj0+Rfz7ZbYD8yMmF/5dRQgqzUW/FkH6si/EiYxyTmRmMaeCo85RZAUSjbJgpz8DFwLmLceptFiTwk5A== - -"@metaplex-foundation/umi-serializers-core@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-serializers-core/-/umi-serializers-core-1.4.1.tgz" - integrity sha512-xLI2ZEFJYoVdlQQMeKNLBsi56qQ2xC7htWDa30gqw/hhuMy3W82MtgLiK/3tU96MNi86TKSNVOdXmY815/QJsg== - -"@metaplex-foundation/umi-serializers-encodings@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-serializers-encodings/-/umi-serializers-encodings-1.4.1.tgz" - integrity sha512-KnIp8T3mSMoDI5gmLre6UZMZpBVZ5tpZsAaLLfuiSfRolUsBLo90gmXJWwUWWZihhcvaN0xMdyx+k1KK+nwK9Q== - dependencies: - "@metaplex-foundation/umi-serializers-core" "^1.4.1" - -"@metaplex-foundation/umi-serializers-numbers@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-serializers-numbers/-/umi-serializers-numbers-1.4.1.tgz" - integrity sha512-vk5f6QTdudXJDyyZAO7IDNiGRkF70nLdx4LBCvstbmTv2535HinV06R1mBRA9dx20D6SxRASdw33BH3mAYPfbQ== - dependencies: - "@metaplex-foundation/umi-serializers-core" "^1.4.1" - -"@metaplex-foundation/umi-serializers@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-serializers/-/umi-serializers-1.4.1.tgz" - integrity sha512-DnuTBS+6Ycjaz1BsOKmUZCJcdyJooIpiJ5gy/snhmh8YKDAZuxezBqRzKSR/pKPXieURbL/UPCdJ6a9OFCjcYQ== - dependencies: - "@metaplex-foundation/umi-options" "^1.4.1" - "@metaplex-foundation/umi-public-keys" "^1.4.1" - "@metaplex-foundation/umi-serializers-core" "^1.4.1" - "@metaplex-foundation/umi-serializers-encodings" "^1.4.1" - "@metaplex-foundation/umi-serializers-numbers" "^1.4.1" - -"@metaplex-foundation/umi-transaction-factory-web3js@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-transaction-factory-web3js/-/umi-transaction-factory-web3js-1.4.1.tgz" - integrity sha512-ppygQl2W5NZ1s/w6rBldQekTpgdVKaNEwK4bHRf81+mnJTgsH1iXl72M4y1ARNt3472Fv910vZQo9/XYeRbSaQ== - dependencies: - "@metaplex-foundation/umi-web3js-adapters" "^1.4.1" - -"@metaplex-foundation/umi-web3js-adapters@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi-web3js-adapters/-/umi-web3js-adapters-1.4.1.tgz" - integrity sha512-9LkueHDVVljRY83HcaRxGh011zMwrFpvlgb2VrkYlhC7afTM7VrDw4oxdR1zwC80bXyf0D1gyKqi+ANO8QQqtw== - dependencies: - buffer "^6.0.3" - -"@metaplex-foundation/umi@^1.4.1", "@metaplex-foundation/umi@=1.4.1", "@metaplex-foundation/umi@>= 0.8.2 <= 1": - version "1.4.1" - resolved "https://registry.npmjs.org/@metaplex-foundation/umi/-/umi-1.4.1.tgz" - integrity sha512-GGdmKsZq8nGInhjk8jpW4h4pNX8eZgTChnosvBmX/4lTznu+nOJuIsgO9r7LuUkR8zaSfjUheC/T5e7AtRku+g== - dependencies: - "@metaplex-foundation/umi-options" "^1.4.1" - "@metaplex-foundation/umi-public-keys" "^1.4.1" - "@metaplex-foundation/umi-serializers" "^1.4.1" - -"@noble/curves@^1.0.0", "@noble/curves@^1.4.2": - version "1.9.7" - resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz" - integrity sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw== - dependencies: - "@noble/hashes" "1.8.0" - -"@noble/hashes@^1.3.1", "@noble/hashes@^1.4.0", "@noble/hashes@1.8.0": - version "1.8.0" - resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz" - integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== - -"@sailshq/lodash@^3.10.2": - version "3.10.7" - resolved "https://registry.npmjs.org/@sailshq/lodash/-/lodash-3.10.7.tgz" - integrity sha512-6Vi9xMlR8PbPeoDKjJHUVIhqeE8vz9Jjm/r3nZI7DI+cjtjHmlsjvAprXJy8hauCGxB5HqOBtpjWukOeId6WRw== - -"@solana/buffer-layout-utils@^0.2.0": - version "0.2.0" - resolved "https://registry.npmjs.org/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz" - integrity sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g== - dependencies: - "@solana/buffer-layout" "^4.0.0" - "@solana/web3.js" "^1.32.0" - bigint-buffer "^1.1.5" - bignumber.js "^9.0.1" - -"@solana/buffer-layout@^4.0.0", "@solana/buffer-layout@^4.0.1": - version "4.0.1" - resolved "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz" - integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== - dependencies: - buffer "~6.0.3" - -"@solana/codecs-core@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-rc.1.tgz" - integrity sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ== - dependencies: - "@solana/errors" "2.0.0-rc.1" - -"@solana/codecs-core@2.3.0": - version "2.3.0" - resolved "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.3.0.tgz" - integrity sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw== - dependencies: - "@solana/errors" "2.3.0" - -"@solana/codecs-data-structures@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-rc.1.tgz" - integrity sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog== - dependencies: - "@solana/codecs-core" "2.0.0-rc.1" - "@solana/codecs-numbers" "2.0.0-rc.1" - "@solana/errors" "2.0.0-rc.1" - -"@solana/codecs-numbers@^2.1.0": - version "2.3.0" - resolved "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.3.0.tgz" - integrity sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg== - dependencies: - "@solana/codecs-core" "2.3.0" - "@solana/errors" "2.3.0" - -"@solana/codecs-numbers@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-rc.1.tgz" - integrity sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ== - dependencies: - "@solana/codecs-core" "2.0.0-rc.1" - "@solana/errors" "2.0.0-rc.1" - -"@solana/codecs-strings@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-rc.1.tgz" - integrity sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g== - dependencies: - "@solana/codecs-core" "2.0.0-rc.1" - "@solana/codecs-numbers" "2.0.0-rc.1" - "@solana/errors" "2.0.0-rc.1" - -"@solana/codecs@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-rc.1.tgz" - integrity sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ== - dependencies: - "@solana/codecs-core" "2.0.0-rc.1" - "@solana/codecs-data-structures" "2.0.0-rc.1" - "@solana/codecs-numbers" "2.0.0-rc.1" - "@solana/codecs-strings" "2.0.0-rc.1" - "@solana/options" "2.0.0-rc.1" - -"@solana/errors@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-rc.1.tgz" - integrity sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ== - dependencies: - chalk "^5.3.0" - commander "^12.1.0" - -"@solana/errors@2.3.0": - version "2.3.0" - resolved "https://registry.npmjs.org/@solana/errors/-/errors-2.3.0.tgz" - integrity sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ== - dependencies: - chalk "^5.4.1" - commander "^14.0.0" - -"@solana/options@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@solana/options/-/options-2.0.0-rc.1.tgz" - integrity sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA== - dependencies: - "@solana/codecs-core" "2.0.0-rc.1" - "@solana/codecs-data-structures" "2.0.0-rc.1" - "@solana/codecs-numbers" "2.0.0-rc.1" - "@solana/codecs-strings" "2.0.0-rc.1" - "@solana/errors" "2.0.0-rc.1" - -"@solana/spl-token-group@^0.0.7": - version "0.0.7" - resolved "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.7.tgz" - integrity sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug== - dependencies: - "@solana/codecs" "2.0.0-rc.1" - -"@solana/spl-token-metadata@^0.1.2", "@solana/spl-token-metadata@^0.1.6": - version "0.1.6" - resolved "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.6.tgz" - integrity sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA== - dependencies: - "@solana/codecs" "2.0.0-rc.1" - -"@solana/spl-token@^0.3.6": - version "0.3.11" - resolved "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.11.tgz" - integrity sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ== - dependencies: - "@solana/buffer-layout" "^4.0.0" - "@solana/buffer-layout-utils" "^0.2.0" - "@solana/spl-token-metadata" "^0.1.2" - buffer "^6.0.3" - -"@solana/spl-token@=0.4.14": - version "0.4.14" - resolved "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.14.tgz" - integrity sha512-u09zr96UBpX4U685MnvQsNzlvw9TiY005hk1vJmJr7gMJldoPG1eYU5/wNEyOA5lkMLiR/gOi9SFD4MefOYEsA== - dependencies: - "@solana/buffer-layout" "^4.0.0" - "@solana/buffer-layout-utils" "^0.2.0" - "@solana/spl-token-group" "^0.0.7" - "@solana/spl-token-metadata" "^0.1.6" - buffer "^6.0.3" - -"@solana/web3.js@^1.32.0", "@solana/web3.js@^1.56.2", "@solana/web3.js@^1.69.0", "@solana/web3.js@^1.70.3", "@solana/web3.js@^1.72.0", "@solana/web3.js@^1.88.0", "@solana/web3.js@^1.95.3", "@solana/web3.js@^1.95.5", "@solana/web3.js@=1.98.4": - version "1.98.4" - resolved "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.4.tgz" - integrity sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw== - dependencies: - "@babel/runtime" "^7.25.0" - "@noble/curves" "^1.4.2" - "@noble/hashes" "^1.4.0" - "@solana/buffer-layout" "^4.0.1" - "@solana/codecs-numbers" "^2.1.0" - agentkeepalive "^4.5.0" - bn.js "^5.2.1" - borsh "^0.7.0" - bs58 "^4.0.1" - buffer "6.0.3" - fast-stable-stringify "^1.0.0" - jayson "^4.1.1" - node-fetch "^2.7.0" - rpc-websockets "^9.0.2" - superstruct "^2.0.2" - -"@sqds/multisig@=2.1.4": - version "2.1.4" - resolved "https://registry.npmjs.org/@sqds/multisig/-/multisig-2.1.4.tgz" - integrity sha512-5w+NmwHOzl96nI50R/fjSD6uFydRLNUquhoEmmWbGepS4D9DnQyF2TKcUBfTyxV3sgJt00ypBt7SXB3y8WOzUQ== - dependencies: - "@metaplex-foundation/beet" "0.7.1" - "@metaplex-foundation/beet-solana" "0.4.0" - "@metaplex-foundation/cusper" "^0.0.2" - "@solana/spl-token" "^0.3.6" - "@solana/web3.js" "^1.70.3" - "@types/bn.js" "^5.1.1" - assert "^2.0.0" - bn.js "^5.2.1" - buffer "6.0.3" - invariant "2.2.4" - -"@swc/helpers@^0.5.11": - version "0.5.17" - resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz" - integrity sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A== - dependencies: - tslib "^2.8.0" - -"@tsconfig/node10@^1.0.7": - version "1.0.12" - resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz" - integrity sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/bn.js@^5.1.1": - version "5.2.0" - resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.2.0.tgz" - integrity sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q== - dependencies: - "@types/node" "*" - -"@types/bn.js@=5.1.0": - version "5.1.0" - resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz" - integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== - dependencies: - "@types/node" "*" - -"@types/chai@=4.3.0": - version "4.3.0" - resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz" - integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw== - -"@types/connect@^3.4.33": - version "3.4.38" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/mocha@=9.0.0": - version "9.0.0" - resolved "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz" - integrity sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA== - -"@types/node@*", "@types/node@=20.0.0": - version "20.0.0" - resolved "https://registry.npmjs.org/@types/node/-/node-20.0.0.tgz" - integrity sha512-cD2uPTDnQQCVpmRefonO98/PPijuOnnEy5oytWJFPY1N9aJCz2wJ5kSGWO+zJoed2cY2JxQh6yBuUq4vIn61hw== - -"@types/node@^12.12.54": - version "12.20.55" - resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== - -"@types/uuid@^8.3.4": - version "8.3.4" - resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" - integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== - -"@types/ws@^7.4.4": - version "7.4.7" - resolved "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz" - integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== - dependencies: - "@types/node" "*" - -"@types/ws@^8.2.2": - version "8.18.1" - resolved "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz" - integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== - dependencies: - "@types/node" "*" - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - -acorn-walk@^8.1.1: - version "8.3.4" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz" - integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== - dependencies: - acorn "^8.11.0" - -acorn@^8.11.0, acorn@^8.4.1: - version "8.15.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== - -agentkeepalive@^4.5.0: - version "4.6.0" - resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz" - integrity sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ== - dependencies: - humanize-ms "^1.2.1" - -anchor@=1.4.2: - version "1.4.2" - resolved "https://registry.npmjs.org/anchor/-/anchor-1.4.2.tgz" - integrity sha512-qwNKSQ9yZQj0dQh8HzxGX1kHbx7WhEFHx7galQ26Xvn90konFPQMOnm/VR8RxgbOI3kLuURxB+ZzKmOelGoBVQ== - dependencies: - "@sailshq/lodash" "^3.10.2" - validator "13.15.23" - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansicolors@^0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz" - integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - -assert@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz" - integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== - dependencies: - call-bind "^1.0.2" - is-nan "^1.3.2" - object-is "^1.1.5" - object.assign "^4.1.4" - util "^0.12.5" - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^3.0.2: - version "3.0.11" - resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz" - integrity sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA== - dependencies: - safe-buffer "^5.0.1" - -base-x@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/base-x/-/base-x-4.0.1.tgz" - integrity sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bigint-buffer@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz" - integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== - dependencies: - bindings "^1.3.0" - -bignumber.js@^9.0.1: - version "9.3.1" - resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz" - integrity sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -bindings@^1.3.0: - version "1.5.0" - resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1, bn.js@=5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -borsh@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz" - integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== - dependencies: - bn.js "^5.2.0" - bs58 "^4.0.0" - text-encoding-utf-8 "^1.0.2" - -brace-expansion@^1.1.7: - version "1.1.13" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz" - integrity sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@~3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -bs58@^4.0.0, bs58@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" - integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== - dependencies: - base-x "^3.0.2" - -bs58@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz" - integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== - dependencies: - base-x "^4.0.0" - -buffer-from@^1.0.0, buffer-from@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-layout@^1.2.0, buffer-layout@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/buffer-layout/-/buffer-layout-1.2.2.tgz" - integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== - -buffer@^6.0.3, buffer@~6.0.3, buffer@6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.7, call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== - dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" - set-function-length "^1.2.2" - -call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" - -camelcase@^6.0.0, camelcase@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -cargo@=0.8.0: - version "0.8.0" - resolved "https://registry.npmjs.org/cargo/-/cargo-0.8.0.tgz" - integrity sha512-Fl49HZ8CAs4++TjtwcoZgwyq2ZQUiFVGQ3byyKKUilNk65iuBRDjpCGH/AUORvAODaVVbGbKyFCa67tlDG3p4g== - -chai@=4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz" - integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - pathval "^1.1.1" - type-detect "^4.0.5" - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^5.3.0, chalk@^5.4.1: - version "5.6.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz" - integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== - -check-error@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" - -chokidar@3.5.2: - version "3.5.2" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^12.1.0: - version "12.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz" - integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== - -commander@^14.0.0: - version "14.0.1" - resolved "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz" - integrity sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A== - -commander@^2.20.3: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-fetch@^3.1.5: - version "3.2.0" - resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz" - integrity sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q== - dependencies: - node-fetch "^2.7.0" - -debug@^4.3.3: - version "4.3.3" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -debug@^4.3.4: - version "4.4.3" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - -debug@4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.1.3, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delay@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz" - integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== - -diff@^3.1.0: - version "3.5.1" - resolved "https://registry.npmjs.org/diff/-/diff-3.5.1.tgz" - integrity sha512-Z3u54A8qGyqFOSr2pk0ijYs8mOE9Qz8kTvtKeBI+upoG9j04Sq+oI7W8zAJiQybDcESET8/uIdHzs0p3k4fZlw== - -diff@^4.0.1: - version "4.0.4" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz" - integrity sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ== - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -es-define-property@^1.0.0, es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz" - integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== - dependencies: - es6-promise "^4.0.3" - -escalade@^3.1.1: - version "3.2.0" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eventemitter3@^4.0.7: - version "4.0.7" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -eventemitter3@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== - -eyes@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" - integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== - -fast-stable-stringify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz" - integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== - -fastestsmallesttextencoderdecoder@^1.0.22: - version "1.0.22" - resolved "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz" - integrity sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw== - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -for-each@^0.3.5: - version "0.3.5" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" - integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== - dependencies: - is-callable "^1.2.7" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -generator-function@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz" - integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.0, get-func-name@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - -get-intrinsic@^1.2.4, get-intrinsic@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - dependencies: - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@7.1.7: - version "7.1.7" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -gopd@^1.0.1, gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-symbols@^1.0.3, has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@^2.0.3, inherits@2: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -invariant@2.2.4: - version "2.2.4" - resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-arguments@^1.0.4: - version "1.2.0" - resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz" - integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== - dependencies: - call-bound "^1.0.2" - has-tostringtag "^1.0.2" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - -is-fullwidth-code-point@^3.0.0: - 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== - -is-generator-function@^1.0.7: - version "1.1.2" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz" - integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== - dependencies: - call-bound "^1.0.4" - generator-function "^2.0.0" - get-proto "^1.0.1" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-nan@^1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz" - integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-regex@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" - integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== - dependencies: - call-bound "^1.0.2" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -is-typed-array@^1.1.3: - version "1.1.15" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" - integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== - dependencies: - which-typed-array "^1.1.16" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isomorphic-ws@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz" - integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== - -jayson@^4.1.1: - version "4.2.0" - resolved "https://registry.npmjs.org/jayson/-/jayson-4.2.0.tgz" - integrity sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg== - dependencies: - "@types/connect" "^3.4.33" - "@types/node" "^12.12.54" - "@types/ws" "^7.4.4" - commander "^2.20.3" - delay "^5.0.0" - es6-promisify "^5.0.0" - eyes "^0.1.8" - isomorphic-ws "^4.0.1" - json-stringify-safe "^5.0.1" - stream-json "^1.9.1" - uuid "^8.3.2" - ws "^7.5.10" - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -log-symbols@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -minimatch@^3.0.4, minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mkdirp@^0.5.1: - version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -"mocha@^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X", mocha@=9.0.3: - version "9.0.3" - resolved "https://registry.npmjs.org/mocha/-/mocha-9.0.3.tgz" - integrity sha512-hnYFrSefHxYS2XFGtN01x8un0EwNu2bzKvhpRFhgoybIvMaOkkL60IVPmkb5h6XDmUl4IMSB+rT5cIO4/4bJgg== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.2" - debug "4.3.1" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.1.7" - growl "1.10.5" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "3.0.4" - ms "2.1.3" - nanoid "3.1.23" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - wide-align "1.1.3" - workerpool "6.1.5" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -ms@^2.0.0, ms@^2.1.3, ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nanoid@3.1.23: - version "3.1.23" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz" - integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== - -node-fetch@^2.6.7, node-fetch@^2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-is@^1.1.5: - version "1.1.6" - resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz" - integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4: - version "4.1.7" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" - integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - has-symbols "^1.1.0" - object-keys "^1.1.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -pako@^2.0.3: - version "2.1.0" - resolved "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz" - integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.2" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz" - integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== - -possible-typed-array-names@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" - integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== - -prettier@=2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz" - integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -require-directory@^2.1.1: - 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== - -rpc-websockets@^9.0.2: - version "9.2.0" - resolved "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.2.0.tgz" - integrity sha512-DS/XHdPxplQTtNRKiBCRWGBJfjOk56W7fyFUpiYi9fSTWTzoEMbUkn3J4gB0IMniIEVeAGR1/rzFQogzD5MxvQ== - dependencies: - "@swc/helpers" "^0.5.11" - "@types/uuid" "^8.3.4" - "@types/ws" "^8.2.2" - buffer "^6.0.3" - eventemitter3 "^5.0.1" - uuid "^8.3.2" - ws "^8.5.0" - optionalDependencies: - bufferutil "^4.0.1" - utf-8-validate "^5.0.2" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex-test@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" - integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-regex "^1.2.1" - -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -set-function-length@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -source-map-support@^0.5.6: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -stream-chain@^2.2.5: - version "2.2.5" - resolved "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz" - integrity sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA== - -stream-json@^1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz" - integrity sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw== - dependencies: - stream-chain "^2.2.5" - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" - integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-json-comments@3.1.1: - 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== - -superstruct@^0.15.4: - version "0.15.5" - resolved "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz" - integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== - -superstruct@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz" - integrity sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -text-encoding-utf-8@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz" - integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toml@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz" - integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts-mocha@=10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz" - integrity sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw== - dependencies: - ts-node "7.0.1" - optionalDependencies: - tsconfig-paths "^3.5.0" - -ts-node@=10.9.2: - version "10.9.2" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -ts-node@7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz" - integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== - dependencies: - arrify "^1.0.0" - buffer-from "^1.1.0" - diff "^3.1.0" - make-error "^1.1.1" - minimist "^1.2.0" - mkdirp "^0.5.1" - source-map-support "^0.5.6" - yn "^2.0.0" - -tsconfig-paths@^3.5.0: - version "3.15.0" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^2.8.0: - version "2.8.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.1.0" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz" - integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== - -typescript@=5.7.3, typescript@>=2.7, typescript@>=5, typescript@>=5.3.3: - version "5.7.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz" - integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== - -util@^0.12.5: - version "0.12.5" - resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -validator@13.15.23: - version "13.15.23" - resolved "https://registry.npmjs.org/validator/-/validator-13.15.23.tgz" - integrity sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-typed-array@^1.1.16, which-typed-array@^1.1.2: - version "1.1.20" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz" - integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - for-each "^0.3.5" - get-proto "^1.0.1" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - -which@2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -workerpool@6.1.5: - version "6.1.5" - resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz" - integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@*, ws@^7.5.10: - version "7.5.10" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - -ws@^8.5.0: - version "8.18.3" - resolved "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz" - integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yaml@^2.7.0: - version "2.8.1" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz" - integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yn@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz" - integrity sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ== - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/scripts/check-lockfiles.mjs b/scripts/check-lockfiles.mjs new file mode 100644 index 0000000..d6b5c79 --- /dev/null +++ b/scripts/check-lockfiles.mjs @@ -0,0 +1,44 @@ +import { existsSync } from "node:fs"; +import { join } from "node:path"; + +const root = process.cwd(); + +const policy = [ + { + workspace: "ts", + required: ["bun.lock"], + forbidden: ["package-lock.json", "yarn.lock", "pnpm-lock.yaml"], + }, + { + workspace: "rs", + required: ["package-lock.json"], + forbidden: ["bun.lock", "yarn.lock", "pnpm-lock.yaml"], + }, +]; + +const failures = []; + +for (const entry of policy) { + for (const file of entry.required) { + if (!existsSync(join(root, entry.workspace, file))) { + failures.push(`${entry.workspace}: missing required lockfile ${file}`); + } + } + + for (const file of entry.forbidden) { + if (existsSync(join(root, entry.workspace, file))) { + failures.push(`${entry.workspace}: forbidden lockfile present: ${file}`); + } + } +} + +if (failures.length > 0) { + console.error("Lockfile policy failed:"); + for (const failure of failures) { + console.error(`- ${failure}`); + } + process.exit(1); +} + +console.log("Lockfile policy passed."); + diff --git a/ts/apps/admin/.env.example b/ts/apps/admin/.env.example index 8865c45..7086a97 100644 --- a/ts/apps/admin/.env.example +++ b/ts/apps/admin/.env.example @@ -1,8 +1,18 @@ # Solana RPC endpoint — canonical name is NEXT_PUBLIC_SOLANA_RPC_URL # (NEXT_PUBLIC_RPC_ENDPOINT is still accepted as a fallback) -NEXT_PUBLIC_SOLANA_RPC_URL= -NEXT_PUBLIC_USDC_MINT= +NEXT_PUBLIC_DEPLOY_ENV=dev +NEXT_PUBLIC_SOLANA_RPC_URL=https://api.devnet.solana.com +NEXT_PUBLIC_SOLANA_CLUSTER=devnet +NEXT_PUBLIC_CLUSTER=devnet +NEXT_PUBLIC_USDC_MINT=4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU NEXT_PUBLIC_BUNKERCASH_MINT= +NEXT_PUBLIC_BUNKERCASH_PROGRAM_ID=Fp8b6p287TL5oPMwLVdwGys5phHNLcmTKNvVoGdCJS6g +# Squads v4 governance. Server-side SQUADS_MULTISIG_PUBKEY is preferred; +# NEXT_PUBLIC_SQUADS_MULTISIG_PUBKEY is also accepted to match the web app. +SQUADS_MULTISIG_PUBKEY= +SQUADS_VAULT_INDEX=0 +# Optional: member, initiate, vote, or execute. Defaults to member. +ADMIN_SQUADS_REQUIRED_PERMISSION=member # Optional server-side admin allowlist override. # For deployed workers, set this in Cloudflare-managed env/secrets instead of wrangler.jsonc. ADMIN_OVERRIDE_WALLET= diff --git a/ts/apps/admin/app/api/admin-auth/challenge/route.test.ts b/ts/apps/admin/app/api/admin-auth/challenge/route.test.ts new file mode 100644 index 0000000..e1d0658 --- /dev/null +++ b/ts/apps/admin/app/api/admin-auth/challenge/route.test.ts @@ -0,0 +1,62 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const enforceAdminChallengeRateLimitMock = vi.fn(); +const issueAdminAuthChallengeMock = vi.fn(); + +vi.mock("@/lib/admin-auth-nonce", async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + enforceAdminChallengeRateLimit: (...args: unknown[]) => + enforceAdminChallengeRateLimitMock(...args), + issueAdminAuthChallenge: (...args: unknown[]) => + issueAdminAuthChallengeMock(...args), + }; +}); + +const { AdminAuthRateLimitError } = await import("@/lib/admin-auth-nonce"); +const { POST } = await import("./route"); + +function makeChallengeRequest() { + return new Request("https://admin.bunkercash.com/api/admin-auth/challenge", { + method: "POST", + headers: { + "content-type": "application/json", + "cf-connecting-ip": "203.0.113.42", + }, + body: JSON.stringify({ + wallet: "11111111111111111111111111111112", + method: "GET", + route: "/api/admin/me", + bodyHash: "0".repeat(64), + }), + }); +} + +describe("admin auth challenge route", () => { + beforeEach(() => { + enforceAdminChallengeRateLimitMock.mockReset(); + enforceAdminChallengeRateLimitMock.mockResolvedValue(undefined); + issueAdminAuthChallengeMock.mockReset(); + issueAdminAuthChallengeMock.mockResolvedValue({ + ok: true, + nonce: "0123456789abcdef0123456789abcdef", + }); + }); + + it("returns 429 when challenge rate limit is exceeded", async () => { + enforceAdminChallengeRateLimitMock.mockRejectedValue( + new AdminAuthRateLimitError(30), + ); + + const response = await POST(makeChallengeRequest()); + + expect(response.status).toBe(429); + expect(response.headers.get("retry-after")).toBe("30"); + expect(await response.json()).toEqual({ + error: "Too many admin challenge requests. Please wait and try again.", + }); + expect(issueAdminAuthChallengeMock).not.toHaveBeenCalled(); + }); +}); + diff --git a/ts/apps/admin/app/api/admin-auth/challenge/route.ts b/ts/apps/admin/app/api/admin-auth/challenge/route.ts index 110159f..96586af 100644 --- a/ts/apps/admin/app/api/admin-auth/challenge/route.ts +++ b/ts/apps/admin/app/api/admin-auth/challenge/route.ts @@ -1,5 +1,10 @@ import { NextResponse } from "next/server"; -import { issueAdminAuthChallenge } from "@/lib/admin-auth-nonce"; +import { + enforceAdminChallengeRateLimit, + getAdminAuthDomain, + isAdminAuthRateLimitError, + issueAdminAuthChallenge, +} from "@/lib/admin-auth-nonce"; export const runtime = "nodejs"; @@ -9,9 +14,11 @@ export async function POST(request: Request) { method?: unknown; route?: unknown; bodyHash?: unknown; + wallet?: unknown; }; if ( + typeof body.wallet !== "string" || typeof body.method !== "string" || typeof body.route !== "string" || typeof body.bodyHash !== "string" @@ -22,7 +29,14 @@ export async function POST(request: Request) { ); } + await enforceAdminChallengeRateLimit({ + request, + wallet: body.wallet, + }); + const challenge = await issueAdminAuthChallenge({ + wallet: body.wallet, + domain: getAdminAuthDomain(request), method: body.method, route: body.route, bodyHash: body.bodyHash, @@ -34,6 +48,18 @@ export async function POST(request: Request) { }, }); } catch (error: unknown) { + if (isAdminAuthRateLimitError(error)) { + return NextResponse.json( + { error: error.message }, + { + status: 429, + headers: { + "Retry-After": error.retryAfterSeconds.toString(), + }, + }, + ); + } + const message = error instanceof Error ? error.message : "Failed to issue challenge"; const isValidationError = message.includes("Invalid admin authorization"); diff --git a/ts/apps/admin/app/api/admin/me/route.test.ts b/ts/apps/admin/app/api/admin/me/route.test.ts new file mode 100644 index 0000000..00d0cbf --- /dev/null +++ b/ts/apps/admin/app/api/admin/me/route.test.ts @@ -0,0 +1,91 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +vi.mock("@/lib/geoblocking-auth", () => ({ + authorizeAdminAccess: vi.fn(), +})); + +vi.mock("@/lib/admin-auth-nonce", () => ({ + getAdminAuthDomain: (request: Request) => new URL(request.url).host, + getAdminAuthRoute: (request: Request) => new URL(request.url).pathname, + getEmptyBodyHash: () => + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", +})); + +import { authorizeAdminAccess } from "@/lib/geoblocking-auth"; +import { GET } from "./route"; + +function makeRequest() { + return new Request("https://admin.test/api/admin/me", { + headers: { + "x-admin-wallet": "Wallet111111111111111111111111111111111111", + "x-admin-signature": "dGVzdA==", + "x-admin-issued-at": "2026-07-04T10:00:00.000Z", + "x-admin-nonce": "0123456789abcdef0123456789abcdef", + }, + }); +} + +describe("/api/admin/me", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("returns the shared backend admin identity", async () => { + vi.mocked(authorizeAdminAccess).mockResolvedValueOnce({ + ok: true, + isAdmin: true, + identity: { + wallet: "Wallet111111111111111111111111111111111111", + isAdmin: true, + role: "squads-member", + governanceMode: "squads-v4", + poolMasterWallet: "Vault1111111111111111111111111111111111111", + squadsMultisig: "Multisig111111111111111111111111111111111", + squadsVault: "Vault1111111111111111111111111111111111111", + squadsVaultIndex: 0, + squadsPermissions: ["vote"], + }, + }); + + const response = await GET(makeRequest()); + + await expect(response.json()).resolves.toEqual({ + wallet: "Wallet111111111111111111111111111111111111", + isAdmin: true, + role: "squads-member", + governanceMode: "squads-v4", + poolMasterWallet: "Vault1111111111111111111111111111111111111", + squadsMultisig: "Multisig111111111111111111111111111111111", + squadsVault: "Vault1111111111111111111111111111111111111", + squadsVaultIndex: 0, + squadsPermissions: ["vote"], + }); + expect(response.status).toBe(200); + expect(response.headers.get("Cache-Control")).toBe("no-store"); + expect(authorizeAdminAccess).toHaveBeenCalledWith({ + wallet: "Wallet111111111111111111111111111111111111", + signature: "dGVzdA==", + issuedAt: "2026-07-04T10:00:00.000Z", + nonce: "0123456789abcdef0123456789abcdef", + domain: "admin.test", + method: "GET", + route: "/api/admin/me", + bodyHash: + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + }); + }); + + it("rejects failed authorization checks", async () => { + vi.mocked(authorizeAdminAccess).mockResolvedValueOnce({ + ok: false, + error: "Invalid admin signature", + }); + + const response = await GET(makeRequest()); + + expect(response.status).toBe(401); + await expect(response.json()).resolves.toEqual({ + error: "Invalid admin signature", + }); + }); +}); diff --git a/ts/apps/admin/app/api/admin/me/route.ts b/ts/apps/admin/app/api/admin/me/route.ts new file mode 100644 index 0000000..dd7ad92 --- /dev/null +++ b/ts/apps/admin/app/api/admin/me/route.ts @@ -0,0 +1,42 @@ +import { NextResponse } from "next/server"; +import { getAdminAuthDomain, getAdminAuthRoute, getEmptyBodyHash } from "@/lib/admin-auth-nonce"; +import { authorizeAdminAccess } from "@/lib/geoblocking-auth"; + +export const runtime = "nodejs"; + +export async function GET(request: Request) { + try { + const authorization = await authorizeAdminAccess({ + wallet: request.headers.get("x-admin-wallet"), + signature: request.headers.get("x-admin-signature"), + issuedAt: request.headers.get("x-admin-issued-at"), + nonce: request.headers.get("x-admin-nonce"), + domain: getAdminAuthDomain(request), + method: request.method, + route: getAdminAuthRoute(request), + bodyHash: getEmptyBodyHash(), + }); + + if (!authorization.ok) { + return NextResponse.json( + { error: authorization.error }, + { status: 401 }, + ); + } + + return NextResponse.json(authorization.identity, { + headers: { + "Cache-Control": "no-store", + }, + }); + } catch (error: unknown) { + console.error( + "[admin/me] Failed:", + error instanceof Error ? error.message : error, + ); + return NextResponse.json( + { error: "Failed to verify admin access" }, + { status: 500 }, + ); + } +} diff --git a/ts/apps/admin/app/api/admin/validate-instructions/route.ts b/ts/apps/admin/app/api/admin/validate-instructions/route.ts new file mode 100644 index 0000000..10321cf --- /dev/null +++ b/ts/apps/admin/app/api/admin/validate-instructions/route.ts @@ -0,0 +1,153 @@ +import { createHash } from "crypto"; +import { NextResponse } from "next/server"; +import { + Connection, + PublicKey, + TransactionInstruction, + TransactionMessage, + VersionedTransaction, +} from "@solana/web3.js"; +import { + getAdminAuthDomain, + getAdminAuthRoute, +} from "@/lib/admin-auth-nonce"; +import { authorizeAdminAccess } from "@/lib/geoblocking-auth"; +import { + validateAdminInstructions, + type SerializedAdminInstruction, +} from "@/lib/admin-instruction-validator"; +import { getServerRpcEndpoint } from "@/lib/solana-env"; + +export const runtime = "nodejs"; + +function hashBodyText(bodyText: string): string { + return createHash("sha256").update(bodyText).digest("hex"); +} + +function parseInstructions(value: unknown): SerializedAdminInstruction[] { + if (!value || typeof value !== "object") { + throw new Error("Validation payload is malformed"); + } + const input = value as { instructions?: unknown }; + if (!Array.isArray(input.instructions)) { + throw new Error("instructions must be an array"); + } + + return input.instructions.map((instruction) => { + if (!instruction || typeof instruction !== "object") { + throw new Error("instruction is malformed"); + } + const item = instruction as Record; + if ( + typeof item.programId !== "string" || + typeof item.data !== "string" || + !Array.isArray(item.keys) + ) { + throw new Error("instruction is malformed"); + } + return { + programId: item.programId, + data: item.data, + keys: item.keys.map((key) => { + if (!key || typeof key !== "object") { + throw new Error("instruction account is malformed"); + } + const meta = key as Record; + if ( + typeof meta.pubkey !== "string" || + typeof meta.isSigner !== "boolean" || + typeof meta.isWritable !== "boolean" + ) { + throw new Error("instruction account is malformed"); + } + return { + pubkey: meta.pubkey, + isSigner: meta.isSigner, + isWritable: meta.isWritable, + }; + }), + }; + }); +} + +function toTransactionInstruction(instruction: SerializedAdminInstruction): TransactionInstruction { + return new TransactionInstruction({ + programId: new PublicKey(instruction.programId), + keys: instruction.keys.map((key) => ({ + pubkey: new PublicKey(key.pubkey), + isSigner: key.isSigner, + isWritable: key.isWritable, + })), + data: Buffer.from(instruction.data, "base64"), + }); +} + +async function simulateInstructions( + instructions: SerializedAdminInstruction[], + wallet: string, +) { + const connection = new Connection(getServerRpcEndpoint(), "confirmed"); + const { blockhash } = await connection.getLatestBlockhash("confirmed"); + const message = new TransactionMessage({ + payerKey: new PublicKey(wallet), + recentBlockhash: blockhash, + instructions: instructions.map(toTransactionInstruction), + }).compileToV0Message(); + const tx = new VersionedTransaction(message); + + const result = await connection.simulateTransaction(tx, { + sigVerify: false, + replaceRecentBlockhash: true, + }); + if (result.value.err) { + throw new Error(`Instruction simulation failed: ${JSON.stringify(result.value.err)}`); + } + return result.value.logs ?? []; +} + +export async function POST(request: Request) { + try { + const bodyText = await request.text(); + const authorization = await authorizeAdminAccess({ + wallet: request.headers.get("x-admin-wallet"), + signature: request.headers.get("x-admin-signature"), + issuedAt: request.headers.get("x-admin-issued-at"), + nonce: request.headers.get("x-admin-nonce"), + domain: getAdminAuthDomain(request), + method: request.method, + route: getAdminAuthRoute(request), + bodyHash: hashBodyText(bodyText), + }); + + if (!authorization.ok || !authorization.isAdmin) { + return NextResponse.json( + { + error: authorization.ok + ? "Connected wallet is not authorized" + : authorization.error, + }, + { status: 401 }, + ); + } + + const payload = JSON.parse(bodyText) as unknown; + const instructions = parseInstructions(payload); + const decoded = validateAdminInstructions( + instructions, + authorization.identity, + ); + const simulationLogs = await simulateInstructions( + instructions, + authorization.identity.wallet, + ); + + return NextResponse.json( + { decodedInstructions: decoded, simulationLogs }, + { headers: { "Cache-Control": "no-store" } }, + ); + } catch (error: unknown) { + const message = + error instanceof Error ? error.message : "Admin instruction validation failed"; + return NextResponse.json({ error: message }, { status: 400 }); + } +} diff --git a/ts/apps/admin/app/api/geoblocking/route.ts b/ts/apps/admin/app/api/geoblocking/route.ts index 6a3f31c..14907d4 100644 --- a/ts/apps/admin/app/api/geoblocking/route.ts +++ b/ts/apps/admin/app/api/geoblocking/route.ts @@ -8,7 +8,7 @@ import { authorizeAdminAccess, authorizeGeoblockingUpdate, } from "@/lib/geoblocking-auth"; -import { getAdminAuthRoute, getEmptyBodyHash } from "@/lib/admin-auth-nonce"; +import { getAdminAuthDomain, getAdminAuthRoute, getEmptyBodyHash } from "@/lib/admin-auth-nonce"; export const runtime = "nodejs"; @@ -19,6 +19,7 @@ export async function GET(request: Request) { signature: request.headers.get("x-admin-signature"), issuedAt: request.headers.get("x-admin-issued-at"), nonce: request.headers.get("x-admin-nonce"), + domain: getAdminAuthDomain(request), method: request.method, route: getAdminAuthRoute(request), bodyHash: getEmptyBodyHash(), @@ -50,6 +51,7 @@ export async function PUT(request: Request) { signature: request.headers.get("x-admin-signature"), issuedAt: request.headers.get("x-admin-issued-at"), nonce: request.headers.get("x-admin-nonce"), + domain: getAdminAuthDomain(request), method: request.method, route: getAdminAuthRoute(request), bodyText, diff --git a/ts/apps/admin/app/api/support-requests/route.ts b/ts/apps/admin/app/api/support-requests/route.ts index e307b2d..9ebaaf7 100644 --- a/ts/apps/admin/app/api/support-requests/route.ts +++ b/ts/apps/admin/app/api/support-requests/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from "next/server"; import { listSupportRequestsPage } from "@/lib/support-requests"; import { authorizeAdminAccess } from "@/lib/geoblocking-auth"; -import { getAdminAuthRoute, getEmptyBodyHash } from "@/lib/admin-auth-nonce"; +import { getAdminAuthDomain, getAdminAuthRoute, getEmptyBodyHash } from "@/lib/admin-auth-nonce"; export const runtime = "nodejs"; @@ -17,6 +17,7 @@ export async function GET(request: Request) { signature: request.headers.get("x-admin-signature"), issuedAt: request.headers.get("x-admin-issued-at"), nonce: request.headers.get("x-admin-nonce"), + domain: getAdminAuthDomain(request), method: request.method, route: getAdminAuthRoute(request), bodyHash: getEmptyBodyHash(), diff --git a/ts/apps/admin/app/login/page.tsx b/ts/apps/admin/app/login/page.tsx index 8eda3ac..d7d3f54 100644 --- a/ts/apps/admin/app/login/page.tsx +++ b/ts/apps/admin/app/login/page.tsx @@ -71,9 +71,8 @@ export default function LoginPage() { {connected && !isLoading && !error && !isAdmin && (

- Connected wallet is not the pool admin. Please connect the admin - wallet. - {adminAddress ? ` Current admin: ${adminAddress}` : ""} + Connected wallet is not authorized for admin access. + {adminAddress ? ` Current pool authority: ${adminAddress}` : ""}

)} diff --git a/ts/apps/admin/components/fees-card.tsx b/ts/apps/admin/components/fees-card.tsx index 1775130..ec28b32 100644 --- a/ts/apps/admin/components/fees-card.tsx +++ b/ts/apps/admin/components/fees-card.tsx @@ -15,7 +15,8 @@ import { getProgram, PROGRAM_ID, } from "@/lib/program"; -import { sendAndConfirmWalletTransaction } from "@/lib/sendAndConfirmWalletTransaction"; +import { useAuth } from "@/lib/auth"; +import { useAdminTransaction } from "@/hooks/useAdminTransaction"; interface FeeConfigLike { adminWallet: string; @@ -49,6 +50,8 @@ function getErrorMessage(error: unknown, fallback: string): string { export function FeesCard() { const { connection } = useConnection(); const wallet = useWallet(); + const { isAdmin } = useAuth(); + const { authority, isSquadsMode, submit } = useAdminTransaction(); const [state, setState] = useState(null); const [loading, setLoading] = useState(true); @@ -112,12 +115,7 @@ export function FeesCard() { [claimFeeInput], ); - const connectedWalletBase58 = wallet.publicKey?.toBase58() ?? null; - const adminWalletBase58 = state?.admin ?? null; - const isAuthorizedWallet = - !!connectedWalletBase58 && - !!adminWalletBase58 && - connectedWalletBase58 === adminWalletBase58; + const isAuthorizedWallet = isAdmin; const hasChanges = !!state && @@ -130,6 +128,8 @@ export function FeesCard() { if ( !program || !wallet.publicKey || + !authority || + !state || parsedPurchaseFeeBps === null || parsedClaimFeeBps === null ) { @@ -146,21 +146,34 @@ export function FeesCard() { .accounts({ pool: poolPda, feeConfig: feeConfigPda, - admin: wallet.publicKey, + admin: authority, systemProgram: SystemProgram.programId, }) .instruction(); - const tx = new Transaction(); - tx.add(ix); - - const signature = await sendAndConfirmWalletTransaction({ - connection, - wallet, - transaction: tx, + const result = await submit({ + instructions: [ix], + memo: "BunkerCash admin: set fee config", + review: { + fields: [ + { + label: "purchase fee old -> new", + value: `${formatPercentFromBps(state.purchaseFeeBps)}% -> ${formatPercentFromBps(parsedPurchaseFeeBps)}%`, + }, + { + label: "claim fee old -> new", + value: `${formatPercentFromBps(state.claimFeeBps)}% -> ${formatPercentFromBps(parsedClaimFeeBps)}%`, + }, + { label: "pool PDA", value: poolPda.toBase58() }, + ], + }, }); - setTxSuccess(signature); + setTxSuccess( + result.mode === "squads-v4" + ? `Fee configuration proposal created. Squads: ${result.squadsUrl}` + : `Fee configuration updated. Tx: ${shortPk(result.signature)}`, + ); setPurchaseFeeInput(""); setClaimFeeInput(""); await fetchState(); @@ -224,9 +237,9 @@ export function FeesCard() {
-

Admin Wallet

+

Pool Authority

{shortPk(state.admin)}

-

Only this wallet can update fees.

+

Admin access is verified by the server.

@@ -284,12 +297,11 @@ export function FeesCard() { {!wallet.publicKey ? (
- Connect the admin wallet to update fees. + Connect an authorized admin wallet to update fees.
) : !isAuthorizedWallet ? (
- Connected wallet {shortPk(connectedWalletBase58 ?? "")} does not match the on-chain admin{" "} - {shortPk(state.admin)}. + Connected wallet is not authorized for admin updates.
) : null} @@ -301,7 +313,7 @@ export function FeesCard() { {txSuccess && (
- Fee configuration updated. Transaction: {shortPk(txSuccess)} + {txSuccess}
)} @@ -321,7 +333,7 @@ export function FeesCard() { type="button" > {submitting ? : } - {submitting ? "Saving..." : "Save Fees"} + {submitting ? "Saving..." : isSquadsMode ? "Create Proposal" : "Save Fees"} diff --git a/ts/apps/admin/components/master-operations-card.tsx b/ts/apps/admin/components/master-operations-card.tsx index 1ef8f87..0ca032a 100644 --- a/ts/apps/admin/components/master-operations-card.tsx +++ b/ts/apps/admin/components/master-operations-card.tsx @@ -3,7 +3,7 @@ import { useMemo, useState } from "react"; import { BN } from "@coral-xyz/anchor"; import { useConnection, useWallet } from "@solana/wallet-adapter-react"; -import { PublicKey, SendTransactionError, Transaction } from "@solana/web3.js"; +import { PublicKey, Transaction } from "@solana/web3.js"; import { ASSOCIATED_TOKEN_PROGRAM_ID, createAssociatedTokenAccountIdempotentInstruction, @@ -18,8 +18,8 @@ import { Wallet, } from "lucide-react"; import { useMasterWithdrawals } from "@/hooks/useMasterWithdrawals"; -import { sendAndConfirmWalletTransaction } from "@/lib/sendAndConfirmWalletTransaction"; import { usePayoutVault } from "@/hooks/usePayoutVault"; +import { useAdminTransaction, type AdminTransactionResult } from "@/hooks/useAdminTransaction"; import { getMasterPoolPda, getMasterPoolSignerPda, @@ -74,10 +74,6 @@ interface MasterProgramMethods { }; } -interface ProviderLike { - sendAndConfirm: (tx: Transaction) => Promise; -} - function formatTimestamp(raw: string): string { return new Date(Number(raw) * 1000).toLocaleDateString("en-US", { month: "short", @@ -106,6 +102,7 @@ export function MasterOperationsCard() { const { connection } = useConnection(); const wallet = useWallet(); const { isAdmin } = useAuth(); + const { authority, isSquadsMode, submit } = useAdminTransaction(); const { publicKey, signTransaction, signAllTransactions } = wallet; const { pool, withdrawals, loading, error, refresh } = useMasterWithdrawals(); const { balance: payoutVaultBalance, refresh: refreshVault } = @@ -125,7 +122,9 @@ export function MasterOperationsCard() { const [txError, setTxError] = useState(null); const [txSuccess, setTxSuccess] = useState<{ label: string; - signature: string; + signature?: string; + href?: string; + hrefLabel?: string; } | null>(null); const poolPda = useMemo(() => getMasterPoolPda(MASTER_PROGRAM_ID), []); @@ -199,8 +198,25 @@ export function MasterOperationsCard() { return cluster === "mainnet-beta" ? base : `${base}?cluster=${cluster}`; }; + const formatAdminResult = ( + label: string, + result: AdminTransactionResult, + ) => + result.mode === "squads-v4" + ? { + label: `${label} proposal created`, + href: result.squadsUrl, + hrefLabel: "Open in Squads", + } + : { + label, + signature: result.signature, + href: explorerTxUrl(result.signature), + hrefLabel: shortPk(result.signature), + }; + const buildAtaInstructions = () => { - if (!wallet.publicKey || !usdcMint || !usdcTokenProgram) return null; + if (!authority || !usdcMint || !usdcTokenProgram) return null; const payoutUsdcVault = getAssociatedTokenAddressSync( usdcMint, @@ -211,25 +227,25 @@ export function MasterOperationsCard() { ); const adminUsdcAta = getAssociatedTokenAddressSync( usdcMint, - wallet.publicKey, - false, + authority, + true, usdcTokenProgram, ASSOCIATED_TOKEN_PROGRAM_ID, ); const ensurePayoutVaultIx = createAssociatedTokenAccountIdempotentInstruction( - wallet.publicKey, + authority, payoutUsdcVault, poolSignerPda, usdcMint, usdcTokenProgram, ASSOCIATED_TOKEN_PROGRAM_ID, - ); + ); const ensureAdminAtaIx = createAssociatedTokenAccountIdempotentInstruction( - wallet.publicKey, + authority, adminUsdcAta, - wallet.publicKey, + authority, usdcMint, usdcTokenProgram, ASSOCIATED_TOKEN_PROGRAM_ID, @@ -270,7 +286,7 @@ export function MasterOperationsCard() { }; const handleMasterWithdraw = async () => { - if (!program || !wallet.publicKey || !pool || !usdcMint || !usdcTokenProgram) return; + if (!program || !wallet.publicKey || !authority || !pool || !usdcMint || !usdcTokenProgram) return; const amount = parseUsdcInput(withdrawAmount); if (!amount) { @@ -305,26 +321,27 @@ export function MasterOperationsCard() { masterUsdc: ataState.adminUsdcAta, supportedUsdcConfig: supportedUsdcConfigPda, usdcMint, - masterWallet: wallet.publicKey, + masterWallet: authority, usdcTokenProgram, }) .instruction(); - const tx = new Transaction(); - tx.add(ataState.ensurePayoutVaultIx); - tx.add(ataState.ensureAdminAtaIx); - tx.add(ix); - - const signature = await sendAndConfirmWalletTransaction({ - connection, - wallet, - transaction: tx, + const result = await submit({ + instructions: [ataState.ensurePayoutVaultIx, ataState.ensureAdminAtaIx, ix], + memo: "BunkerCash admin: master withdraw", + review: { + fields: [ + { label: "pool PDA", value: poolPda.toBase58() }, + { label: "source vault", value: ataState.payoutUsdcVault.toBase58() }, + { label: "destination account", value: ataState.adminUsdcAta.toBase58() }, + { label: "USDC mint", value: usdcMint.toBase58() }, + { label: "amount", value: `$${formatUsdc(amount)}` }, + { label: "withdrawal PDA", value: nextWithdrawalPda.toBase58() }, + ], + }, }); - setTxSuccess({ - label: "Withdrawal recorded and sent to admin wallet", - signature, - }); + setTxSuccess(formatAdminResult("Withdrawal recorded and sent to admin wallet", result)); setWithdrawAmount(""); setMetadataInput(""); refresh(); @@ -343,7 +360,7 @@ export function MasterOperationsCard() { }; const handleProfit = async () => { - if (!program || !wallet.publicKey || !profitTarget || !usdcMint || !usdcTokenProgram) return; + if (!program || !wallet.publicKey || !authority || !profitTarget || !usdcMint || !usdcTokenProgram) return; const amount = parseUsdcInput(profitAmount); if (!amount) { @@ -369,26 +386,27 @@ export function MasterOperationsCard() { poolUsdc: ataState.payoutUsdcVault, supportedUsdcConfig: supportedUsdcConfigPda, usdcMint, - masterWallet: wallet.publicKey, + masterWallet: authority, usdcTokenProgram, }) .instruction(); - const tx = new Transaction(); - tx.add(ataState.ensurePayoutVaultIx); - tx.add(ataState.ensureAdminAtaIx); - tx.add(ix); - - const signature = await sendAndConfirmWalletTransaction({ - connection, - wallet, - transaction: tx, + const result = await submit({ + instructions: [ataState.ensurePayoutVaultIx, ataState.ensureAdminAtaIx, ix], + memo: "BunkerCash admin: master profit", + review: { + fields: [ + { label: "pool PDA", value: poolPda.toBase58() }, + { label: "source account", value: ataState.adminUsdcAta.toBase58() }, + { label: "destination vault", value: ataState.payoutUsdcVault.toBase58() }, + { label: "USDC mint", value: usdcMint.toBase58() }, + { label: "amount", value: `$${formatUsdc(amount)}` }, + { label: "withdrawal", value: `#${profitTarget.id}` }, + ], + }, }); - setTxSuccess({ - label: `Recorded profit against withdrawal #${profitTarget.id}`, - signature, - }); + setTxSuccess(formatAdminResult(`Recorded profit against withdrawal #${profitTarget.id}`, result)); setProfitAmount(""); refresh(); refreshVault(); @@ -400,7 +418,7 @@ export function MasterOperationsCard() { }; const handleRepay = async () => { - if (!program || !wallet.publicKey || !repayTarget || !usdcMint || !usdcTokenProgram) return; + if (!program || !wallet.publicKey || !authority || !repayTarget || !usdcMint || !usdcTokenProgram) return; const amount = parseUsdcInput(repayAmount); if (!amount) { @@ -434,26 +452,31 @@ export function MasterOperationsCard() { poolUsdc: ataState.payoutUsdcVault, supportedUsdcConfig: supportedUsdcConfigPda, usdcMint, - masterWallet: wallet.publicKey, + masterWallet: authority, usdcTokenProgram, }) .instruction(); - const tx = new Transaction(); - tx.add(ataState.ensurePayoutVaultIx); - tx.add(ataState.ensureAdminAtaIx); - tx.add(ix); - - const signature = await sendAndConfirmWalletTransaction({ - connection, - wallet, - transaction: tx, + const result = await submit({ + instructions: [ataState.ensurePayoutVaultIx, ataState.ensureAdminAtaIx, ix], + memo: "BunkerCash admin: master repay", + review: { + fields: [ + { label: "pool PDA", value: poolPda.toBase58() }, + { label: "source account", value: ataState.adminUsdcAta.toBase58() }, + { label: "destination vault", value: ataState.payoutUsdcVault.toBase58() }, + { label: "USDC mint", value: usdcMint.toBase58() }, + { label: "amount", value: `$${formatUsdc(amount)}` }, + { + label: "remaining old -> new", + value: `$${formatUsdc(remaining)} -> $${formatUsdc(remaining - amount)}`, + }, + { label: "withdrawal", value: `#${repayTarget.id}` }, + ], + }, }); - setTxSuccess({ - label: `Repaid $${formatUsdc(amount)} against withdrawal #${repayTarget.id}`, - signature, - }); + setTxSuccess(formatAdminResult(`Repaid $${formatUsdc(amount)} against withdrawal #${repayTarget.id}`, result)); setRepayAmount(""); refresh(); refreshVault(); @@ -465,7 +488,7 @@ export function MasterOperationsCard() { }; const handleClose = async () => { - if (!program || !wallet.publicKey || !closeTarget || !usdcMint || !usdcTokenProgram) return; + if (!program || !wallet.publicKey || !authority || !closeTarget || !usdcMint || !usdcTokenProgram) return; const amount = parseUsdcInput(closeAmount, { allowZero: true }); if (amount === null) { @@ -494,20 +517,28 @@ export function MasterOperationsCard() { poolUsdc: ataState.payoutUsdcVault, supportedUsdcConfig: supportedUsdcConfigPda, usdcMint, - masterWallet: wallet.publicKey, + masterWallet: authority, usdcTokenProgram, }) .instruction(); - const tx = new Transaction(); - tx.add(ataState.ensurePayoutVaultIx); - tx.add(ataState.ensureAdminAtaIx); - tx.add(ix); - - const signature = await sendAndConfirmWalletTransaction({ - connection, - wallet, - transaction: tx, + const result = await submit({ + instructions: [ataState.ensurePayoutVaultIx, ataState.ensureAdminAtaIx, ix], + memo: "BunkerCash admin: master close withdrawal", + review: { + fields: [ + { label: "pool PDA", value: poolPda.toBase58() }, + { label: "source account", value: ataState.adminUsdcAta.toBase58() }, + { label: "destination vault", value: ataState.payoutUsdcVault.toBase58() }, + { label: "USDC mint", value: usdcMint.toBase58() }, + { label: "return amount", value: `$${formatUsdc(amount)}` }, + { + label: "remaining old -> new", + value: `$${formatUsdc(BigInt(closeTarget.remaining))} -> $0.00`, + }, + { label: "withdrawal", value: `#${closeTarget.id}` }, + ], + }, }); const remaining = BigInt(closeTarget.remaining); @@ -519,10 +550,7 @@ export function MasterOperationsCard() { label = `Closed withdrawal #${closeTarget.id} with loss of $${formatUsdc(-pnlDelta)}`; } - setTxSuccess({ - label, - signature, - }); + setTxSuccess(formatAdminResult(label, result)); setCloseAmount(""); refresh(); refreshVault(); @@ -568,7 +596,7 @@ export function MasterOperationsCard() {
- Pool Admin + Pool Authority

{adminWallet?.toBase58() ?? "Pool not found"} @@ -604,7 +632,7 @@ export function MasterOperationsCard() {

- Connect the current pool admin wallet to submit master operations. + Connect an authorized admin wallet to submit master operations.

)} @@ -613,8 +641,8 @@ export function MasterOperationsCard() {

- Connected wallet {shortPk(wallet.publicKey.toBase58())} is not the - current pool admin. + Connected wallet {shortPk(wallet.publicKey.toBase58())} is not + authorized for admin updates.

)} @@ -641,15 +669,17 @@ export function MasterOperationsCard() { )} @@ -659,7 +689,7 @@ export function MasterOperationsCard() {

Master Withdraw

- Moves USDC from the payout vault to the connected admin wallet and + Moves USDC from the payout vault to the admin authority wallet and records a withdrawal without changing reference value or the reference rate.

@@ -705,7 +735,11 @@ export function MasterOperationsCard() { {submitting === "withdraw" && ( )} - {submitting === "withdraw" ? "Submitting..." : "Create Withdrawal"} + {submitting === "withdraw" + ? "Submitting..." + : isSquadsMode + ? "Create Proposal" + : "Create Withdrawal"}
@@ -770,7 +804,11 @@ export function MasterOperationsCard() { {submitting === "repay" && ( )} - {submitting === "repay" ? "Submitting..." : "Repay Withdrawal"} + {submitting === "repay" + ? "Submitting..." + : isSquadsMode + ? "Create Proposal" + : "Repay Withdrawal"} @@ -837,7 +875,11 @@ export function MasterOperationsCard() { {submitting === "profit" && ( )} - {submitting === "profit" ? "Submitting..." : "Record Profit"} + {submitting === "profit" + ? "Submitting..." + : isSquadsMode + ? "Create Proposal" + : "Record Profit"} @@ -924,7 +966,11 @@ export function MasterOperationsCard() { {submitting === "close" && ( )} - {submitting === "close" ? "Submitting..." : "Close Withdrawal"} + {submitting === "close" + ? "Submitting..." + : isSquadsMode + ? "Create Proposal" + : "Close Withdrawal"} diff --git a/ts/apps/admin/components/mint-setup-card.tsx b/ts/apps/admin/components/mint-setup-card.tsx index c8bc700..f79f035 100644 --- a/ts/apps/admin/components/mint-setup-card.tsx +++ b/ts/apps/admin/components/mint-setup-card.tsx @@ -6,8 +6,8 @@ import { PublicKey, SYSVAR_INSTRUCTIONS_PUBKEY, SystemProgram, Transaction } fro import { TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; import { AlertCircle, CheckCircle2, Coins, Loader2, RefreshCw } from "lucide-react"; import { getBunkercashMintPda, getPoolPda, getProgram, PROGRAM_ID } from "@/lib/program"; -import { sendAndConfirmWalletTransaction } from "@/lib/sendAndConfirmWalletTransaction"; import type { PoolDataResponse } from "@/lib/solana-server"; +import { useAdminTransaction } from "@/hooks/useAdminTransaction"; const TOKEN_METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); const DEFAULT_TOKEN_NAME = "BunkerCash"; @@ -60,6 +60,7 @@ interface MintSetupMethods { export function MintSetupCard() { const { connection } = useConnection(); const wallet = useWallet(); + const { authority, isSquadsMode, submit } = useAdminTransaction(); const program = useMemo( () => (wallet.publicKey ? getProgram(connection, wallet) : null), @@ -112,14 +113,14 @@ export function MintSetupCard() { } finally { setLoading(false); } - }, [connection, metadataPda, mintPda, poolPda, program]); + }, [connection, metadataPda, mintPda]); useEffect(() => { void fetchState(); }, [fetchState]); const handleInitializeMint = async () => { - if (!program || !wallet.publicKey) return; + if (!program || !wallet.publicKey || !authority) return; setSubmittingAction("mint"); setError(null); @@ -132,19 +133,30 @@ export function MintSetupCard() { .accounts({ pool: poolPda, bunkercashMint: mintPda, - admin: wallet.publicKey, + admin: authority, tokenProgram: TOKEN_2022_PROGRAM_ID, systemProgram: SystemProgram.programId, }) .instruction(); - const signature = await sendAndConfirmWalletTransaction({ - connection, - wallet, - transaction: new Transaction().add(ix), + const result = await submit({ + instructions: [ix], + memo: "BunkerCash admin: create mint", + review: { + fields: [ + { label: "pool PDA", value: poolPda.toBase58() }, + { label: "mint PDA", value: mintPda.toBase58() }, + { label: "current mint state", value: isMintInitialized ? "initialized" : "uninitialized" }, + { label: "mint state old -> new", value: "uninitialized -> initialized" }, + ], + }, }); - setSuccess(`Mint initialized. Tx: ${signature}`); + setSuccess( + result.mode === "squads-v4" + ? `Mint initialization proposal created. Squads: ${result.squadsUrl}` + : `Mint initialized. Tx: ${result.signature}`, + ); setIsMintInitialized(true); await fetchState(); } catch (e) { @@ -156,7 +168,7 @@ export function MintSetupCard() { }; const handleSaveMetadata = async () => { - if (!program || !wallet.publicKey) return; + if (!program || !wallet.publicKey || !authority) return; const name = tokenName.trim(); const symbol = tokenSymbol.trim(); @@ -177,14 +189,14 @@ export function MintSetupCard() { ? methodsApi.updateMintMetadata(name, symbol, uri).accounts({ pool: poolPda, bunkercashMint: mintPda, - admin: wallet.publicKey, + admin: authority, metadata: metadataPda, tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, }) : methodsApi.initMintMetadata(name, symbol, uri).accounts({ pool: poolPda, bunkercashMint: mintPda, - admin: wallet.publicKey, + admin: authority, metadata: metadataPda, tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, tokenProgram: TOKEN_2022_PROGRAM_ID, @@ -193,13 +205,30 @@ export function MintSetupCard() { }); const ix = await builder.instruction(); - const signature = await sendAndConfirmWalletTransaction({ - connection, - wallet, - transaction: new Transaction().add(ix), + const result = await submit({ + instructions: [ix], + memo: isMetadataInitialized + ? "BunkerCash admin: update mint metadata" + : "BunkerCash admin: initialize mint metadata", + review: { + fields: [ + { label: "pool PDA", value: poolPda.toBase58() }, + { label: "mint PDA", value: mintPda.toBase58() }, + { label: "metadata PDA", value: metadataPda.toBase58() }, + { + label: "metadata initialized old -> new", + value: `${isMetadataInitialized ? "yes" : "no"} -> yes`, + }, + { label: "token name", value: name }, + { label: "token symbol", value: symbol }, + { label: "metadata URI", value: uri }, + ], + }, }); setSuccess( - `${isMetadataInitialized ? "Metadata updated" : "Metadata initialized"}. Tx: ${signature}`, + result.mode === "squads-v4" + ? `${isMetadataInitialized ? "Metadata update" : "Metadata initialization"} proposal created. Squads: ${result.squadsUrl}` + : `${isMetadataInitialized ? "Metadata updated" : "Metadata initialized"}. Tx: ${result.signature}`, ); setIsMetadataInitialized(true); await fetchState(); @@ -222,7 +251,7 @@ export function MintSetupCard() {

BunkerCash Mint

The acquire flow requires the on-chain `bunkercash_mint` PDA to exist. This is a one-time - admin action signed by your Phantom wallet. + privileged admin action.

@@ -255,7 +284,7 @@ export function MintSetupCard() {
On-Chain Admin
- {masterWallet ?? "Connect admin wallet to load"} + {masterWallet ?? "Connect authorized wallet to load"}
@@ -274,7 +303,7 @@ export function MintSetupCard() { ) : (
- Mint PDA is missing. Initialize it once from this admin wallet. + Mint PDA is missing. Initialize it once from an authorized admin session.
)} @@ -319,10 +348,10 @@ export function MintSetupCard() { className="inline-flex items-center gap-2 rounded-xl bg-[#00FFB2] px-4 py-2.5 text-sm font-semibold text-black transition hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50" > {submittingAction === "mint" ? : } - Initialize BunkerCash Mint + {isSquadsMode ? "Create Proposal" : "Initialize BunkerCash Mint"} - {!wallet.publicKey && Connect your admin Phantom wallet first.} + {!wallet.publicKey && Connect an authorized admin wallet first.}
@@ -381,7 +410,11 @@ export function MintSetupCard() { ) : ( )} - {isMetadataInitialized ? "Update Metadata" : "Set Metadata"} + {isSquadsMode + ? "Create Proposal" + : isMetadataInitialized + ? "Update Metadata" + : "Set Metadata"} {!isMintInitialized && ( diff --git a/ts/apps/admin/components/purchase-limits-card.tsx b/ts/apps/admin/components/purchase-limits-card.tsx index edbbd99..c7333f1 100644 --- a/ts/apps/admin/components/purchase-limits-card.tsx +++ b/ts/apps/admin/components/purchase-limits-card.tsx @@ -3,7 +3,7 @@ import { useCallback, useEffect, useMemo, useState } from "react"; import { BN } from "@coral-xyz/anchor"; import { useConnection, useWallet } from "@solana/wallet-adapter-react"; -import { PublicKey, SendTransactionError, SystemProgram, Transaction } from "@solana/web3.js"; +import { PublicKey, SystemProgram, Transaction } from "@solana/web3.js"; import { ASSOCIATED_TOKEN_PROGRAM_ID, createAssociatedTokenAccountInstruction, @@ -11,7 +11,6 @@ import { } from "@solana/spl-token"; import { AlertCircle, DollarSign, Info, Loader2, RefreshCw, Settings } from "lucide-react"; import { usePayoutVault } from "@/hooks/usePayoutVault"; -import { sendAndConfirmWalletTransaction } from "@/lib/sendAndConfirmWalletTransaction"; import { getProgram, getReadonlyProgram, @@ -22,6 +21,8 @@ import { PROGRAM_ID, } from "@/lib/program"; import { formatUsdc, parseUsdcInput, shortPk } from "@/lib/master-operations"; +import { useAuth } from "@/lib/auth"; +import { useAdminTransaction } from "@/hooks/useAdminTransaction"; interface Stringable { toString(): string; @@ -81,10 +82,6 @@ interface SetSupportedUsdcMintMethods { }; } -interface ProviderLike { - sendAndConfirm: (tx: Transaction) => Promise; -} - function parseLimitInput(value: string): bigint | null { const trimmed = value.trim(); if (trimmed === "") return null; @@ -99,6 +96,8 @@ function getErrorMessage(error: unknown, fallback: string): string { export function PurchaseLimitsCard() { const { connection } = useConnection(); const wallet = useWallet(); + const { isAdmin } = useAuth(); + const { authority, isSquadsMode, submit } = useAdminTransaction(); const { balance: vaultBalance, loading: vaultLoading, @@ -233,15 +232,10 @@ export function PurchaseLimitsCard() { return null; } }, [mintInput]); - const connectedWalletBase58 = wallet.publicKey?.toBase58() ?? null; - const adminWalletBase58 = state?.admin ?? null; - const isAuthorizedWallet = - !!connectedWalletBase58 && - !!adminWalletBase58 && - connectedWalletBase58 === adminWalletBase58; + const isAuthorizedWallet = isAdmin; const handleSave = async () => { - if (!program || !wallet.publicKey || parsedLimit === null) return; + if (!program || !wallet.publicKey || !authority || parsedLimit === null) return; setSubmitting(true); setError(null); @@ -253,19 +247,34 @@ export function PurchaseLimitsCard() { .accounts({ pool: poolPda, purchaseLimitConfig: purchaseLimitConfigPda, - admin: wallet.publicKey, + admin: authority, systemProgram: SystemProgram.programId, }) .instruction(); - const tx = new Transaction().add(ix); - const signature = await sendAndConfirmWalletTransaction({ - connection, - wallet, - transaction: tx, + const result = await submit({ + instructions: [ix], + memo: "BunkerCash admin: set purchase limit", + review: { + fields: [ + { + label: "purchase limit old -> new", + value: `$${formatUsdc(state?.purchaseLimitUsdcRaw ?? BigInt(0))} -> $${formatUsdc(parsedLimit)}`, + }, + { + label: "total deposited counter", + value: `$${formatUsdc(state?.totalDepositedUsdcRaw ?? BigInt(0))}`, + }, + { label: "pool PDA", value: poolPda.toBase58() }, + ], + }, }); - setTxSuccess(signature); + setTxSuccess( + result.mode === "squads-v4" + ? `Purchase limit proposal created. Squads: ${result.squadsUrl}` + : `Purchase limit updated. Tx: ${shortPk(result.signature)}`, + ); await fetchState(); await refreshVault(); } catch (e: unknown) { @@ -276,7 +285,7 @@ export function PurchaseLimitsCard() { }; const handleMintSave = async () => { - if (!program || !wallet.publicKey || !parsedMint || !state?.supportedUsdcMint) return; + if (!program || !wallet.publicKey || !authority || !parsedMint || !state?.supportedUsdcMint) return; setSubmitting(true); setError(null); @@ -318,19 +327,19 @@ export function PurchaseLimitsCard() { currentPoolUsdc, usdcMint: parsedMint, nextPoolUsdc, - admin: wallet.publicKey, + admin: authority, currentUsdcTokenProgram, usdcTokenProgram, systemProgram: SystemProgram.programId, }) .instruction(); - const tx = new Transaction(); + const instructions: Transaction["instructions"] = []; const nextPoolUsdcInfo = await connection.getAccountInfo(nextPoolUsdc, "confirmed"); if (!nextPoolUsdcInfo) { - tx.add( + instructions.push( createAssociatedTokenAccountInstruction( - wallet.publicKey, + authority, nextPoolUsdc, poolPda, parsedMint, @@ -339,14 +348,28 @@ export function PurchaseLimitsCard() { ) ); } - tx.add(ix); - const signature = await sendAndConfirmWalletTransaction({ - connection, - wallet, - transaction: tx, + instructions.push(ix); + const result = await submit({ + instructions, + memo: "BunkerCash admin: set supported USDC mint", + review: { + fields: [ + { + label: "supported USDC mint old -> new", + value: `${currentSupportedUsdcMint.toBase58()} -> ${parsedMint.toBase58()}`, + }, + { label: "current source vault", value: currentPoolUsdc.toBase58() }, + { label: "next pool vault", value: nextPoolUsdc.toBase58() }, + { label: "pool PDA", value: poolPda.toBase58() }, + ], + }, }); - setTxSuccess(signature); + setTxSuccess( + result.mode === "squads-v4" + ? `Supported mint proposal created. Squads: ${result.squadsUrl}` + : `Supported mint updated. Tx: ${shortPk(result.signature)}`, + ); await fetchState(); await refreshVault(); } catch (e: unknown) { @@ -486,13 +509,13 @@ export function PurchaseLimitsCard() { {txSuccess && (
- Configuration updated successfully. Tx: {shortPk(txSuccess)} + {txSuccess}
)} - {wallet.publicKey && adminWalletBase58 && !isAuthorizedWallet && ( + {wallet.publicKey && !isAuthorizedWallet && (
- Connected wallet {shortPk(wallet.publicKey.toBase58())} is not the current pool admin. + Connected wallet {shortPk(wallet.publicKey.toBase58())} is not authorized for admin updates.
)} @@ -539,7 +562,7 @@ export function PurchaseLimitsCard() { className="mt-4 flex h-10 w-full items-center justify-center gap-2 rounded-lg bg-[#00FFB2] text-sm font-medium text-black transition-colors hover:bg-[#00FFB2]/90 disabled:bg-neutral-800 disabled:text-neutral-600" > {submitting && } - {submitting ? "Saving..." : "Save Purchase Limit"} + {submitting ? "Saving..." : isSquadsMode ? "Create Proposal" : "Save Purchase Limit"} {state && ( @@ -563,7 +586,7 @@ export function PurchaseLimitsCard() { className="mt-4 flex h-10 w-full items-center justify-center gap-2 rounded-lg bg-neutral-200 text-sm font-medium text-black transition-colors hover:bg-white disabled:bg-neutral-800 disabled:text-neutral-600" > {submitting && } - {submitting ? "Saving..." : "Save Supported Mint"} + {submitting ? "Saving..." : isSquadsMode ? "Create Proposal" : "Save Supported Mint"}
)} @@ -572,7 +595,7 @@ export function PurchaseLimitsCard() {
- Current pool admin: {state.admin} + Current pool authority: {state.admin}
)} diff --git a/ts/apps/admin/components/settlement-card.tsx b/ts/apps/admin/components/settlement-card.tsx index 8b9f452..4c47e2d 100644 --- a/ts/apps/admin/components/settlement-card.tsx +++ b/ts/apps/admin/components/settlement-card.tsx @@ -26,6 +26,7 @@ import { } from "lucide-react"; import { useAllOpenClaims, type OpenClaim } from "@/hooks/useAllOpenClaims"; import { usePayoutVault } from "@/hooks/usePayoutVault"; +import { useAdminTransaction } from "@/hooks/useAdminTransaction"; import { getBunkercashMintPda, getMinSettlementConfigPda, @@ -178,6 +179,7 @@ export function SettlementCard() { const { connection } = useConnection(); const wallet = useWallet(); const { publicKey, signTransaction, signAllTransactions } = wallet; + const { authority, isSquadsMode, submit } = useAdminTransaction(); const { claims, closedClaims, @@ -464,7 +466,7 @@ export function SettlementCard() { vaultRaw < minSettlementUsdc; const handleSaveMinSettlement = useCallback(async () => { - if (!program || !publicKey) return; + if (!program || !publicKey || !authority) return; setSavingMinSettlement(true); setTxError(null); try { @@ -472,19 +474,32 @@ export function SettlementCard() { const methods = program.methods as unknown as { setMinSettlementUsdc: (amount: BN) => { accounts: (accounts: Record) => { - rpc: () => Promise; + instruction: () => Promise; }; }; }; - await methods + const ix = await methods .setMinSettlementUsdc(new BN(rawValue.toString())) .accounts({ pool: poolPda, minSettlementConfig: minSettlementConfigPda, - admin: publicKey, + admin: authority ?? publicKey, systemProgram: SystemProgram.programId, }) - .rpc(); + .instruction(); + await submit({ + instructions: [ix], + memo: "BunkerCash admin: set minimum settlement", + review: { + fields: [ + { + label: "minimum settlement old -> new", + value: `$${formatUsdc(minSettlementUsdc ?? BigInt(0))} -> $${formatUsdc(rawValue)}`, + }, + { label: "pool PDA", value: poolPda.toBase58() }, + ], + }, + }); setMinSettlementUsdc(rawValue); } catch (e: unknown) { setTxError( @@ -495,12 +510,13 @@ export function SettlementCard() { } finally { setSavingMinSettlement(false); } - }, [minSettlementConfigPda, minSettlementInput, poolPda, program, publicKey]); + }, [authority, minSettlementConfigPda, minSettlementInput, minSettlementUsdc, poolPda, program, publicKey, submit]); const handleOpenSettlement = useCallback(async () => { if ( !program || !publicKey || + !authority || !usdcMint || !usdcTokenProgram || !payoutVault @@ -533,11 +549,11 @@ export function SettlementCard() { const methods = program.methods as unknown as { openSettlement: () => { accounts: (accounts: Record) => { - rpc: () => Promise; + instruction: () => Promise; }; }; }; - await methods + const ix = await methods .openSettlement() .accounts({ pool: poolPda, @@ -546,11 +562,25 @@ export function SettlementCard() { usdcMint, settlementState: settlementStatePda, minSettlementConfig: minSettlementConfigPda, - masterWallet: publicKey, + masterWallet: authority ?? publicKey, usdcTokenProgram, systemProgram: SystemProgram.programId, }) - .rpc(); + .instruction(); + await submit({ + instructions: [ix], + memo: "BunkerCash admin: open settlement", + review: { + fields: [ + { label: "pool PDA", value: poolPda.toBase58() }, + { label: "source vault", value: payoutVault.toBase58() }, + { label: "USDC mint", value: usdcMint.toBase58() }, + { label: "settlement PDA", value: settlementStatePda.toBase58() }, + { label: "pending claims", value: totalRequested.toString() }, + { label: "vault balance", value: `$${formatUsdc(vaultRaw)}` }, + ], + }, + }); setEpochState("open"); setEpochStateFresh(false); await fetchSettlementEpoch(undefined, { @@ -575,15 +605,19 @@ export function SettlementCard() { poolPda, program, publicKey, + authority, refreshVault, settlementStatePda, + submit, supportedUsdcConfigPda, + totalRequested, usdcMint, usdcTokenProgram, + vaultRaw, ]); const handleCloseSettlement = useCallback(async () => { - if (!program || !publicKey) return; + if (!program || !publicKey || !authority) return; if (!epochStateFresh) { setEpochActionError( "Refresh settlement epoch state before closing the epoch.", @@ -601,18 +635,28 @@ export function SettlementCard() { const methods = program.methods as unknown as { closeSettlement: () => { accounts: (accounts: Record) => { - rpc: () => Promise; + instruction: () => Promise; }; }; }; - await methods + const ix = await methods .closeSettlement() .accounts({ pool: poolPda, settlementState: settlementStatePda, - masterWallet: publicKey, + masterWallet: authority ?? publicKey, }) - .rpc(); + .instruction(); + await submit({ + instructions: [ix], + memo: "BunkerCash admin: close settlement", + review: { + fields: [ + { label: "pool PDA", value: poolPda.toBase58() }, + { label: "settlement PDA", value: settlementStatePda.toBase58() }, + ], + }, + }); setEpochState("closed"); setEpochStateFresh(true); setEpochStateError(null); @@ -637,9 +681,11 @@ export function SettlementCard() { poolPda, program, publicKey, + authority, refreshClaims, refreshVault, settlementStatePda, + submit, ]); // migrate_claim is permissionless on-chain (the connected wallet only pays @@ -812,6 +858,7 @@ export function SettlementCard() { if ( !program || !publicKey || + !authority || !usdcMint || !usdcTokenProgram || !payoutVault || @@ -839,7 +886,7 @@ export function SettlementCard() { for (let attempt = 1; attempt <= 3; attempt += 1) { try { - const tx = new Transaction(); + const instructions: TransactionInstruction[] = []; const remainingAccounts: AccountMetaLike[] = []; for (const item of batch) { @@ -853,9 +900,9 @@ export function SettlementCard() { ASSOCIATED_TOKEN_PROGRAM_ID, ); - tx.add( + instructions.push( createAssociatedTokenAccountIdempotentInstruction( - publicKey, + authority ?? publicKey, userUsdcAta, claimUser, usdcMint, @@ -884,37 +931,39 @@ export function SettlementCard() { supportedUsdcConfig: supportedUsdcConfigPda, usdcMint, settlementState: settlementStatePda, - masterWallet: publicKey, + masterWallet: authority ?? publicKey, usdcTokenProgram, tokenProgram: TOKEN_2022_PROGRAM_ID, }) .remainingAccounts(remainingAccounts) .instruction(); - tx.add(settleIx); - - // Fetch a fresh blockhash for each attempt to avoid stale blockhash reuse - const { blockhash, lastValidBlockHeight } = - await connection.getLatestBlockhash("confirmed"); - tx.recentBlockhash = blockhash; - tx.feePayer = publicKey; - - if (!signTransaction) - throw new Error("Wallet does not support signTransaction"); - const signed = await signTransaction(tx); - const rawTx = signed.serialize(); - - const sig = await connection.sendRawTransaction(rawTx, { - skipPreflight: false, - preflightCommitment: "confirmed", + instructions.push(settleIx); + const result = await submit({ + instructions, + memo: `BunkerCash admin: settle ${batch.length} claim${batch.length === 1 ? "" : "s"}`, + review: { + fields: [ + { label: "pool PDA", value: poolPda.toBase58() }, + { label: "source vault", value: payoutVault.toBase58() }, + { label: "USDC mint", value: usdcMint.toBase58() }, + { label: "settlement PDA", value: settlementStatePda.toBase58() }, + { label: "batch claims", value: String(batch.length) }, + ], + remainingAccounts: batch.map((item, index) => ({ + label: `claim ${index + 1} -> destination`, + value: `${item.claim.pubkey} -> ${getAssociatedTokenAddressSync( + usdcMint, + new PublicKey(item.claim.user), + false, + usdcTokenProgram, + ASSOCIATED_TOKEN_PROGRAM_ID, + ).toBase58()}`, + })), + }, }); - await connection.confirmTransaction( - { signature: sig, blockhash, lastValidBlockHeight }, - "confirmed", - ); - - return sig; + return result.mode === "squads-v4" ? result.squadsUrl : result.signature; } catch (e: unknown) { if (isAlreadyProcessedError(e)) { console.info( @@ -991,11 +1040,12 @@ export function SettlementCard() { poolBunkercashEscrow, program, publicKey, - signTransaction, + authority, refreshClaims, refreshVault, settlementPlan, settlementStatePda, + submit, usdcMint, usdcTokenProgram, poolPda, @@ -1005,6 +1055,7 @@ export function SettlementCard() { const loading = claimsLoading || vaultLoading; const canSettle = !!wallet.publicKey && + !!authority && !!program && !!usdcMint && epochOpen && @@ -1182,13 +1233,13 @@ export function SettlementCard() { {minSettlementUsdc !== null && minSettlementUsdc > BigInt(0) && ( @@ -1216,6 +1267,7 @@ export function SettlementCard() { onClick={() => void handleOpenSettlement()} disabled={ !wallet.publicKey || + !authority || !program || epochLoading || migrating || @@ -1231,13 +1283,14 @@ export function SettlementCard() { {epochLoading ? ( ) : null} - Open Epoch + {epochLoading ? "Submitting..." : isSquadsMode ? "Create Proposal" : "Open Epoch"} ) : ( )} @@ -1431,7 +1484,7 @@ export function SettlementCard() { Settling... ) : ( - "Settle Open Requests" + isSquadsMode ? "Create Proposals" : "Settle Open Requests" )} diff --git a/ts/apps/admin/eslint.config.mjs b/ts/apps/admin/eslint.config.mjs index 719cea2..338cce3 100644 --- a/ts/apps/admin/eslint.config.mjs +++ b/ts/apps/admin/eslint.config.mjs @@ -15,6 +15,7 @@ const eslintConfig = [ ignores: [ "node_modules/**", ".next/**", + ".open-next/**", "out/**", "build/**", "next-env.d.ts", diff --git a/ts/apps/admin/hooks/useAdminTransaction.ts b/ts/apps/admin/hooks/useAdminTransaction.ts new file mode 100644 index 0000000..0f06a64 --- /dev/null +++ b/ts/apps/admin/hooks/useAdminTransaction.ts @@ -0,0 +1,305 @@ +"use client"; + +import { useCallback, useMemo } from "react"; +import { useConnection, useWallet } from "@solana/wallet-adapter-react"; +import { + PublicKey, + Transaction, + TransactionMessage, + VersionedTransaction, + type TransactionInstruction, +} from "@solana/web3.js"; +import * as multisig from "@sqds/multisig"; +import { getClusterFromEndpoint } from "@/lib/constants"; +import { sendAndConfirmWalletTransaction } from "@/lib/sendAndConfirmWalletTransaction"; +import { useAuth } from "@/lib/auth"; +import { buildAdminAuthHeaders, sha256Hex } from "@/lib/admin-auth-client"; +import { + buildTransactionReview, + requirePreSignReview, + type TransactionReviewInput, +} from "@/lib/transaction-review"; + +export type AdminTransactionResult = + | { + mode: "single-wallet"; + signature: string; + } + | { + mode: "squads-v4"; + signature: string; + txIndex: bigint; + proposalPda: string; + transactionPda: string; + squadsUrl: string; + autoApproved: boolean; + decodedInstructions: unknown[]; + }; + +interface SubmitAdminInstructionsInput { + instructions: TransactionInstruction[]; + memo: string; + review?: TransactionReviewInput; +} + +function serializeInstruction(instruction: TransactionInstruction) { + return { + programId: instruction.programId.toBase58(), + keys: instruction.keys.map((key) => ({ + pubkey: key.pubkey.toBase58(), + isSigner: key.isSigner, + isWritable: key.isWritable, + })), + data: Buffer.from(instruction.data).toString("base64"), + }; +} + +function getSquadsDashboardUrl(cluster: string, multisigPda: PublicKey): string { + const base = + cluster === "mainnet-beta" + ? "https://app.squads.so" + : "https://devnet.squads.so"; + return `${base}/multisig/${multisigPda.toBase58()}`; +} + +function assertSingleInstructionList(instructions: TransactionInstruction[]) { + if (instructions.length === 0) { + throw new Error("No instructions provided"); + } +} + +export function useAdminTransaction() { + const { connection } = useConnection(); + const wallet = useWallet(); + const auth = useAuth(); + + const authority = useMemo(() => { + if (auth.governanceMode === "squads-v4") { + return auth.squadsVault ? new PublicKey(auth.squadsVault) : null; + } + return wallet.publicKey ?? null; + }, [auth.governanceMode, auth.squadsVault, wallet.publicKey]); + + const submit = useCallback( + async ({ + instructions, + memo, + review, + }: SubmitAdminInstructionsInput): Promise => { + assertSingleInstructionList(instructions); + + if (!wallet.publicKey) { + throw new Error("Wallet not connected"); + } + + if (auth.governanceMode === "squads-v4") { + if (!auth.squadsMultisig || !auth.squadsVault) { + throw new Error("Squads governance is not configured for admin actions"); + } + if (!wallet.signAllTransactions) { + throw new Error("Wallet does not support signing Squads proposal transactions"); + } + if (!wallet.signMessage) { + throw new Error("Wallet does not support signing admin validation requests"); + } + + const multisigPda = new PublicKey(auth.squadsMultisig); + const vaultPda = new PublicKey(auth.squadsVault); + const vaultIndex = auth.squadsVaultIndex ?? 0; + const ms = await multisig.accounts.Multisig.fromAccountAddress( + connection, + multisigPda, + ); + const isMember = ms.members.some((member) => + member.key.equals(wallet.publicKey!), + ); + if (!isMember) { + throw new Error("Connected wallet is not a current Squads member"); + } + + const validationBody = JSON.stringify({ + memo, + instructions: instructions.map(serializeInstruction), + }); + const validationHeaders = await buildAdminAuthHeaders({ + publicKey: wallet.publicKey, + signMessage: wallet.signMessage, + method: "POST", + route: "/api/admin/validate-instructions", + bodyHash: await sha256Hex(validationBody), + }); + const validationResponse = await fetch("/api/admin/validate-instructions", { + method: "POST", + cache: "no-store", + headers: { + "content-type": "application/json", + ...validationHeaders, + }, + body: validationBody, + }); + if (!validationResponse.ok) { + const body = (await validationResponse.json().catch(() => null)) as + | { error?: unknown } + | null; + throw new Error( + typeof body?.error === "string" + ? body.error + : "Admin instruction validation failed", + ); + } + const validationResult = (await validationResponse.json().catch(() => null)) as + | { decodedInstructions?: unknown[] } + | null; + const decodedInstructions = Array.isArray(validationResult?.decodedInstructions) + ? validationResult.decodedInstructions + : []; + + requirePreSignReview( + buildTransactionReview({ + instructions, + summary: memo, + ...review, + }), + ); + + const currentIndex = BigInt(ms.transactionIndex.toString()); + const nextIndex = currentIndex + BigInt(1); + const { blockhash, lastValidBlockHeight } = + await connection.getLatestBlockhash("confirmed"); + const innerMessage = new TransactionMessage({ + payerKey: vaultPda, + recentBlockhash: blockhash, + instructions, + }); + + const createVaultTxIx = multisig.instructions.vaultTransactionCreate({ + multisigPda, + transactionIndex: nextIndex, + creator: wallet.publicKey, + vaultIndex, + ephemeralSigners: 0, + transactionMessage: innerMessage, + memo, + }); + const createProposalIx = multisig.instructions.proposalCreate({ + multisigPda, + creator: wallet.publicKey, + transactionIndex: nextIndex, + isDraft: false, + }); + + const tx1Message = new TransactionMessage({ + payerKey: wallet.publicKey, + recentBlockhash: blockhash, + instructions: [createVaultTxIx], + }).compileToV0Message(); + const tx2Message = new TransactionMessage({ + payerKey: wallet.publicKey, + recentBlockhash: blockhash, + instructions: [createProposalIx], + }).compileToV0Message(); + + const signed = await wallet.signAllTransactions([ + new VersionedTransaction(tx1Message), + new VersionedTransaction(tx2Message), + ]); + if (signed.length < 2) { + throw new Error("Wallet returned fewer signed transactions than expected"); + } + + const signature = await connection.sendTransaction(signed[0], { + preflightCommitment: "confirmed", + }); + await connection.confirmTransaction( + { signature, blockhash, lastValidBlockHeight }, + "confirmed", + ); + + try { + const proposalSignature = await connection.sendTransaction(signed[1], { + preflightCommitment: "confirmed", + }); + await connection.confirmTransaction( + { signature: proposalSignature, blockhash, lastValidBlockHeight }, + "confirmed", + ); + } catch (error: unknown) { + const message = error instanceof Error ? error.message : ""; + if (!message.toLowerCase().includes("blockhash")) throw error; + + const fresh = await connection.getLatestBlockhash("confirmed"); + const retryMessage = new TransactionMessage({ + payerKey: wallet.publicKey, + recentBlockhash: fresh.blockhash, + instructions: [createProposalIx], + }).compileToV0Message(); + const [retrySigned] = await wallet.signAllTransactions([ + new VersionedTransaction(retryMessage), + ]); + const retrySignature = await connection.sendTransaction(retrySigned, { + preflightCommitment: "confirmed", + }); + await connection.confirmTransaction( + { + signature: retrySignature, + blockhash: fresh.blockhash, + lastValidBlockHeight: fresh.lastValidBlockHeight, + }, + "confirmed", + ); + } + + const [proposalPda] = multisig.getProposalPda({ + multisigPda, + transactionIndex: nextIndex, + }); + const [transactionPda] = multisig.getTransactionPda({ + multisigPda, + index: nextIndex, + }); + const cluster = getClusterFromEndpoint(connection.rpcEndpoint ?? ""); + + return { + mode: "squads-v4", + signature, + txIndex: nextIndex, + proposalPda: proposalPda.toBase58(), + transactionPda: transactionPda.toBase58(), + squadsUrl: getSquadsDashboardUrl(cluster, multisigPda), + autoApproved: false, + decodedInstructions, + }; + } + + requirePreSignReview( + buildTransactionReview({ + instructions, + summary: memo, + ...review, + }), + ); + const tx = new Transaction(); + for (const instruction of instructions) tx.add(instruction); + const signature = await sendAndConfirmWalletTransaction({ + connection, + wallet, + transaction: tx, + }); + return { mode: "single-wallet", signature }; + }, + [ + auth.governanceMode, + auth.squadsMultisig, + auth.squadsVault, + auth.squadsVaultIndex, + connection, + wallet, + ], + ); + + return { + authority, + isSquadsMode: auth.governanceMode === "squads-v4", + submit, + }; +} diff --git a/ts/apps/admin/hooks/useMasterWithdrawals.ts b/ts/apps/admin/hooks/useMasterWithdrawals.ts index deaef34..c30684e 100644 --- a/ts/apps/admin/hooks/useMasterWithdrawals.ts +++ b/ts/apps/admin/hooks/useMasterWithdrawals.ts @@ -214,7 +214,7 @@ export function useMasterWithdrawals() { setLoading(false); } }, - [poolPda, rpcEndpoints], + [poolPda, rpcEndpoint, rpcEndpoints], ); useEffect(() => { diff --git a/ts/apps/admin/lib/admin-auth-client.ts b/ts/apps/admin/lib/admin-auth-client.ts index 8351404..54bccab 100644 --- a/ts/apps/admin/lib/admin-auth-client.ts +++ b/ts/apps/admin/lib/admin-auth-client.ts @@ -32,6 +32,7 @@ export async function sha256Hex(value: string): Promise { } async function requestAdminAuthChallenge(input: { + wallet: string; method: string; route: string; bodyHash: string; @@ -43,6 +44,7 @@ async function requestAdminAuthChallenge(input: { "content-type": "application/json", }, body: JSON.stringify({ + wallet: input.wallet, method: normalizeAdminAuthMethod(input.method), route: input.route, bodyHash: input.bodyHash, @@ -64,6 +66,14 @@ async function requestAdminAuthChallenge(input: { if ( !data || typeof data.method !== "string" || + typeof data.wallet !== "string" || + typeof data.domain !== "string" || + typeof data.env !== "string" || + typeof data.cluster !== "string" || + typeof data.programId !== "string" || + typeof data.pool !== "string" || + typeof data.squadsMultisig !== "string" || + typeof data.squadsVault !== "string" || typeof data.route !== "string" || typeof data.bodyHash !== "string" || typeof data.issuedAt !== "string" || @@ -79,6 +89,7 @@ export async function buildAdminAuthHeaders( input: AdminAuthHeadersInput, ): Promise> { const challenge = await requestAdminAuthChallenge({ + wallet: input.publicKey.toBase58(), method: input.method, route: input.route, bodyHash: input.bodyHash ?? EMPTY_BODY_SHA256, diff --git a/ts/apps/admin/lib/admin-auth-message.test.ts b/ts/apps/admin/lib/admin-auth-message.test.ts new file mode 100644 index 0000000..ecc9d8c --- /dev/null +++ b/ts/apps/admin/lib/admin-auth-message.test.ts @@ -0,0 +1,41 @@ +import { describe, expect, it } from "vitest"; +import { buildAdminAccessMessage } from "./admin-auth-message"; + +describe("admin auth message", () => { + it("pins the v2 signed message layout", () => { + expect( + buildAdminAccessMessage({ + wallet: "Wallet1111111111111111111111111111111111", + domain: "admin.bunkercash.com", + env: "production", + cluster: "mainnet-beta", + programId: "Program111111111111111111111111111111111", + pool: "Pool111111111111111111111111111111111111", + squadsMultisig: "Squads111111111111111111111111111111111", + squadsVault: "Vault1111111111111111111111111111111111", + method: "get", + route: "/api/admin/me", + bodyHash: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + issuedAt: "2026-07-05T10:00:00.000Z", + nonce: "0123456789abcdef0123456789abcdef", + }), + ).toBe( + [ + "bunkercash-admin:v2", + "wallet:Wallet1111111111111111111111111111111111", + "domain:admin.bunkercash.com", + "env:production", + "cluster:mainnet-beta", + "program-id:Program111111111111111111111111111111111", + "pool:Pool111111111111111111111111111111111111", + "squads-multisig:Squads111111111111111111111111111111111", + "squads-vault:Vault1111111111111111111111111111111111", + "method:GET", + "route:/api/admin/me", + "body-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "issued-at:2026-07-05T10:00:00.000Z", + "nonce:0123456789abcdef0123456789abcdef", + ].join("\n"), + ); + }); +}); diff --git a/ts/apps/admin/lib/admin-auth-message.ts b/ts/apps/admin/lib/admin-auth-message.ts index af35e87..d37ebdc 100644 --- a/ts/apps/admin/lib/admin-auth-message.ts +++ b/ts/apps/admin/lib/admin-auth-message.ts @@ -1,8 +1,16 @@ -export const ADMIN_AUTH_SIGNATURE_TTL_MS = 5 * 60 * 1000; +export const ADMIN_AUTH_SIGNATURE_TTL_MS = 90 * 1000; export const EMPTY_BODY_SHA256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; export interface AdminAuthRequestChallenge { + wallet: string; + domain: string; + env: string; + cluster: string; + programId: string; + pool: string; + squadsMultisig: string; + squadsVault: string; method: string; route: string; bodyHash: string; @@ -16,7 +24,15 @@ export function normalizeAdminAuthMethod(method: string): string { export function buildAdminAccessMessage(challenge: AdminAuthRequestChallenge) { return [ - "bunkercash-admin:request", + "bunkercash-admin:v2", + `wallet:${challenge.wallet}`, + `domain:${challenge.domain}`, + `env:${challenge.env}`, + `cluster:${challenge.cluster}`, + `program-id:${challenge.programId}`, + `pool:${challenge.pool}`, + `squads-multisig:${challenge.squadsMultisig}`, + `squads-vault:${challenge.squadsVault}`, `method:${normalizeAdminAuthMethod(challenge.method)}`, `route:${challenge.route}`, `body-sha256:${challenge.bodyHash}`, diff --git a/ts/apps/admin/lib/admin-auth-nonce-durable-object.test.ts b/ts/apps/admin/lib/admin-auth-nonce-durable-object.test.ts index 90dd9b5..e1c2863 100644 --- a/ts/apps/admin/lib/admin-auth-nonce-durable-object.test.ts +++ b/ts/apps/admin/lib/admin-auth-nonce-durable-object.test.ts @@ -1,8 +1,16 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { EMPTY_BODY_SHA256 } from "./admin-auth-message"; +import { ADMIN_AUTH_SIGNATURE_TTL_MS, EMPTY_BODY_SHA256 } from "./admin-auth-message"; import { AdminAuthNonceDurableObject } from "./admin-auth-nonce-durable-object"; const challenge = { + wallet: "11111111111111111111111111111112", + domain: "admin.bunkercash.com", + env: "production", + cluster: "mainnet-beta", + programId: "11111111111111111111111111111112", + pool: "11111111111111111111111111111112", + squadsMultisig: "none", + squadsVault: "none", method: "GET", route: "/api/support-requests?limit=25", bodyHash: EMPTY_BODY_SHA256, @@ -49,6 +57,16 @@ function makeRequest(path: string, payload = challenge) { }); } +function makeRateLimitRequest(maxRequests = 2, windowSeconds = 60) { + return new Request("https://admin-auth-nonce.internal/rate-limit", { + method: "POST", + headers: { + "content-type": "application/json", + }, + body: JSON.stringify({ maxRequests, windowSeconds }), + }); +} + describe("AdminAuthNonceDurableObject", () => { beforeEach(() => { vi.useFakeTimers(); @@ -97,7 +115,29 @@ describe("AdminAuthNonceDurableObject", () => { }); expect(storage.values.get("challenge")).toEqual({ ...challenge, - expiresAt: Date.parse(challenge.issuedAt) + 5 * 60 * 1000, + expiresAt: Date.parse(challenge.issuedAt) + ADMIN_AUTH_SIGNATURE_TTL_MS, + }); + }); + + it("rejects wallet/program context mismatches without consuming the nonce", async () => { + const storage = makeDurableObjectStorage(); + const durableObject = new AdminAuthNonceDurableObject(storage.state, {}); + + await durableObject.fetch(makeRequest("/issue")); + const response = await durableObject.fetch( + makeRequest("/consume", { + ...challenge, + wallet: "11111111111111111111111111111113", + }), + ); + + expect(response.status).toBe(400); + expect(await response.json()).toEqual({ + error: "Admin authorization nonce mismatch", + }); + expect(storage.values.get("challenge")).toEqual({ + ...challenge, + expiresAt: Date.parse(challenge.issuedAt) + ADMIN_AUTH_SIGNATURE_TTL_MS, }); }); @@ -106,7 +146,7 @@ describe("AdminAuthNonceDurableObject", () => { const durableObject = new AdminAuthNonceDurableObject(storage.state, {}); await durableObject.fetch(makeRequest("/issue")); - vi.setSystemTime(new Date("2026-04-07T10:05:01.000Z")); + vi.setSystemTime(new Date(Date.parse(challenge.issuedAt) + ADMIN_AUTH_SIGNATURE_TTL_MS + 1)); const response = await durableObject.fetch(makeRequest("/consume")); @@ -115,4 +155,43 @@ describe("AdminAuthNonceDurableObject", () => { error: "Admin authorization nonce expired", }); }); + + it("rejects malformed nonce payloads", async () => { + const storage = makeDurableObjectStorage(); + const durableObject = new AdminAuthNonceDurableObject(storage.state, {}); + + const response = await durableObject.fetch( + makeRequest("/issue", { + ...challenge, + nonce: "not-a-nonce", + }), + ); + + expect(response.status).toBe(400); + expect(await response.json()).toEqual({ + error: "Invalid nonce challenge", + }); + }); + + it("rate-limits challenge checks in a fixed window", async () => { + const storage = makeDurableObjectStorage(); + const durableObject = new AdminAuthNonceDurableObject(storage.state, {}); + + await expect( + durableObject.fetch(makeRateLimitRequest()), + ).resolves.toMatchObject({ status: 204 }); + await expect( + durableObject.fetch(makeRateLimitRequest()), + ).resolves.toMatchObject({ status: 204 }); + + const rejected = await durableObject.fetch(makeRateLimitRequest()); + + expect(rejected.status).toBe(429); + expect(rejected.headers.get("retry-after")).toBe("60"); + expect(await rejected.json()).toEqual({ retryAfterSeconds: 60 }); + expect(storage.values.get("rate-limit-window")).toEqual({ + count: 2, + resetAt: Date.now() + 60 * 1000, + }); + }); }); diff --git a/ts/apps/admin/lib/admin-auth-nonce-durable-object.ts b/ts/apps/admin/lib/admin-auth-nonce-durable-object.ts index 575bf5e..2d2545b 100644 --- a/ts/apps/admin/lib/admin-auth-nonce-durable-object.ts +++ b/ts/apps/admin/lib/admin-auth-nonce-durable-object.ts @@ -6,15 +6,34 @@ import { } from "./admin-auth-message"; const CHALLENGE_STORAGE_KEY = "challenge"; +const RATE_LIMIT_STORAGE_KEY = "rate-limit-window"; const CLEANUP_DELAY_MS = 60 * 1000; const NONCE_PATTERN = /^[a-f0-9]{32}$/; const BODY_HASH_PATTERN = /^[a-f0-9]{64}$/; +const PUBLIC_KEY_OR_NONE_PATTERN = /^(none|[1-9A-HJ-NP-Za-km-z]{32,44})$/; +const MAX_RATE_LIMIT_REQUESTS = 1000; +const MAX_RATE_LIMIT_WINDOW_SECONDS = 60 * 60; interface StoredAdminAuthChallenge extends AdminAuthRequestChallenge { expiresAt: number; consumedAt?: number; } +interface RateLimitCheckRequest { + maxRequests: number; + windowSeconds: number; +} + +interface RateLimitRecord { + count: number; + resetAt: number; +} + +interface RateLimitResult { + allowed: boolean; + retryAfterSeconds?: number; +} + function jsonResponse(value: unknown, init: ResponseInit): Response { const headers = new Headers(init.headers); headers.set("content-type", "application/json"); @@ -25,6 +44,47 @@ function jsonResponse(value: unknown, init: ResponseInit): Response { }); } +function readPositiveInteger(value: unknown, max: number): number | null { + if (typeof value !== "number" || !Number.isInteger(value)) { + return null; + } + + return value >= 1 && value <= max ? value : null; +} + +function parseRateLimitCheckRequest(value: unknown): RateLimitCheckRequest | null { + if (!value || typeof value !== "object") { + return null; + } + + const payload = value as Record; + const maxRequests = readPositiveInteger( + payload.maxRequests, + MAX_RATE_LIMIT_REQUESTS, + ); + const windowSeconds = readPositiveInteger( + payload.windowSeconds, + MAX_RATE_LIMIT_WINDOW_SECONDS, + ); + + return maxRequests && windowSeconds ? { maxRequests, windowSeconds } : null; +} + +function isRateLimitRecord(value: unknown): value is RateLimitRecord { + if (!value || typeof value !== "object") { + return false; + } + + const record = value as Record; + return ( + typeof record.count === "number" && + Number.isInteger(record.count) && + record.count >= 0 && + typeof record.resetAt === "number" && + Number.isFinite(record.resetAt) + ); +} + function parseChallenge(value: unknown): AdminAuthRequestChallenge | null { if (!value || typeof value !== "object") { return null; @@ -32,6 +92,14 @@ function parseChallenge(value: unknown): AdminAuthRequestChallenge | null { const input = value as Record; if ( + typeof input.wallet !== "string" || + typeof input.domain !== "string" || + typeof input.env !== "string" || + typeof input.cluster !== "string" || + typeof input.programId !== "string" || + typeof input.pool !== "string" || + typeof input.squadsMultisig !== "string" || + typeof input.squadsVault !== "string" || typeof input.method !== "string" || typeof input.route !== "string" || typeof input.bodyHash !== "string" || @@ -44,7 +112,28 @@ function parseChallenge(value: unknown): AdminAuthRequestChallenge | null { const method = normalizeAdminAuthMethod(input.method); const bodyHash = input.bodyHash.toLowerCase(); const nonce = input.nonce.toLowerCase(); + const wallet = input.wallet.trim(); + const domain = input.domain.trim().toLowerCase(); + const env = input.env.trim(); + const cluster = input.cluster.trim(); + const programId = input.programId.trim(); + const pool = input.pool.trim(); + const squadsMultisig = input.squadsMultisig.trim(); + const squadsVault = input.squadsVault.trim(); if ( + !PUBLIC_KEY_OR_NONE_PATTERN.test(wallet) || + wallet === "none" || + domain.length === 0 || + domain.length > 253 || + domain.includes("/") || + env.length === 0 || + cluster.length === 0 || + !PUBLIC_KEY_OR_NONE_PATTERN.test(programId) || + programId === "none" || + !PUBLIC_KEY_OR_NONE_PATTERN.test(pool) || + pool === "none" || + !PUBLIC_KEY_OR_NONE_PATTERN.test(squadsMultisig) || + !PUBLIC_KEY_OR_NONE_PATTERN.test(squadsVault) || method.length === 0 || !input.route.startsWith("/") || !BODY_HASH_PATTERN.test(bodyHash) || @@ -55,6 +144,14 @@ function parseChallenge(value: unknown): AdminAuthRequestChallenge | null { } return { + wallet, + domain, + env, + cluster, + programId, + pool, + squadsMultisig, + squadsVault, method, route: input.route, bodyHash, @@ -85,6 +182,14 @@ function challengeMatches( ): boolean { return ( stored.method === incoming.method && + stored.wallet === incoming.wallet && + stored.domain === incoming.domain && + stored.env === incoming.env && + stored.cluster === incoming.cluster && + stored.programId === incoming.programId && + stored.pool === incoming.pool && + stored.squadsMultisig === incoming.squadsMultisig && + stored.squadsVault === incoming.squadsVault && stored.route === incoming.route && stored.bodyHash === incoming.bodyHash && stored.issuedAt === incoming.issuedAt && @@ -114,11 +219,78 @@ export class AdminAuthNonceDurableObject extends CloudflareDurableObject { return this.consume(payload); } + if (path === "/rate-limit") { + return this.rateLimit(payload); + } + return jsonResponse({ error: "Unknown nonce operation" }, { status: 404 }); } async alarm(): Promise { - await this.ctx.storage.delete(CHALLENGE_STORAGE_KEY); + await Promise.all([ + this.ctx.storage.delete(CHALLENGE_STORAGE_KEY), + this.ctx.storage.delete(RATE_LIMIT_STORAGE_KEY), + ]); + } + + private async rateLimit(payload: unknown): Promise { + const limit = parseRateLimitCheckRequest(payload); + if (!limit) { + return jsonResponse({ error: "Invalid rate limit request" }, { status: 400 }); + } + + const now = Date.now(); + const result = await this.ctx.storage.transaction((transaction) => + this.checkRateLimitWindow(transaction, limit, now), + ); + + if (!result.allowed) { + const retryAfterSeconds = Math.max(1, result.retryAfterSeconds ?? 1); + return jsonResponse( + { retryAfterSeconds }, + { + status: 429, + headers: { + "retry-after": retryAfterSeconds.toString(), + }, + }, + ); + } + + return new Response(null, { status: 204 }); + } + + private async checkRateLimitWindow( + transaction: DurableObjectTransaction, + limit: RateLimitCheckRequest, + now: number, + ): Promise { + const existingValue = await transaction.get(RATE_LIMIT_STORAGE_KEY); + const existing = isRateLimitRecord(existingValue) ? existingValue : null; + + if (existing && existing.resetAt > now) { + if (existing.count >= limit.maxRequests) { + return { + allowed: false, + retryAfterSeconds: Math.ceil((existing.resetAt - now) / 1000), + }; + } + + await transaction.put(RATE_LIMIT_STORAGE_KEY, { + count: existing.count + 1, + resetAt: existing.resetAt, + } satisfies RateLimitRecord); + await transaction.setAlarm(existing.resetAt + CLEANUP_DELAY_MS); + return { allowed: true }; + } + + const resetAt = now + limit.windowSeconds * 1000; + await transaction.put(RATE_LIMIT_STORAGE_KEY, { + count: 1, + resetAt, + } satisfies RateLimitRecord); + await transaction.setAlarm(resetAt + CLEANUP_DELAY_MS); + return { allowed: true }; } private async issue(payload: unknown): Promise { diff --git a/ts/apps/admin/lib/admin-auth-nonce.ts b/ts/apps/admin/lib/admin-auth-nonce.ts index 3f5eae7..9198f77 100644 --- a/ts/apps/admin/lib/admin-auth-nonce.ts +++ b/ts/apps/admin/lib/admin-auth-nonce.ts @@ -1,12 +1,18 @@ import { getCloudflareContext } from "@opennextjs/cloudflare"; +import { PublicKey } from "@solana/web3.js"; +import * as multisig from "@sqds/multisig"; import { EMPTY_BODY_SHA256, normalizeAdminAuthMethod, type AdminAuthRequestChallenge, } from "./admin-auth-message"; +import { PROGRAM_ID, getPoolPda } from "./program"; +import { getConfiguredRpcCluster } from "./solana-env"; const ADMIN_AUTH_NONCE_BINDING = "ADMIN_AUTH_NONCES"; const ADMIN_AUTH_NONCE_URL = "https://admin-auth-nonce.internal"; +const ADMIN_AUTH_CHALLENGE_RATE_LIMIT_MAX_REQUESTS = 20; +const ADMIN_AUTH_CHALLENGE_RATE_LIMIT_WINDOW_SECONDS = 60; const NONCE_BYTES = 16; const MAX_ROUTE_LENGTH = 512; const HEX_64_PATTERN = /^[a-f0-9]{64}$/; @@ -14,6 +20,8 @@ const HEX_64_PATTERN = /^[a-f0-9]{64}$/; type AdminAuthNonceNamespace = DurableObjectNamespace; export interface AdminAuthChallengeRequest { + wallet: string; + domain: string; method: string; route: string; bodyHash: string; @@ -24,6 +32,58 @@ export interface AdminAuthNonceResult { error?: string; } +export class AdminAuthRateLimitError extends Error { + readonly retryAfterSeconds: number; + + constructor(retryAfterSeconds: number) { + super("Too many admin challenge requests. Please wait and try again."); + this.name = "AdminAuthRateLimitError"; + this.retryAfterSeconds = retryAfterSeconds; + } +} + +function readHeaderString(value: string | null): string | null { + const normalized = value?.trim(); + return normalized ? normalized : null; +} + +function isProductionDeployEnv(): boolean { + return process.env.NEXT_PUBLIC_DEPLOY_ENV?.trim() === "production"; +} + +export function getTrustedAdminChallengeIdentity(request: Request): string { + const cfConnectingIp = readHeaderString(request.headers.get("cf-connecting-ip")); + if (cfConnectingIp) { + return `cf-ip:${cfConnectingIp}`; + } + + if (isProductionDeployEnv()) { + return "cf-ip:missing"; + } + + const xRealIp = readHeaderString(request.headers.get("x-real-ip")); + if (xRealIp) { + return `dev-x-real-ip:${xRealIp}`; + } + + const forwardedFor = readHeaderString(request.headers.get("x-forwarded-for")); + if (forwardedFor) { + const [firstIp] = forwardedFor.split(","); + const normalized = readHeaderString(firstIp ?? null); + if (normalized) { + return `dev-x-forwarded-for:${normalized}`; + } + } + + return "dev-ip:unknown"; +} + +export function isAdminAuthRateLimitError( + error: unknown, +): error is AdminAuthRateLimitError { + return error instanceof AdminAuthRateLimitError; +} + function toHex(bytes: Uint8Array): string { return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join( "", @@ -58,19 +118,95 @@ function normalizeBodyHash(bodyHash: string): string { return value; } +function normalizeWallet(wallet: string): string { + try { + return new PublicKey(wallet.trim()).toBase58(); + } catch { + throw new Error("Invalid admin authorization wallet"); + } +} + +function normalizeDomain(domain: string): string { + const value = domain.trim().toLowerCase(); + if (!value || value.length > 253 || value.includes("/")) { + throw new Error("Invalid admin authorization domain"); + } + return value; +} + export function getAdminAuthRoute(request: Request): string { const url = new URL(request.url); return `${url.pathname}${url.search}`; } +export function getAdminAuthDomain(request: Request): string { + const host = + request.headers.get("x-forwarded-host") ?? + request.headers.get("host") ?? + new URL(request.url).host; + return normalizeDomain(host); +} + export function getEmptyBodyHash(): string { return EMPTY_BODY_SHA256; } +function getSquadsMultisigString(): string { + return ( + process.env.SQUADS_MULTISIG_PUBKEY?.trim() || + process.env.NEXT_PUBLIC_SQUADS_MULTISIG_PUBKEY?.trim() || + "none" + ); +} + +function getSquadsVaultString(multisigPda: string): string { + if (multisigPda === "none") return "none"; + const rawIndex = + process.env.SQUADS_VAULT_INDEX?.trim() || + process.env.NEXT_PUBLIC_SQUADS_VAULT_INDEX?.trim() || + "0"; + const vaultIndex = Number(rawIndex); + if (!Number.isInteger(vaultIndex) || vaultIndex < 0) { + throw new Error("Invalid Squads vault index"); + } + return multisig + .getVaultPda({ multisigPda: new PublicKey(multisigPda), index: vaultIndex })[0] + .toBase58(); +} + +export function buildAdminAuthContext(input: { + wallet: string; + domain: string; +}): Pick< + AdminAuthRequestChallenge, + | "wallet" + | "domain" + | "env" + | "cluster" + | "programId" + | "pool" + | "squadsMultisig" + | "squadsVault" +> { + const squadsMultisig = getSquadsMultisigString(); + return { + wallet: normalizeWallet(input.wallet), + domain: normalizeDomain(input.domain), + env: process.env.NEXT_PUBLIC_DEPLOY_ENV?.trim() || "dev", + cluster: getConfiguredRpcCluster(), + programId: PROGRAM_ID.toBase58(), + pool: getPoolPda(PROGRAM_ID).toBase58(), + squadsMultisig, + squadsVault: getSquadsVaultString(squadsMultisig), + }; +} + export function normalizeChallengeRequest( input: AdminAuthChallengeRequest, ): AdminAuthChallengeRequest { return { + wallet: normalizeWallet(input.wallet), + domain: normalizeDomain(input.domain), method: normalizeAdminAuthMethod(input.method), route: normalizeRoute(input.route), bodyHash: normalizeBodyHash(input.bodyHash), @@ -91,15 +227,68 @@ async function getAdminAuthNonceNamespace(): Promise { } async function fetchNonceObject( - nonce: string, + objectName: string, path: string, init: RequestInit, ): Promise { const namespace = await getAdminAuthNonceNamespace(); - const stub = namespace.get(namespace.idFromName(nonce)); + const stub = namespace.get(namespace.idFromName(objectName)); return stub.fetch(`${ADMIN_AUTH_NONCE_URL}${path}`, init); } +async function hashIdentifier(value: string): Promise { + const encoded = new TextEncoder().encode(value); + const digest = await crypto.subtle.digest("SHA-256", encoded); + return Array.from(new Uint8Array(digest), (byte) => + byte.toString(16).padStart(2, "0"), + ).join(""); +} + +async function readRetryAfterSeconds(response: Response): Promise { + const headerValue = response.headers.get("retry-after"); + const headerSeconds = headerValue ? Number(headerValue) : NaN; + + if (Number.isFinite(headerSeconds) && headerSeconds > 0) { + return Math.ceil(headerSeconds); + } + + const body = (await response.json().catch(() => null)) as + | { retryAfterSeconds?: unknown } + | null; + const bodySeconds = Number(body?.retryAfterSeconds); + + return Number.isFinite(bodySeconds) && bodySeconds > 0 + ? Math.ceil(bodySeconds) + : 1; +} + +export async function enforceAdminChallengeRateLimit(options: { + request: Request; + wallet: string; +}) { + const wallet = normalizeWallet(options.wallet); + const identity = getTrustedAdminChallengeIdentity(options.request); + const objectName = `challenge:${await hashIdentifier(`${wallet}:${identity}`)}`; + const response = await fetchNonceObject(objectName, "/rate-limit", { + method: "POST", + headers: { + "content-type": "application/json", + }, + body: JSON.stringify({ + maxRequests: ADMIN_AUTH_CHALLENGE_RATE_LIMIT_MAX_REQUESTS, + windowSeconds: ADMIN_AUTH_CHALLENGE_RATE_LIMIT_WINDOW_SECONDS, + }), + }); + + if (response.status === 429) { + throw new AdminAuthRateLimitError(await readRetryAfterSeconds(response)); + } + + if (!response.ok) { + throw new Error(`Admin challenge rate limit check failed (${response.status})`); + } +} + export async function issueAdminAuthChallenge( request: AdminAuthChallengeRequest, ): Promise { @@ -107,6 +296,10 @@ export async function issueAdminAuthChallenge( const nonce = createNonce(); const issuedAt = new Date().toISOString(); const challenge: AdminAuthRequestChallenge = { + ...buildAdminAuthContext({ + wallet: normalized.wallet, + domain: normalized.domain, + }), ...normalized, issuedAt, nonce, @@ -137,6 +330,10 @@ export async function consumeAdminAuthNonce( "content-type": "application/json", }, body: JSON.stringify({ + ...buildAdminAuthContext({ + wallet: normalized.wallet, + domain: normalized.domain, + }), ...normalized, issuedAt: challenge.issuedAt, nonce: challenge.nonce, diff --git a/ts/apps/admin/lib/admin-auth-rate-limit.test.ts b/ts/apps/admin/lib/admin-auth-rate-limit.test.ts new file mode 100644 index 0000000..aeb6242 --- /dev/null +++ b/ts/apps/admin/lib/admin-auth-rate-limit.test.ts @@ -0,0 +1,59 @@ +import { afterEach, describe, expect, it } from "vitest"; +import { getTrustedAdminChallengeIdentity } from "./admin-auth-nonce"; + +function makeRequest(headers: Record) { + return new Request("https://admin.bunkercash.com/api/admin-auth/challenge", { + headers, + }); +} + +describe("admin challenge trusted identity", () => { + afterEach(() => { + delete process.env.NEXT_PUBLIC_DEPLOY_ENV; + }); + + it("uses Cloudflare connecting IP in production", () => { + process.env.NEXT_PUBLIC_DEPLOY_ENV = "production"; + + expect( + getTrustedAdminChallengeIdentity( + makeRequest({ + "cf-connecting-ip": "203.0.113.42", + "x-forwarded-for": "198.51.100.10", + "x-real-ip": "198.51.100.11", + }), + ), + ).toBe("cf-ip:203.0.113.42"); + }); + + it("does not trust spoofable forwarded headers in production", () => { + process.env.NEXT_PUBLIC_DEPLOY_ENV = "production"; + + const first = getTrustedAdminChallengeIdentity( + makeRequest({ + "x-forwarded-for": "198.51.100.10", + "x-real-ip": "198.51.100.11", + }), + ); + const second = getTrustedAdminChallengeIdentity( + makeRequest({ + "x-forwarded-for": "203.0.113.10", + "x-real-ip": "203.0.113.11", + }), + ); + + expect(first).toBe("cf-ip:missing"); + expect(second).toBe(first); + }); + + it("allows forwarded-header fallback outside production", () => { + process.env.NEXT_PUBLIC_DEPLOY_ENV = "dev"; + + expect( + getTrustedAdminChallengeIdentity( + makeRequest({ "x-forwarded-for": "198.51.100.10, 10.0.0.1" }), + ), + ).toBe("dev-x-forwarded-for:198.51.100.10"); + }); +}); + diff --git a/ts/apps/admin/lib/admin-instruction-validator.test.ts b/ts/apps/admin/lib/admin-instruction-validator.test.ts new file mode 100644 index 0000000..ef6b300 --- /dev/null +++ b/ts/apps/admin/lib/admin-instruction-validator.test.ts @@ -0,0 +1,142 @@ +import { createHash } from "crypto"; +import { describe, expect, it } from "vitest"; +import { Keypair, PublicKey, SystemProgram } from "@solana/web3.js"; +import { PROGRAM_ID, getFeeConfigPda, getPoolPda } from "./program"; +import { validateAdminInstructions, type SerializedAdminInstruction } from "./admin-instruction-validator"; +import type { AdminIdentity } from "./geoblocking-auth"; + +function discriminator(name: string): Buffer { + return createHash("sha256") + .update(`global:${name}`) + .digest() + .subarray(0, 8); +} + +function setFeeConfigData(purchaseFeeBps = 100, claimFeeBps = 100): string { + const data = Buffer.alloc(12); + discriminator("set_fee_config").copy(data, 0); + data.writeUInt16LE(purchaseFeeBps, 8); + data.writeUInt16LE(claimFeeBps, 10); + return data.toString("base64"); +} + +function updateMasterWalletData(newMasterWallet: string): string { + const data = Buffer.alloc(40); + discriminator("update_master_wallet").copy(data, 0); + Buffer.from(new PublicKey(newMasterWallet).toBytes()).copy(data, 8); + return data.toString("base64"); +} + +const vault = Keypair.generate().publicKey; +const identity: AdminIdentity = { + wallet: Keypair.generate().publicKey.toBase58(), + isAdmin: true, + role: "squads-member", + governanceMode: "squads-v4", + poolMasterWallet: vault.toBase58(), + squadsMultisig: Keypair.generate().publicKey.toBase58(), + squadsVault: vault.toBase58(), + squadsVaultIndex: 0, + squadsPermissions: ["vote"], +}; + +function setFeeConfigIx(overrides: Partial = {}): SerializedAdminInstruction { + return { + programId: PROGRAM_ID.toBase58(), + data: setFeeConfigData(), + keys: [ + { pubkey: getPoolPda(PROGRAM_ID).toBase58(), isSigner: false, isWritable: true }, + { pubkey: getFeeConfigPda(PROGRAM_ID).toBase58(), isSigner: false, isWritable: true }, + { pubkey: vault.toBase58(), isSigner: true, isWritable: true }, + { pubkey: SystemProgram.programId.toBase58(), isSigner: false, isWritable: false }, + ], + ...overrides, + }; +} + +function updateMasterWalletIx(newMasterWallet = Keypair.generate().publicKey.toBase58()): SerializedAdminInstruction { + return { + programId: PROGRAM_ID.toBase58(), + data: updateMasterWalletData(newMasterWallet), + keys: [ + { pubkey: getPoolPda(PROGRAM_ID).toBase58(), isSigner: false, isWritable: true }, + { pubkey: vault.toBase58(), isSigner: true, isWritable: false }, + ], + }; +} + +describe("admin instruction validator", () => { + it("decodes allowed BunkerCash instructions for review", () => { + expect(validateAdminInstructions([setFeeConfigIx()], identity)).toEqual([ + expect.objectContaining({ + programId: PROGRAM_ID.toBase58(), + instruction: "set_fee_config", + args: { purchaseFeeBps: 100, claimFeeBps: 100 }, + accounts: expect.arrayContaining([ + { name: "pool", pubkey: getPoolPda(PROGRAM_ID).toBase58() }, + { name: "admin", pubkey: vault.toBase58() }, + ]), + }), + ]); + }); + + it("blocks unknown program ids", () => { + expect(() => + validateAdminInstructions( + [setFeeConfigIx({ programId: Keypair.generate().publicKey.toBase58() })], + identity, + ), + ).toThrow("Unknown admin instruction program id"); + }); + + it("decodes master wallet rotation proposals gated by the current vault", () => { + const newMasterWallet = Keypair.generate().publicKey.toBase58(); + + expect(validateAdminInstructions([updateMasterWalletIx(newMasterWallet)], identity)).toEqual([ + expect.objectContaining({ + instruction: "update_master_wallet", + args: { newMasterWallet }, + accounts: expect.arrayContaining([ + { name: "pool", pubkey: getPoolPda(PROGRAM_ID).toBase58() }, + { name: "current_master_wallet", pubkey: vault.toBase58() }, + ]), + }), + ]); + }); + + it("blocks unknown instruction discriminators", () => { + expect(() => + validateAdminInstructions( + [setFeeConfigIx({ data: Buffer.alloc(8, 1).toString("base64") })], + identity, + ), + ).toThrow("Unknown BunkerCash instruction discriminator"); + }); + + it("blocks wrong pool PDA", () => { + const ix = setFeeConfigIx(); + ix.keys[0] = { + ...ix.keys[0], + pubkey: Keypair.generate().publicKey.toBase58(), + }; + expect(() => validateAdminInstructions([ix], identity)).toThrow("wrong pool PDA"); + }); + + it("blocks wrong Squads vault authority", () => { + const ix = setFeeConfigIx(); + ix.keys[2] = { + ...ix.keys[2], + pubkey: Keypair.generate().publicKey.toBase58(), + }; + expect(() => validateAdminInstructions([ix], identity)).toThrow("wrong admin"); + }); + + it("blocks fee changes outside configured bounds", () => { + expect(() => + validateAdminInstructions( + [setFeeConfigIx({ data: setFeeConfigData(1_001, 100) })], + identity, + ), + ).toThrow("outside allowed bounds"); + }); +}); diff --git a/ts/apps/admin/lib/admin-instruction-validator.ts b/ts/apps/admin/lib/admin-instruction-validator.ts new file mode 100644 index 0000000..72bc920 --- /dev/null +++ b/ts/apps/admin/lib/admin-instruction-validator.ts @@ -0,0 +1,234 @@ +import { createHash } from "crypto"; +import { PublicKey } from "@solana/web3.js"; +import { ASSOCIATED_TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import idlJson from "./bunkercash.fixed.idl.json"; +import { PROGRAM_ID, getPoolPda } from "./program"; +import type { AdminIdentity } from "./geoblocking-auth"; + +const ALLOWED_BUNKERCASH_INSTRUCTIONS = new Set([ + "create_bunkercash_mint", + "init_mint_metadata", + "update_mint_metadata", + "open_settlement", + "settle_claims", + "close_settlement", + "master_withdraw", + "master_repay", + "master_profit", + "master_close_withdrawal", + "set_fee_config", + "set_purchase_limit", + "reset_purchase_counter", + "set_min_claim_usdc", + "set_min_settlement_usdc", + "set_supported_usdc_mint", + "update_master_wallet", +]); + +interface SerializedAccountMeta { + pubkey: string; + isSigner: boolean; + isWritable: boolean; +} + +export interface SerializedAdminInstruction { + programId: string; + keys: SerializedAccountMeta[]; + data: string; +} + +interface IdlInstructionAccount { + name: string; + accounts?: IdlInstructionAccount[]; +} + +interface IdlInstruction { + name: string; + accounts?: IdlInstructionAccount[]; +} + +export interface DecodedAdminInstruction { + programId: string; + instruction: string; + args: Record; + accounts: Array<{ name: string; pubkey: string }>; +} + +function discriminator(name: string): string { + return createHash("sha256") + .update(`global:${name}`) + .digest() + .subarray(0, 8) + .toString("hex"); +} + +const idlInstructions = new Map( + ((idlJson as { instructions: IdlInstruction[] }).instructions ?? []).map((ix) => [ + ix.name, + ix, + ]), +); + +const discriminators = new Map( + [...ALLOWED_BUNKERCASH_INSTRUCTIONS].map((name) => [discriminator(name), name]), +); + +function flattenAccounts(accounts: IdlInstructionAccount[] = []): string[] { + return accounts.flatMap((account) => + account.accounts?.length ? flattenAccounts(account.accounts) : [account.name], + ); +} + +function decodeInstructionData(data: string): Buffer { + return Buffer.from(data, "base64"); +} + +function readU16(data: Buffer, offset: number): number { + if (data.length < offset + 2) throw new Error("Instruction data is truncated"); + return data.readUInt16LE(offset); +} + +function readU64String(data: Buffer, offset: number): string { + if (data.length < offset + 8) throw new Error("Instruction data is truncated"); + return data.readBigUInt64LE(offset).toString(); +} + +function readPubkeyString(data: Buffer, offset: number): string { + if (data.length < offset + 32) throw new Error("Instruction data is truncated"); + return new PublicKey(data.subarray(offset, offset + 32)).toBase58(); +} + +function decodeAndValidateArgs(name: string, data: Buffer): Record { + switch (name) { + case "set_fee_config": { + const purchaseFeeBps = readU16(data, 8); + const claimFeeBps = readU16(data, 10); + if (purchaseFeeBps > 1_000 || claimFeeBps > 1_000) { + throw new Error("Fee configuration is outside allowed bounds"); + } + return { purchaseFeeBps, claimFeeBps }; + } + case "set_purchase_limit": + return { amount: readU64String(data, 8) }; + case "set_min_claim_usdc": + case "set_min_settlement_usdc": + return { amount: readU64String(data, 8) }; + case "master_withdraw": + case "master_repay": + case "master_profit": + case "master_close_withdrawal": + return { amount: readU64String(data, 8) }; + case "update_master_wallet": + return { newMasterWallet: readPubkeyString(data, 8) }; + default: + return {}; + } +} + +function requirePubkey(value: string, label: string): PublicKey { + try { + return new PublicKey(value); + } catch { + throw new Error(`${label} is not a valid public key`); + } +} + +function expectedAuthority(identity: AdminIdentity): string { + if (identity.governanceMode === "squads-v4") { + if (!identity.squadsVault) { + throw new Error("Squads vault is required for Squads admin validation"); + } + return identity.squadsVault; + } + return identity.poolMasterWallet; +} + +function validateBunkercashInstruction( + instruction: SerializedAdminInstruction, + identity: AdminIdentity, +): DecodedAdminInstruction { + const data = decodeInstructionData(instruction.data); + if (data.length < 8) { + throw new Error("BunkerCash instruction data is missing discriminator"); + } + + const name = discriminators.get(data.subarray(0, 8).toString("hex")); + if (!name) { + throw new Error("Unknown BunkerCash instruction discriminator"); + } + + const idlInstruction = idlInstructions.get(name); + if (!idlInstruction) { + throw new Error(`BunkerCash instruction ${name} is missing from IDL`); + } + + const accountNames = flattenAccounts(idlInstruction.accounts); + const decodedAccounts = instruction.keys.map((meta, index) => ({ + name: accountNames[index] ?? `remaining_${index - accountNames.length}`, + pubkey: requirePubkey(meta.pubkey, "instruction account").toBase58(), + })); + + const byName = new Map(decodedAccounts.map((account) => [account.name, account.pubkey])); + const pool = byName.get("pool"); + if (pool && pool !== getPoolPda(PROGRAM_ID).toBase58()) { + throw new Error("BunkerCash instruction targets the wrong pool PDA"); + } + + const authority = expectedAuthority(identity); + for (const authorityName of ["admin", "master_wallet", "masterWallet", "current_master_wallet"]) { + const pubkey = byName.get(authorityName); + if (pubkey && pubkey !== authority) { + throw new Error(`BunkerCash instruction uses wrong ${authorityName}`); + } + } + + const args = decodeAndValidateArgs(name, data); + + return { + programId: PROGRAM_ID.toBase58(), + instruction: name, + args, + accounts: decodedAccounts, + }; +} + +function validateAssociatedTokenInstruction( + instruction: SerializedAdminInstruction, +): DecodedAdminInstruction { + if (instruction.keys.length < 4) { + throw new Error("Associated token instruction has too few accounts"); + } + + return { + programId: ASSOCIATED_TOKEN_PROGRAM_ID.toBase58(), + instruction: "associated_token_account", + args: {}, + accounts: instruction.keys.map((meta, index) => ({ + name: ["payer", "associatedAccount", "owner", "mint"][index] ?? `account_${index}`, + pubkey: requirePubkey(meta.pubkey, "associated token account").toBase58(), + })), + }; +} + +export function validateAdminInstructions( + instructions: SerializedAdminInstruction[], + identity: AdminIdentity, +): DecodedAdminInstruction[] { + if (!identity.isAdmin) { + throw new Error("Connected wallet is not authorized"); + } + if (instructions.length === 0) { + throw new Error("No admin instructions provided"); + } + + return instructions.map((instruction) => { + const programId = requirePubkey(instruction.programId, "instruction program id").toBase58(); + if (programId === PROGRAM_ID.toBase58()) { + return validateBunkercashInstruction(instruction, identity); + } + if (programId === ASSOCIATED_TOKEN_PROGRAM_ID.toBase58()) { + return validateAssociatedTokenInstruction(instruction); + } + throw new Error(`Unknown admin instruction program id: ${programId}`); + }); +} diff --git a/ts/apps/admin/lib/auth.tsx b/ts/apps/admin/lib/auth.tsx index 8af8bd5..e3aeea4 100644 --- a/ts/apps/admin/lib/auth.tsx +++ b/ts/apps/admin/lib/auth.tsx @@ -9,30 +9,63 @@ import { type ReactNode, } from "react"; import { useWallet } from "@solana/wallet-adapter-react"; -import type { PoolDataResponse } from "@/lib/solana-server"; +import { buildAdminAuthHeaders } from "@/lib/admin-auth-client"; interface AuthContextType { isAuthenticated: boolean; isLoading: boolean; isAdmin: boolean; adminAddress: string | null; + role: AdminMeResponse["role"]; + governanceMode: AdminMeResponse["governanceMode"] | null; + squadsMultisig: string | null; + squadsVault: string | null; + squadsVaultIndex: number | null; + squadsPermissions: string[]; error: string | null; logout: () => void; } const AuthContext = createContext(null); +interface AdminMeResponse { + wallet: string; + isAdmin: boolean; + role: "single-wallet" | "squads-member" | "override" | "none"; + governanceMode: "single-wallet" | "squads-v4"; + poolMasterWallet: string; + squadsMultisig: string | null; + squadsVault: string | null; + squadsVaultIndex: number | null; + squadsPermissions: string[]; + error?: unknown; +} + export function AuthProvider({ children }: { children: ReactNode }) { - const { publicKey, connected, disconnect } = useWallet(); + const { publicKey, connected, disconnect, signMessage } = useWallet(); const [isAdmin, setIsAdmin] = useState(false); const [isLoading, setIsLoading] = useState(true); const [adminAddress, setAdminAddress] = useState(null); + const [role, setRole] = useState("none"); + const [governanceMode, setGovernanceMode] = useState< + AdminMeResponse["governanceMode"] | null + >(null); + const [squadsMultisig, setSquadsMultisig] = useState(null); + const [squadsVault, setSquadsVault] = useState(null); + const [squadsVaultIndex, setSquadsVaultIndex] = useState(null); + const [squadsPermissions, setSquadsPermissions] = useState([]); const [error, setError] = useState(null); useEffect(() => { if (!connected || !publicKey) { setIsAdmin(false); setAdminAddress(null); + setRole("none"); + setGovernanceMode(null); + setSquadsMultisig(null); + setSquadsVault(null); + setSquadsVaultIndex(null); + setSquadsPermissions([]); setError(null); setIsLoading(false); return; @@ -42,51 +75,63 @@ export function AuthProvider({ children }: { children: ReactNode }) { setIsLoading(true); (async () => { - const walletAddr = publicKey.toBase58(); - try { - let data: PoolDataResponse | null = null; - let lastError: Error | null = null; - - for (let attempt = 0; attempt < 3; attempt += 1) { - try { - const res = await fetch("/api/pool-data", { cache: "no-store" }); - if (!res.ok) throw new Error(`pool-data: ${res.status}`); - data = (await res.json()) as PoolDataResponse; - break; - } catch (error: unknown) { - lastError = - error instanceof Error ? error : new Error("Failed to fetch pool data"); - - if (attempt < 2) { - await new Promise((resolve) => setTimeout(resolve, 500 * (attempt + 1))); - } - } + if (!signMessage) { + throw new Error("Connected wallet does not support message signing"); } - if (!data) { - throw lastError ?? new Error("Failed to fetch pool data"); + const route = "/api/admin/me"; + const authHeaders = await buildAdminAuthHeaders({ + publicKey, + signMessage, + method: "GET", + route, + }); + const res = await fetch(route, { + cache: "no-store", + headers: authHeaders, + }); + const data = (await res.json().catch(() => null)) as AdminMeResponse | null; + + if (!res.ok) { + throw new Error( + typeof data?.error === "string" + ? data.error + : `admin verification failed: ${res.status}`, + ); } - const onChainAdmin = data.adminWallet; - if (!onChainAdmin) { - throw new Error("Pool admin address is missing from pool-data response"); + if ( + !data || + typeof data.isAdmin !== "boolean" || + typeof data.poolMasterWallet !== "string" || + (data.governanceMode !== "single-wallet" && + data.governanceMode !== "squads-v4") + ) { + throw new Error("Admin verification response is malformed"); } if (cancelled) return; - setAdminAddress(onChainAdmin); + setAdminAddress(data.poolMasterWallet); + setRole(data.role); + setGovernanceMode(data.governanceMode); + setSquadsMultisig(data.squadsMultisig); + setSquadsVault(data.squadsVault); + setSquadsVaultIndex(data.squadsVaultIndex); + setSquadsPermissions(data.squadsPermissions); setError(null); - if (walletAddr === onChainAdmin) { - setIsAdmin(true); - return; - } - - setIsAdmin(false); + setIsAdmin(data.isAdmin); } catch (error: unknown) { if (!cancelled) { setIsAdmin(false); setAdminAddress(null); + setRole("none"); + setGovernanceMode(null); + setSquadsMultisig(null); + setSquadsVault(null); + setSquadsVaultIndex(null); + setSquadsPermissions([]); setError( error instanceof Error ? error.message @@ -101,7 +146,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { return () => { cancelled = true; }; - }, [connected, publicKey]); + }, [connected, publicKey, signMessage]); const logout = useCallback(() => { disconnect(); @@ -111,7 +156,20 @@ export function AuthProvider({ children }: { children: ReactNode }) { return ( {children} diff --git a/ts/apps/admin/lib/bunkercash.fixed.idl.json b/ts/apps/admin/lib/bunkercash.fixed.idl.json index 0059ece..a34361b 100644 --- a/ts/apps/admin/lib/bunkercash.fixed.idl.json +++ b/ts/apps/admin/lib/bunkercash.fixed.idl.json @@ -2472,6 +2472,48 @@ ], "args": [] }, + { + "name": "update_master_wallet", + "discriminator": [ + 243, + 44, + 250, + 16, + 79, + 226, + 43, + 176 + ], + "accounts": [ + { + "name": "pool", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 112, + 111, + 111, + 108 + ] + } + ] + } + }, + { + "name": "current_master_wallet", + "signer": true + } + ], + "args": [ + { + "name": "new_master_wallet", + "type": "pubkey" + } + ] + }, { "name": "settle_claims", "discriminator": [ @@ -3426,6 +3468,10 @@ "name": "last_paid_epoch_seq", "type": "u64" }, + { + "name": "claim_seq", + "type": "u64" + }, { "name": "bump", "type": "u8" @@ -4019,6 +4065,10 @@ "name": "claim_counter", "type": "u64" }, + { + "name": "next_claim_seq", + "type": "u64" + }, { "name": "withdrawal_counter", "type": "u64" @@ -4226,6 +4276,10 @@ "name": "epoch_seq", "type": "u64" }, + { + "name": "snapshot_claim_seq", + "type": "u64" + }, { "name": "timestamp", "type": "i64" @@ -4327,4 +4381,4 @@ } } ] -} \ No newline at end of file +} diff --git a/ts/apps/admin/lib/constants.ts b/ts/apps/admin/lib/constants.ts index 19b2dbd..2e0899b 100644 --- a/ts/apps/admin/lib/constants.ts +++ b/ts/apps/admin/lib/constants.ts @@ -3,7 +3,10 @@ import { PublicKey } from "@solana/web3.js"; export type ClusterType = 'mainnet-beta' | 'devnet' | 'testnet' | 'localnet' | 'unknown'; -export const USDC_MINTS: Record = {}; +export const USDC_MINTS: Record = { + "mainnet-beta": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + devnet: "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", +}; export function getClusterFromEndpoint(endpoint: string): ClusterType { if (endpoint.includes('devnet')) return 'devnet'; diff --git a/ts/apps/admin/lib/geoblocking-auth.test.ts b/ts/apps/admin/lib/geoblocking-auth.test.ts new file mode 100644 index 0000000..59b7cec --- /dev/null +++ b/ts/apps/admin/lib/geoblocking-auth.test.ts @@ -0,0 +1,243 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { Keypair, PublicKey } from "@solana/web3.js"; + +const mocks = vi.hoisted(() => ({ + poolMasterWallet: "", + squadsMembers: [] as Array<{ + key: PublicKey; + permissions: { mask: number }; + }>, + fetchPool: vi.fn(), + fetchMultisig: vi.fn(), +})); + +vi.mock("./program", () => ({ + getPoolPda: () => Keypair.generate().publicKey, + getReadonlyProgram: () => ({ + account: { + pool: { + fetch: mocks.fetchPool, + }, + }, + }), +})); + +vi.mock("./solana-env", () => ({ + getConfiguredRpcCluster: () => "devnet", +})); + +vi.mock("@sqds/multisig", async () => { + const actual = await vi.importActual( + "@sqds/multisig", + ); + return { + ...actual, + accounts: { + ...actual.accounts, + Multisig: { + ...actual.accounts.Multisig, + fromAccountAddress: mocks.fetchMultisig, + }, + }, + }; +}); + +const originalEnv = { ...process.env }; + +const multisigPda = Keypair.generate().publicKey; +const [vaultPda] = await import("@sqds/multisig").then((squads) => + squads.getVaultPda({ multisigPda, index: 0 }), +); +const singleWalletAdmin = Keypair.generate().publicKey; +const memberWallet = Keypair.generate().publicKey; +const nonMemberWallet = Keypair.generate().publicKey; + +async function importAuth() { + vi.resetModules(); + return import("./geoblocking-auth"); +} + +function setPoolMasterWallet(value: PublicKey) { + mocks.poolMasterWallet = value.toBase58(); + mocks.fetchPool.mockImplementation(async () => ({ + masterWallet: { + toBase58: () => mocks.poolMasterWallet, + }, + })); +} + +function setSquadsMembers( + members: Array<{ key: PublicKey; permissions?: { mask: number } }>, +) { + mocks.squadsMembers = members.map((member) => ({ + key: member.key, + permissions: member.permissions ?? { mask: 0 }, + })); + mocks.fetchMultisig.mockImplementation(async () => ({ + members: mocks.squadsMembers, + })); +} + +describe("admin authority resolution", () => { + beforeEach(() => { + vi.useRealTimers(); + vi.clearAllMocks(); + process.env = { ...originalEnv }; + delete process.env.SQUADS_MULTISIG_PUBKEY; + delete process.env.NEXT_PUBLIC_SQUADS_MULTISIG_PUBKEY; + delete process.env.SQUADS_VAULT_INDEX; + delete process.env.ADMIN_SQUADS_REQUIRED_PERMISSION; + delete process.env.ADMIN_OVERRIDE_WALLET; + delete process.env.ADMIN_OVERRIDE_EXPIRES_AT; + delete process.env.ADMIN_AUTHORITY_TTL_MS; + setPoolMasterWallet(singleWalletAdmin); + setSquadsMembers([]); + }); + + afterEach(() => { + vi.useRealTimers(); + process.env = { ...originalEnv }; + }); + + it("authorizes the direct pool authority in single-wallet mode", async () => { + const { resolveAdminIdentity } = await importAuth(); + + const admin = await resolveAdminIdentity(singleWalletAdmin.toBase58()); + const outsider = await resolveAdminIdentity(nonMemberWallet.toBase58()); + + expect(admin).toMatchObject({ + isAdmin: true, + role: "single-wallet", + governanceMode: "single-wallet", + poolMasterWallet: singleWalletAdmin.toBase58(), + }); + expect(outsider).toMatchObject({ + isAdmin: false, + role: "none", + governanceMode: "single-wallet", + }); + expect(mocks.fetchMultisig).not.toHaveBeenCalled(); + }); + + it("authorizes a current Squads member when the pool authority is the Squads vault", async () => { + process.env.SQUADS_MULTISIG_PUBKEY = multisigPda.toBase58(); + setPoolMasterWallet(vaultPda); + setSquadsMembers([{ key: memberWallet }]); + const { resolveAdminIdentity } = await importAuth(); + + const identity = await resolveAdminIdentity(memberWallet.toBase58()); + + expect(identity).toMatchObject({ + wallet: memberWallet.toBase58(), + isAdmin: true, + role: "squads-member", + governanceMode: "squads-v4", + poolMasterWallet: vaultPda.toBase58(), + squadsMultisig: multisigPda.toBase58(), + squadsVault: vaultPda.toBase58(), + squadsVaultIndex: 0, + }); + }); + + it("rejects a non-member when the pool authority is the Squads vault", async () => { + process.env.SQUADS_MULTISIG_PUBKEY = multisigPda.toBase58(); + setPoolMasterWallet(vaultPda); + setSquadsMembers([{ key: memberWallet }]); + const { resolveAdminIdentity } = await importAuth(); + + const identity = await resolveAdminIdentity(nonMemberWallet.toBase58()); + + expect(identity).toMatchObject({ + wallet: nonMemberWallet.toBase58(), + isAdmin: false, + role: "none", + governanceMode: "squads-v4", + }); + }); + + it("drops access for a removed Squads member after the authority cache expires", async () => { + vi.useFakeTimers(); + vi.setSystemTime(new Date("2026-07-04T10:00:00.000Z")); + process.env.ADMIN_AUTHORITY_TTL_MS = "1"; + process.env.SQUADS_MULTISIG_PUBKEY = multisigPda.toBase58(); + setPoolMasterWallet(vaultPda); + setSquadsMembers([{ key: memberWallet }]); + const { resolveAdminIdentity } = await importAuth(); + + await expect(resolveAdminIdentity(memberWallet.toBase58())).resolves.toMatchObject({ + isAdmin: true, + role: "squads-member", + }); + + setSquadsMembers([]); + vi.advanceTimersByTime(2); + + await expect(resolveAdminIdentity(memberWallet.toBase58())).resolves.toMatchObject({ + isAdmin: false, + role: "none", + }); + expect(mocks.fetchMultisig).toHaveBeenCalledTimes(2); + }); + + it("honors the optional required Squads permission", async () => { + process.env.SQUADS_MULTISIG_PUBKEY = multisigPda.toBase58(); + process.env.ADMIN_SQUADS_REQUIRED_PERMISSION = "execute"; + setPoolMasterWallet(vaultPda); + setSquadsMembers([ + { key: memberWallet, permissions: { mask: 2 } }, + { key: nonMemberWallet, permissions: { mask: 4 } }, + ]); + const { resolveAdminIdentity } = await importAuth(); + + await expect(resolveAdminIdentity(memberWallet.toBase58())).resolves.toMatchObject({ + isAdmin: false, + role: "none", + squadsPermissions: ["vote"], + }); + await expect(resolveAdminIdentity(nonMemberWallet.toBase58())).resolves.toMatchObject({ + isAdmin: true, + role: "squads-member", + squadsPermissions: ["execute"], + }); + }); + + it("adds an unexpired override only after authoritative state resolves", async () => { + process.env.ADMIN_OVERRIDE_WALLET = nonMemberWallet.toBase58(); + process.env.ADMIN_OVERRIDE_EXPIRES_AT = "2026-07-04T10:10:00.000Z"; + vi.useFakeTimers(); + vi.setSystemTime(new Date("2026-07-04T10:00:00.000Z")); + setPoolMasterWallet(singleWalletAdmin); + const { resolveAdminIdentity } = await importAuth(); + + await expect(resolveAdminIdentity(nonMemberWallet.toBase58())).resolves.toMatchObject({ + isAdmin: true, + role: "override", + governanceMode: "single-wallet", + poolMasterWallet: singleWalletAdmin.toBase58(), + }); + expect(mocks.fetchPool).toHaveBeenCalledOnce(); + }); + + it("ignores expired overrides", async () => { + process.env.ADMIN_OVERRIDE_WALLET = nonMemberWallet.toBase58(); + process.env.ADMIN_OVERRIDE_EXPIRES_AT = "2026-07-04T09:59:00.000Z"; + vi.useFakeTimers(); + vi.setSystemTime(new Date("2026-07-04T10:00:00.000Z")); + setPoolMasterWallet(singleWalletAdmin); + const { resolveAdminIdentity } = await importAuth(); + + await expect(resolveAdminIdentity(nonMemberWallet.toBase58())).resolves.toMatchObject({ + isAdmin: false, + role: "none", + }); + }); + + it("does not allow override-only access when authoritative lookup fails with cold cache", async () => { + process.env.ADMIN_OVERRIDE_WALLET = nonMemberWallet.toBase58(); + process.env.ADMIN_OVERRIDE_EXPIRES_AT = "2026-07-04T10:10:00.000Z"; + mocks.fetchPool.mockRejectedValue(new Error("rpc down")); + const { resolveAdminIdentity } = await importAuth(); + + await expect(resolveAdminIdentity(nonMemberWallet.toBase58())).rejects.toThrow("rpc down"); + }); +}); diff --git a/ts/apps/admin/lib/geoblocking-auth.ts b/ts/apps/admin/lib/geoblocking-auth.ts index 4cc8bb3..2a52fb1 100644 --- a/ts/apps/admin/lib/geoblocking-auth.ts +++ b/ts/apps/admin/lib/geoblocking-auth.ts @@ -1,25 +1,56 @@ import { createHash } from "crypto"; import { clusterApiUrl, Connection, PublicKey } from "@solana/web3.js"; +import * as multisig from "@sqds/multisig"; import { ADMIN_AUTH_SIGNATURE_TTL_MS, buildAdminAccessMessage, type AdminAuthRequestChallenge, } from "./admin-auth-message"; import { consumeAdminAuthNonce } from "./admin-auth-nonce"; +import { buildAdminAuthContext } from "./admin-auth-nonce"; import { getPoolPda, getReadonlyProgram } from "./program"; import { getConfiguredRpcCluster } from "./solana-env"; const CLOCK_SKEW_TOLERANCE_MS = 30 * 1000; // allow 30 s of clock skew for future timestamps -const ADMIN_WALLETS_TTL_MS = 60 * 1000; -const ADMIN_WALLETS_FAILURE_BACKOFF_MS = 15 * 1000; +const ADMIN_AUTHORITY_TTL_MS = Number(process.env.ADMIN_AUTHORITY_TTL_MS ?? 30 * 1000); +const ADMIN_AUTHORITY_FAILURE_BACKOFF_MS = 15 * 1000; interface PoolAccountLike { masterWallet: { toBase58: () => string }; } -let adminWalletsCache: { wallets: Set; ts: number } | null = null; -let adminWalletsPromise: Promise> | null = null; -let adminWalletsFailureTs = 0; +export type AdminGovernanceMode = "single-wallet" | "squads-v4"; +export type AdminRole = "single-wallet" | "squads-member" | "override" | "none"; + +export interface AdminIdentity { + wallet: string; + isAdmin: boolean; + role: AdminRole; + governanceMode: AdminGovernanceMode; + poolMasterWallet: string; + squadsMultisig: string | null; + squadsVault: string | null; + squadsVaultIndex: number | null; + squadsPermissions: string[]; +} + +interface SquadsMemberSnapshot { + wallet: string; + permissions: string[]; +} + +interface AdminAuthorityState { + poolMasterWallet: string; + governanceMode: AdminGovernanceMode; + squadsMultisig: string | null; + squadsVault: string | null; + squadsVaultIndex: number | null; + squadsMembers: SquadsMemberSnapshot[]; +} + +let adminAuthorityCache: { state: AdminAuthorityState; ts: number } | null = null; +let adminAuthorityPromise: Promise | null = null; +let adminAuthorityFailureTs = 0; function getRpcEndpoints(): string[] { const cluster = getConfiguredRpcCluster(); @@ -36,76 +67,230 @@ function getRpcEndpoints(): string[] { function withAdminOverride(wallets: Iterable): Set { const resolved = new Set(wallets); const override = process.env.ADMIN_OVERRIDE_WALLET?.trim(); - if (override) { - resolved.add(override); + if (!override) { + return resolved; + } + + const expiresAtRaw = process.env.ADMIN_OVERRIDE_EXPIRES_AT?.trim(); + const expiresAtMs = expiresAtRaw ? Date.parse(expiresAtRaw) : NaN; + if (!expiresAtRaw || !Number.isFinite(expiresAtMs)) { + console.warn("[admin-auth] ADMIN_OVERRIDE_WALLET ignored: ADMIN_OVERRIDE_EXPIRES_AT is missing or invalid"); + return resolved; + } + if (Date.now() >= expiresAtMs) { + console.warn("[admin-auth] ADMIN_OVERRIDE_WALLET ignored: override is expired"); + return resolved; + } + + try { + resolved.add(new PublicKey(override).toBase58()); + } catch { + console.warn("[admin-auth] ADMIN_OVERRIDE_WALLET ignored: invalid wallet"); + return resolved; } return resolved; } -export async function getAuthorizedAdminWallets(): Promise> { - if ( - adminWalletsCache && - Date.now() - adminWalletsCache.ts < ADMIN_WALLETS_TTL_MS - ) { - return withAdminOverride(adminWalletsCache.wallets); +function getConfiguredSquadsMultisig(): PublicKey | null { + const value = + process.env.SQUADS_MULTISIG_PUBKEY?.trim() || + process.env.NEXT_PUBLIC_SQUADS_MULTISIG_PUBKEY?.trim(); + return value ? new PublicKey(value) : null; +} + +function getConfiguredSquadsVaultIndex(): number { + const raw = + process.env.SQUADS_VAULT_INDEX?.trim() || + process.env.NEXT_PUBLIC_SQUADS_VAULT_INDEX?.trim() || + "0"; + const value = Number(raw); + if (!Number.isInteger(value) || value < 0) { + throw new Error("Invalid Squads vault index"); } + return value; +} - if ( - adminWalletsFailureTs && - Date.now() - adminWalletsFailureTs < ADMIN_WALLETS_FAILURE_BACKOFF_MS - ) { - if (adminWalletsCache) { - return withAdminOverride(adminWalletsCache.wallets); - } - throw new Error("Admin wallet lookup temporarily unavailable"); +function getSquadsConfig(): + | { multisigPda: PublicKey; vaultPda: PublicKey; vaultIndex: number } + | null { + const multisigPda = getConfiguredSquadsMultisig(); + if (!multisigPda) return null; + + const vaultIndex = getConfiguredSquadsVaultIndex(); + const vaultPda = multisig.getVaultPda({ multisigPda, index: vaultIndex })[0]; + return { multisigPda, vaultPda, vaultIndex }; +} + +function describeSquadsPermissions(permissions: multisig.generated.Permissions): string[] { + const result: string[] = []; + if (multisig.types.Permissions.has(permissions, multisig.types.Permission.Initiate)) { + result.push("initiate"); + } + if (multisig.types.Permissions.has(permissions, multisig.types.Permission.Vote)) { + result.push("vote"); + } + if (multisig.types.Permissions.has(permissions, multisig.types.Permission.Execute)) { + result.push("execute"); + } + return result; +} + +function memberHasConfiguredPermission(member: SquadsMemberSnapshot): boolean { + const required = (process.env.ADMIN_SQUADS_REQUIRED_PERMISSION ?? "member") + .trim() + .toLowerCase(); + + if (!required || required === "member") { + return true; } - if (adminWalletsPromise) { - return withAdminOverride(await adminWalletsPromise); + if (required === "initiate" || required === "vote" || required === "execute") { + return member.permissions.includes(required); } - adminWalletsPromise = (async () => { - const endpoints = getRpcEndpoints(); - let lastError: unknown; + throw new Error("Invalid ADMIN_SQUADS_REQUIRED_PERMISSION"); +} - for (const endpoint of endpoints) { - try { - const connection = new Connection(endpoint, "confirmed"); - const program = getReadonlyProgram(connection); - const accountApi = program.account as { - pool: { fetch: (pubkey: ReturnType) => Promise }; +async function fetchAdminAuthorityState(): Promise { + const endpoints = getRpcEndpoints(); + const squadsConfig = getSquadsConfig(); + let lastError: unknown; + + for (const endpoint of endpoints) { + try { + const connection = new Connection(endpoint, "confirmed"); + const program = getReadonlyProgram(connection); + const accountApi = program.account as { + pool: { fetch: (pubkey: ReturnType) => Promise }; + }; + const poolState = await accountApi.pool.fetch(getPoolPda()); + const poolMasterWallet = poolState.masterWallet.toBase58(); + + if (squadsConfig && poolMasterWallet === squadsConfig.vaultPda.toBase58()) { + const squadsAccount = await multisig.accounts.Multisig.fromAccountAddress( + connection, + squadsConfig.multisigPda, + "confirmed", + ); + + return { + poolMasterWallet, + governanceMode: "squads-v4", + squadsMultisig: squadsConfig.multisigPda.toBase58(), + squadsVault: squadsConfig.vaultPda.toBase58(), + squadsVaultIndex: squadsConfig.vaultIndex, + squadsMembers: squadsAccount.members.map((member) => ({ + wallet: member.key.toBase58(), + permissions: describeSquadsPermissions(member.permissions), + })), }; - const poolState = await accountApi.pool.fetch(getPoolPda()); - const wallets = new Set([poolState.masterWallet.toBase58()]); - - adminWalletsFailureTs = 0; - adminWalletsCache = { wallets, ts: Date.now() }; - return wallets; - } catch (error) { - lastError = error; } + + return { + poolMasterWallet, + governanceMode: "single-wallet", + squadsMultisig: null, + squadsVault: null, + squadsVaultIndex: null, + squadsMembers: [], + }; + } catch (error) { + lastError = error; } + } - const override = process.env.ADMIN_OVERRIDE_WALLET?.trim(); - if (override) { - const wallets = new Set(adminWalletsCache?.wallets ?? []); - adminWalletsCache = { wallets, ts: Date.now() }; - return wallets; + throw lastError; +} + +async function getAdminAuthorityState(): Promise { + if ( + adminAuthorityCache && + Date.now() - adminAuthorityCache.ts < ADMIN_AUTHORITY_TTL_MS + ) { + return adminAuthorityCache.state; + } + + if ( + adminAuthorityFailureTs && + Date.now() - adminAuthorityFailureTs < ADMIN_AUTHORITY_FAILURE_BACKOFF_MS + ) { + if (adminAuthorityCache) { + return adminAuthorityCache.state; } + throw new Error("Admin authority lookup temporarily unavailable"); + } + + if (adminAuthorityPromise) { + return adminAuthorityPromise; + } - throw lastError; - })(); + adminAuthorityPromise = fetchAdminAuthorityState(); try { - return withAdminOverride(await adminWalletsPromise); + const state = await adminAuthorityPromise; + adminAuthorityFailureTs = 0; + adminAuthorityCache = { state, ts: Date.now() }; + return state; } catch (error) { - adminWalletsFailureTs = Date.now(); + adminAuthorityFailureTs = Date.now(); throw error; } finally { - adminWalletsPromise = null; + adminAuthorityPromise = null; } } +export async function resolveAdminIdentity(wallet: string): Promise { + const state = await getAdminAuthorityState(); + const overrideWallets = withAdminOverride([]); + if (overrideWallets.has(wallet)) { + console.warn("[admin-auth] ADMIN_OVERRIDE_WALLET used", { + wallet, + expiresAt: process.env.ADMIN_OVERRIDE_EXPIRES_AT, + governanceMode: state.governanceMode, + }); + return { + wallet, + isAdmin: true, + role: "override", + governanceMode: state.governanceMode, + poolMasterWallet: state.poolMasterWallet, + squadsMultisig: state.squadsMultisig, + squadsVault: state.squadsVault, + squadsVaultIndex: state.squadsVaultIndex, + squadsPermissions: [], + }; + } + + if (state.governanceMode === "squads-v4") { + const member = state.squadsMembers.find((entry) => entry.wallet === wallet); + const isAdmin = !!member && memberHasConfiguredPermission(member); + return { + wallet, + isAdmin, + role: isAdmin ? "squads-member" : "none", + governanceMode: state.governanceMode, + poolMasterWallet: state.poolMasterWallet, + squadsMultisig: state.squadsMultisig, + squadsVault: state.squadsVault, + squadsVaultIndex: state.squadsVaultIndex, + squadsPermissions: member?.permissions ?? [], + }; + } + + const isAdmin = wallet === state.poolMasterWallet; + return { + wallet, + isAdmin, + role: isAdmin ? "single-wallet" : "none", + governanceMode: state.governanceMode, + poolMasterWallet: state.poolMasterWallet, + squadsMultisig: state.squadsMultisig, + squadsVault: state.squadsVault, + squadsVaultIndex: state.squadsVaultIndex, + squadsPermissions: [], + }; +} + function decodeBase64(value: string) { return new Uint8Array(Buffer.from(value, "base64")); } @@ -143,6 +328,8 @@ function hashBodyText(bodyText: string): string { } function validateSignedChallenge(args: { + wallet: string; + domain: string; issuedAt: string | null; nonce: string | null; method: string; @@ -151,7 +338,7 @@ function validateSignedChallenge(args: { }): | { ok: true; challenge: AdminAuthRequestChallenge } | { ok: false; error: string } { - const { issuedAt, nonce, method, route, bodyHash } = args; + const { wallet, domain, issuedAt, nonce, method, route, bodyHash } = args; if (!issuedAt || !nonce) { return { ok: false as const, error: "Missing admin authorization headers" }; @@ -176,6 +363,7 @@ function validateSignedChallenge(args: { return { ok: true as const, challenge: { + ...buildAdminAuthContext({ wallet, domain }), method, route, bodyHash, @@ -190,17 +378,20 @@ export async function authorizeGeoblockingUpdate(args: { signature: string | null; issuedAt: string | null; nonce: string | null; + domain: string; method: string; route: string; bodyText: string; }) { - const { wallet, signature, issuedAt, nonce, method, route, bodyText } = args; + const { wallet, signature, issuedAt, nonce, domain, method, route, bodyText } = args; if (!wallet || !signature) { return { ok: false as const, error: "Missing admin authorization headers" }; } const challenge = validateSignedChallenge({ + wallet, + domain, issuedAt, nonce, method, @@ -219,11 +410,6 @@ export async function authorizeGeoblockingUpdate(args: { return { ok: false as const, error: "Invalid admin signature" }; } - const authorizedWallets = await getAuthorizedAdminWallets(); - if (!authorizedWallets.has(wallet)) { - return { ok: false as const, error: "Connected wallet is not authorized" }; - } - const nonceResult = await consumeAdminAuthNonce(challenge.challenge); if (!nonceResult.ok) { return { @@ -231,12 +417,17 @@ export async function authorizeGeoblockingUpdate(args: { error: nonceResult.error ?? "Admin authorization nonce is invalid", }; } + + const identity = await resolveAdminIdentity(wallet); + if (!identity.isAdmin) { + return { ok: false as const, error: "Connected wallet is not authorized" }; + } + + return { ok: true as const, identity }; } catch (e: unknown) { console.error("[geoblocking-auth] Authorization verification failed:", e instanceof Error ? e.message : e); return { ok: false as const, error: "Failed to verify admin authorization" }; } - - return { ok: true as const }; } export async function authorizeAdminAccess(args: { @@ -244,17 +435,20 @@ export async function authorizeAdminAccess(args: { signature: string | null; issuedAt: string | null; nonce: string | null; + domain: string; method: string; route: string; bodyHash: string; }) { - const { wallet, signature, issuedAt, nonce, method, route, bodyHash } = args; + const { wallet, signature, issuedAt, nonce, domain, method, route, bodyHash } = args; if (!wallet || !signature) { return { ok: false as const, error: "Missing admin authorization headers" }; } const challenge = validateSignedChallenge({ + wallet, + domain, issuedAt, nonce, method, @@ -275,12 +469,6 @@ export async function authorizeAdminAccess(args: { return { ok: false as const, error: "Invalid admin signature" }; } - const authorizedWallets = await getAuthorizedAdminWallets(); - const isAdmin = authorizedWallets.has(wallet); - if (!isAdmin) { - return { ok: true as const, isAdmin: false }; - } - const nonceResult = await consumeAdminAuthNonce(challenge.challenge); if (!nonceResult.ok) { return { @@ -289,7 +477,8 @@ export async function authorizeAdminAccess(args: { }; } - return { ok: true as const, isAdmin: true }; + const identity = await resolveAdminIdentity(wallet); + return { ok: true as const, isAdmin: identity.isAdmin, identity }; } catch (e: unknown) { console.error("[admin-auth] Access verification failed:", e instanceof Error ? e.message : e); return { ok: false as const, error: "Failed to verify admin authorization" }; diff --git a/ts/apps/admin/lib/master-program.test.ts b/ts/apps/admin/lib/master-program.test.ts index 55aa1b7..4f8aff6 100644 --- a/ts/apps/admin/lib/master-program.test.ts +++ b/ts/apps/admin/lib/master-program.test.ts @@ -8,16 +8,16 @@ import { describe("master-program PDA derivation", () => { it("derives the current pool PDA deterministically", () => { expect(getMasterPoolPda(MASTER_PROGRAM_ID).toBase58()).toBe( - "9i5uwwby6AH3xEeGMkNoCgvxtMjNdq1HBVHAfp9YVf8G" + "DhKPBb5R8xG8U3obBcWwFXvLXhAFrY5YbRz9FCtjKZzN" ); }); it("derives withdrawal PDAs for known ids", () => { expect(getMasterWithdrawalPda(BigInt(1), MASTER_PROGRAM_ID).toBase58()).toBe( - "6M8WDsqeNMpSpzQ8MG6hZWhncrDrXqTnEF9b64N5jhHb" + "8RkMsoQpqZko9ACyWUxiGrDgLbZSWx8mbebjePUuyT83" ); expect(getMasterWithdrawalPda(BigInt(7), MASTER_PROGRAM_ID).toBase58()).toBe( - "DUQRAd6PaVSeVs3ibg7uZp2AiZ2QNUjMkhHwxQFbyt4A" + "4Wy78tw5rMqEdjDJq84rHtQz6DTDbuwaHQ7g2p6EiL1J" ); }); }); diff --git a/ts/apps/admin/lib/metrics-history.ts b/ts/apps/admin/lib/metrics-history.ts index 419814f..d8acb05 100644 --- a/ts/apps/admin/lib/metrics-history.ts +++ b/ts/apps/admin/lib/metrics-history.ts @@ -13,7 +13,7 @@ import type { DateRangeQuery, } from "@bunkercash/metrics-data"; import { authorizeAdminAccess } from "./geoblocking-auth"; -import { getAdminAuthRoute, getEmptyBodyHash } from "./admin-auth-nonce"; +import { getAdminAuthDomain, getAdminAuthRoute, getEmptyBodyHash } from "./admin-auth-nonce"; async function getAuthenticatedClient(request: Request) { const wallet = request.headers.get("x-admin-wallet"); @@ -26,6 +26,7 @@ async function getAuthenticatedClient(request: Request) { signature, issuedAt, nonce, + domain: getAdminAuthDomain(request), method: request.method, route: getAdminAuthRoute(request), bodyHash: getEmptyBodyHash(), diff --git a/ts/apps/admin/lib/privileged-admin-actions.test.ts b/ts/apps/admin/lib/privileged-admin-actions.test.ts new file mode 100644 index 0000000..d1a334b --- /dev/null +++ b/ts/apps/admin/lib/privileged-admin-actions.test.ts @@ -0,0 +1,90 @@ +import { readFileSync } from "fs"; +import path from "path"; +import { describe, expect, it } from "vitest"; + +const adminRoot = path.resolve(__dirname, ".."); + +const privilegedComponentPaths = [ + "components/fees-card.tsx", + "components/mint-setup-card.tsx", + "components/purchase-limits-card.tsx", + "components/settlement-card.tsx", + "components/master-operations-card.tsx", +]; + +function readAdminFile(relativePath: string): string { + return readFileSync(path.join(adminRoot, relativePath), "utf8"); +} + +describe("privileged admin action execution", () => { + it("does not pass the human wallet as the privileged admin/master authority", () => { + for (const relativePath of privilegedComponentPaths) { + const source = readAdminFile(relativePath); + + expect(source, relativePath).not.toMatch( + /\badmin:\s*(?:wallet\.)?publicKey\b/, + ); + expect(source, relativePath).not.toMatch( + /\bmasterWallet:\s*(?:wallet\.)?publicKey\b/, + ); + } + }); + + it("routes privileged component submissions through the shared admin transaction hook", () => { + for (const relativePath of privilegedComponentPaths) { + const source = readAdminFile(relativePath); + + expect(source, relativePath).toContain("useAdminTransaction"); + expect(source, relativePath).toContain("submit({"); + } + }); + + it("requires pre-sign review data for privileged component submissions", () => { + for (const relativePath of privilegedComponentPaths) { + const source = readAdminFile(relativePath); + + expect(source, relativePath).toContain("review:"); + } + + const hookSource = readAdminFile("hooks/useAdminTransaction.ts"); + expect(hookSource).toContain("requirePreSignReview"); + expect(hookSource).toContain("buildTransactionReview"); + }); + + it("does not use Anchor rpc shortcuts for privileged actions", () => { + for (const relativePath of privilegedComponentPaths) { + const source = readAdminFile(relativePath); + + expect(source, relativePath).not.toContain(".rpc()"); + } + }); + + it("preserves settleClaims remaining accounts when building settlement instructions", () => { + const source = readAdminFile("components/settlement-card.tsx"); + + expect(source).toContain("settleClaims(Buffer.alloc(0))"); + expect(source).toContain(".remainingAccounts(remainingAccounts)"); + expect(source).toMatch( + /remainingAccounts\.push\(\s*\{ pubkey: claimPubkey, isSigner: false, isWritable: true \},\s*\{ pubkey: userUsdcAta, isSigner: false, isWritable: true \},\s*\)/s, + ); + }); + + it("creates Squads vault transactions instead of direct submits in Squads mode", () => { + const source = readAdminFile("hooks/useAdminTransaction.ts"); + + expect(source).toContain("vaultTransactionCreate"); + expect(source).toContain("proposalCreate"); + expect(source).toContain('auth.governanceMode === "squads-v4"'); + expect(source).toContain("sendAndConfirmWalletTransaction"); + }); + + it("does not auto-approve or auto-execute high-risk Squads proposals", () => { + const source = readAdminFile("hooks/useAdminTransaction.ts"); + + expect(source).not.toContain("proposalApprove"); + expect(source).not.toContain("vaultTransactionExecute"); + expect(source).toContain("autoApproved: false"); + expect(source).toContain("decodedInstructions"); + expect(source).toContain("validate-instructions"); + }); +}); diff --git a/ts/apps/admin/lib/program.ts b/ts/apps/admin/lib/program.ts index 268fbc3..0e857c3 100644 --- a/ts/apps/admin/lib/program.ts +++ b/ts/apps/admin/lib/program.ts @@ -6,9 +6,20 @@ import idlJson from './bunkercash.fixed.idl.json' type IdlWithAddress = Idl & { address: string } -const idl = idlJson as unknown as Idl const idlWithAddress = idlJson as unknown as IdlWithAddress -const PROGRAM_ID = new PublicKey(idlWithAddress.address) + +function resolveProgramAddress(): string { + const configuredProgramId = process.env.NEXT_PUBLIC_BUNKERCASH_PROGRAM_ID?.trim() + if (configuredProgramId) return configuredProgramId + if (process.env.NEXT_PUBLIC_DEPLOY_ENV === 'production') { + throw new Error('NEXT_PUBLIC_BUNKERCASH_PROGRAM_ID is required in production') + } + return idlWithAddress.address +} + +const programAddress = resolveProgramAddress() +const PROGRAM_ID = new PublicKey(programAddress) +const idl = { ...idlJson, address: programAddress } as unknown as Idl export type BunkercashIDL = Idl type BrowserWallet = ConstructorParameters[1] diff --git a/ts/apps/admin/lib/solana-env.ts b/ts/apps/admin/lib/solana-env.ts index 3ab3620..0c74a40 100644 --- a/ts/apps/admin/lib/solana-env.ts +++ b/ts/apps/admin/lib/solana-env.ts @@ -7,6 +7,7 @@ export function getConfiguredSolanaCluster(): SolanaWalletCluster { const cluster = process.env.NEXT_PUBLIC_SOLANA_CLUSTER ?? process.env.NEXT_PUBLIC_CLUSTER; + const deployEnv = process.env.NEXT_PUBLIC_DEPLOY_ENV; if ( cluster === "mainnet-beta" || @@ -17,11 +18,18 @@ export function getConfiguredSolanaCluster(): SolanaWalletCluster { return cluster; } + if (deployEnv === "production") { + throw new Error("Production Solana cluster must be explicitly set to mainnet-beta"); + } + return "devnet"; } export function getConfiguredRpcCluster(): SolanaCluster { const cluster = getConfiguredSolanaCluster(); + if (process.env.NEXT_PUBLIC_DEPLOY_ENV === "production" && cluster !== "mainnet-beta") { + throw new Error("Production Solana cluster must be mainnet-beta"); + } return cluster === "localnet" ? "devnet" : cluster; } diff --git a/ts/apps/admin/lib/transaction-review.test.ts b/ts/apps/admin/lib/transaction-review.test.ts new file mode 100644 index 0000000..aab8f62 --- /dev/null +++ b/ts/apps/admin/lib/transaction-review.test.ts @@ -0,0 +1,76 @@ +import { PublicKey, TransactionInstruction } from "@solana/web3.js"; +import { describe, expect, it, vi } from "vitest"; +import { + buildTransactionReview, + formatTransactionReview, + requirePreSignReview, +} from "./transaction-review"; + +describe("transaction review disclosure", () => { + it("displays the same program and accounts as the submitted instruction", () => { + const programId = PublicKey.unique(); + const writableSigner = PublicKey.unique(); + const readonlyAccount = PublicKey.unique(); + const instruction = new TransactionInstruction({ + programId, + keys: [ + { pubkey: writableSigner, isSigner: true, isWritable: true }, + { pubkey: readonlyAccount, isSigner: false, isWritable: false }, + ], + data: Buffer.alloc(0), + }); + + const review = buildTransactionReview({ + instructions: [instruction], + accountLabels: { + [writableSigner.toBase58()]: "source vault", + [readonlyAccount.toBase58()]: "mint", + }, + }); + + expect(review.instructions[0].programId).toBe(programId.toBase58()); + expect(review.instructions[0].accounts).toEqual([ + { + label: "source vault", + pubkey: writableSigner.toBase58(), + isSigner: true, + isWritable: true, + }, + { + label: "mint", + pubkey: readonlyAccount.toBase58(), + isSigner: false, + isWritable: false, + }, + ]); + + const text = formatTransactionReview(review); + expect(text).toContain(`program ID: ${programId.toBase58()}`); + expect(text).toContain(`source vault: ${writableSigner.toBase58()} (signer, writable)`); + expect(text).toContain(`mint: ${readonlyAccount.toBase58()} (non-signer, readonly)`); + }); + + it("blocks signing when the signer rejects the pre-sign review", () => { + const originalWindow = globalThis.window; + const confirm = vi.fn().mockReturnValue(false); + vi.stubGlobal("window", { confirm }); + + expect(() => + requirePreSignReview( + buildTransactionReview({ + instructions: [ + new TransactionInstruction({ + programId: PublicKey.unique(), + keys: [], + data: Buffer.alloc(0), + }), + ], + }), + ), + ).toThrow("Transaction review rejected before signing"); + expect(confirm).toHaveBeenCalledTimes(1); + + vi.stubGlobal("window", originalWindow); + }); +}); + diff --git a/ts/apps/admin/lib/transaction-review.ts b/ts/apps/admin/lib/transaction-review.ts new file mode 100644 index 0000000..1fd5465 --- /dev/null +++ b/ts/apps/admin/lib/transaction-review.ts @@ -0,0 +1,122 @@ +import type { TransactionInstruction } from "@solana/web3.js"; + +export interface TransactionReviewField { + label: string; + value: string; +} + +export interface TransactionReviewInput { + title?: string; + summary?: string; + fields?: TransactionReviewField[]; + accountLabels?: Record; + remainingAccounts?: TransactionReviewField[]; +} + +export interface TransactionReviewAccount { + label: string; + pubkey: string; + isSigner: boolean; + isWritable: boolean; +} + +export interface TransactionReviewInstruction { + index: number; + programId: string; + accounts: TransactionReviewAccount[]; +} + +export interface TransactionReview { + title: string; + summary: string; + fields: TransactionReviewField[]; + remainingAccounts: TransactionReviewField[]; + instructions: TransactionReviewInstruction[]; +} + +function accountLabel( + accountLabels: Record | undefined, + pubkey: string, + fallback: string, +): string { + return accountLabels?.[pubkey] ?? fallback; +} + +export function buildTransactionReview({ + instructions, + title, + summary, + fields = [], + accountLabels, + remainingAccounts = [], +}: TransactionReviewInput & { + instructions: TransactionInstruction[]; +}): TransactionReview { + return { + title: title ?? "Pre-sign transaction review", + summary: summary ?? "Review the exact programs and accounts before signing.", + fields, + remainingAccounts, + instructions: instructions.map((instruction, index) => ({ + index, + programId: instruction.programId.toBase58(), + accounts: instruction.keys.map((key, accountIndex) => { + const pubkey = key.pubkey.toBase58(); + return { + label: accountLabel(accountLabels, pubkey, `Account ${accountIndex}`), + pubkey, + isSigner: key.isSigner, + isWritable: key.isWritable, + }; + }), + })), + }; +} + +export function formatTransactionReview(review: TransactionReview): string { + const lines = [ + review.title, + "", + review.summary, + ]; + + if (review.fields.length > 0) { + lines.push("", "Action details"); + for (const field of review.fields) { + lines.push(`${field.label}: ${field.value}`); + } + } + + for (const instruction of review.instructions) { + lines.push("", `Instruction ${instruction.index + 1}`); + lines.push(`program ID: ${instruction.programId}`); + for (const account of instruction.accounts) { + const flags = [ + account.isSigner ? "signer" : "non-signer", + account.isWritable ? "writable" : "readonly", + ].join(", "); + lines.push(`${account.label}: ${account.pubkey} (${flags})`); + } + } + + if (review.remainingAccounts.length > 0) { + lines.push("", "Remaining accounts"); + for (const account of review.remainingAccounts) { + lines.push(`${account.label}: ${account.value}`); + } + } + + lines.push("", "Continue to wallet signature?"); + return lines.join("\n"); +} + +export function requirePreSignReview(review: TransactionReview): void { + if (typeof window === "undefined" || typeof window.confirm !== "function") { + return; + } + + if (!window.confirm(formatTransactionReview(review))) { + throw new Error("Transaction review rejected before signing"); + } +} + diff --git a/ts/apps/admin/package.json b/ts/apps/admin/package.json index c9d8afd..675288b 100644 --- a/ts/apps/admin/package.json +++ b/ts/apps/admin/package.json @@ -6,9 +6,18 @@ "scripts": { "dev": "next dev -p 3001", "build": "next build", - "build:cf": "opennextjs-cloudflare build", + "preflight:dev": "node ../../scripts/deploy-preflight.mjs --app admin --env dev", + "preflight:staging": "node ../../scripts/deploy-preflight.mjs --app admin --env staging", + "preflight:production": "node ../../scripts/deploy-preflight.mjs --app admin --env production", + "build:cf": "npm run build:cf:dev", + "build:cf:dev": "npm run preflight:dev && opennextjs-cloudflare build", + "build:cf:staging": "npm run preflight:staging && opennextjs-cloudflare build", + "build:cf:production": "npm run preflight:production && opennextjs-cloudflare build", "preview": "opennextjs-cloudflare preview", - "deploy": "opennextjs-cloudflare deploy", + "deploy": "npm run deploy:dev", + "deploy:dev": "npm run preflight:dev && opennextjs-cloudflare deploy --env dev", + "deploy:staging": "npm run preflight:staging && opennextjs-cloudflare deploy --env staging", + "deploy:production": "npm run preflight:production && opennextjs-cloudflare deploy --env production", "start": "next start -p 3001", "lint": "eslint", "test": "vitest run", @@ -18,7 +27,7 @@ "@bunkercash/cloudflare-kv": "workspace:0.1.0", "@bunkercash/metrics-data": "workspace:0.1.0", "@bunkercash/support-requests": "workspace:0.1.0", - "@coral-xyz/anchor": "=0.30.1", + "@coral-xyz/anchor": "=0.31.1", "@opennextjs/cloudflare": "=1.17.1", "@radix-ui/react-slot": "=1.2.4", "@solana/spl-token": "=0.4.9", @@ -27,6 +36,7 @@ "@solana/wallet-adapter-react-ui": "=0.9.35", "@solana/wallet-adapter-wallets": "=0.19.32", "@solana/web3.js": "=1.98.4", + "@sqds/multisig": "=2.1.4", "class-variance-authority": "=0.7.1", "clsx": "=2.1.1", "lucide-react": "=0.548.0", diff --git a/ts/apps/admin/scripts/full-setup.ts b/ts/apps/admin/scripts/full-setup.ts index 81a6d14..862e8af 100644 --- a/ts/apps/admin/scripts/full-setup.ts +++ b/ts/apps/admin/scripts/full-setup.ts @@ -2,11 +2,20 @@ import { readFileSync } from "node:fs"; import { homedir } from "node:os"; import { resolve } from "node:path"; import { AnchorProvider, Program, BN, type Idl } from "@coral-xyz/anchor"; -import { Connection, Keypair, PublicKey, SystemProgram, SYSVAR_INSTRUCTIONS_PUBKEY } from "@solana/web3.js"; +import type { Wallet } from "@coral-xyz/anchor/dist/cjs/provider"; +import { Connection, Keypair, PublicKey, SystemProgram, SYSVAR_INSTRUCTIONS_PUBKEY, Transaction, VersionedTransaction } from "@solana/web3.js"; const TOKEN_METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); const TOKEN_2022_PROGRAM_ID = new PublicKey("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"); +type SignableTransaction = Transaction | VersionedTransaction; +type ProgramMethod = { + accounts(accounts: Record): { + rpc(): Promise; + }; +}; +type ProgramMethods = Record ProgramMethod>; + function expandHome(path: string): string { return path.startsWith("~/") ? resolve(homedir(), path.slice(2)) : path; } @@ -17,6 +26,24 @@ function loadKeypair(path: string): Keypair { return Keypair.fromSecretKey(secret); } +function signWithKeypair(tx: T, signer: Keypair): T { + if (tx instanceof Transaction) { + tx.partialSign(signer); + } else { + tx.sign([signer]); + } + return tx; +} + +function createAnchorWallet(signer: Keypair): Wallet { + return { + publicKey: signer.publicKey, + signTransaction: async (tx: T) => signWithKeypair(tx, signer), + signAllTransactions: async (txs: T[]) => + txs.map((tx) => signWithKeypair(tx, signer)), + }; +} + async function main() { const rpcUrl = process.env.RPC_URL ?? process.env.NEXT_PUBLIC_SOLANA_RPC_URL ?? "https://api.devnet.solana.com"; const signer = loadKeypair("~/.config/solana/id.json"); @@ -26,14 +53,11 @@ async function main() { const programId = new PublicKey(idlJson.address); const connection = new Connection(rpcUrl, "confirmed"); - const wallet = { - publicKey: signer.publicKey, - signTransaction: async (tx: any) => { tx.partialSign?.(signer) ?? tx.sign?.(signer); return tx; }, - signAllTransactions: async (txs: any[]) => txs.map((tx) => { tx.partialSign?.(signer) ?? tx.sign?.(signer); return tx; }), - }; + const wallet = createAnchorWallet(signer); - const provider = new AnchorProvider(connection, wallet as any, { commitment: "confirmed" }); + const provider = new AnchorProvider(connection, wallet, { commitment: "confirmed" }); const program = new Program(idlJson as Idl, provider); + const methods = program.methods as unknown as ProgramMethods; const [poolPda] = PublicKey.findProgramAddressSync([Buffer.from("bunkercash_pool")], programId); const [mintPda] = PublicKey.findProgramAddressSync([Buffer.from("bunkercash_mint")], programId); @@ -56,7 +80,7 @@ async function main() { } else { console.log("Step 1: Initializing pool + mint..."); // price = 1 USDC per token = 1_000_000 base units - const sig = await (program.methods as any) + const sig = await methods .initialize(signer.publicKey, new BN(1_000_000)) .accounts({ pool: poolPda, @@ -76,7 +100,7 @@ async function main() { console.log("Metadata already exists, skipping."); } else { console.log("Step 2: Creating metadata..."); - const sig = await (program.methods as any) + const sig = await methods .initMintMetadata("BunkerCash", "BNKR", "https://bunkercash.com/metadata.json") .accounts({ pool: poolPda, diff --git a/ts/apps/admin/scripts/init-metadata-8bxd.ts b/ts/apps/admin/scripts/init-metadata-8bxd.ts index 5986e41..dd4be9e 100644 --- a/ts/apps/admin/scripts/init-metadata-8bxd.ts +++ b/ts/apps/admin/scripts/init-metadata-8bxd.ts @@ -2,11 +2,20 @@ import { readFileSync } from "node:fs"; import { homedir } from "node:os"; import { resolve } from "node:path"; import { AnchorProvider, Program, type Idl } from "@coral-xyz/anchor"; -import { Connection, Keypair, PublicKey, SystemProgram, SYSVAR_INSTRUCTIONS_PUBKEY } from "@solana/web3.js"; +import type { Wallet } from "@coral-xyz/anchor/dist/cjs/provider"; +import { Connection, Keypair, PublicKey, SystemProgram, SYSVAR_INSTRUCTIONS_PUBKEY, Transaction, VersionedTransaction } from "@solana/web3.js"; const TOKEN_METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); const TOKEN_2022_PROGRAM_ID = new PublicKey("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"); +type SignableTransaction = Transaction | VersionedTransaction; +type ProgramMethod = { + accounts(accounts: Record): { + rpc(): Promise; + }; +}; +type ProgramMethods = Record ProgramMethod>; + function expandHome(path: string): string { return path.startsWith("~/") ? resolve(homedir(), path.slice(2)) : path; } @@ -17,6 +26,24 @@ function loadKeypair(path: string): Keypair { return Keypair.fromSecretKey(secret); } +function signWithKeypair(tx: T, signer: Keypair): T { + if (tx instanceof Transaction) { + tx.partialSign(signer); + } else { + tx.sign([signer]); + } + return tx; +} + +function createAnchorWallet(signer: Keypair): Wallet { + return { + publicKey: signer.publicKey, + signTransaction: async (tx: T) => signWithKeypair(tx, signer), + signAllTransactions: async (txs: T[]) => + txs.map((tx) => signWithKeypair(tx, signer)), + }; +} + async function main() { const rpcUrl = process.env.RPC_URL ?? process.env.NEXT_PUBLIC_SOLANA_RPC_URL ?? "https://api.devnet.solana.com"; const keypairPath = process.argv[2] ?? "~/.config/solana/id.json"; @@ -28,14 +55,11 @@ async function main() { const programId = new PublicKey(idlJson.address); const connection = new Connection(rpcUrl, "confirmed"); - const wallet = { - publicKey: signer.publicKey, - signTransaction: async (tx: any) => { tx.partialSign?.(signer) ?? tx.sign?.(signer); return tx; }, - signAllTransactions: async (txs: any[]) => txs.map((tx) => { tx.partialSign?.(signer) ?? tx.sign?.(signer); return tx; }), - }; + const wallet = createAnchorWallet(signer); - const provider = new AnchorProvider(connection, wallet as any, { commitment: "confirmed" }); + const provider = new AnchorProvider(connection, wallet, { commitment: "confirmed" }); const program = new Program(idlJson as Idl, provider); + const methods = program.methods as unknown as ProgramMethods; const [poolPda] = PublicKey.findProgramAddressSync([Buffer.from("bunkercash_pool")], programId); const [mintPda] = PublicKey.findProgramAddressSync([Buffer.from("bunkercash_mint")], programId); @@ -50,7 +74,7 @@ async function main() { console.log("Metadata:", metadataPda.toBase58()); console.log("Signer:", signer.publicKey.toBase58()); - const sig = await (program.methods as any) + const sig = await methods .initMintMetadata("BunkerCash", "BNKR", "https://example.com/metadata.json") .accounts({ pool: poolPda, diff --git a/ts/apps/admin/scripts/setup-mint-and-metadata.ts b/ts/apps/admin/scripts/setup-mint-and-metadata.ts index d4aa2aa..50c1357 100644 --- a/ts/apps/admin/scripts/setup-mint-and-metadata.ts +++ b/ts/apps/admin/scripts/setup-mint-and-metadata.ts @@ -2,11 +2,20 @@ import { readFileSync } from "node:fs"; import { homedir } from "node:os"; import { resolve } from "node:path"; import { AnchorProvider, Program, type Idl } from "@coral-xyz/anchor"; -import { Connection, Keypair, PublicKey, SystemProgram, SYSVAR_INSTRUCTIONS_PUBKEY } from "@solana/web3.js"; +import type { Wallet } from "@coral-xyz/anchor/dist/cjs/provider"; +import { Connection, Keypair, PublicKey, SystemProgram, SYSVAR_INSTRUCTIONS_PUBKEY, Transaction, VersionedTransaction } from "@solana/web3.js"; const TOKEN_METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); const TOKEN_2022_PROGRAM_ID = new PublicKey("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"); +type SignableTransaction = Transaction | VersionedTransaction; +type ProgramMethod = { + accounts(accounts: Record): { + rpc(): Promise; + }; +}; +type ProgramMethods = Record ProgramMethod>; + function parseArgs(argv: string[]) { const out: Record = {}; for (let i = 0; i < argv.length; i += 1) { @@ -33,6 +42,24 @@ function loadKeypair(path: string): Keypair { return Keypair.fromSecretKey(secret); } +function signWithKeypair(tx: T, signer: Keypair): T { + if (tx instanceof Transaction) { + tx.partialSign(signer); + } else { + tx.sign([signer]); + } + return tx; +} + +function createAnchorWallet(signer: Keypair): Wallet { + return { + publicKey: signer.publicKey, + signTransaction: async (tx: T) => signWithKeypair(tx, signer), + signAllTransactions: async (txs: T[]) => + txs.map((tx) => signWithKeypair(tx, signer)), + }; +} + function getClusterFromRpc(rpcUrl: string): "devnet" | "testnet" | "mainnet-beta" { if (rpcUrl.includes("devnet")) return "devnet"; if (rpcUrl.includes("testnet")) return "testnet"; @@ -65,23 +92,11 @@ async function main() { const programId = new PublicKey(idlJson.address); const connection = new Connection(rpcUrl, "confirmed"); - const wallet = { - publicKey: signer.publicKey, - signTransaction: async (tx: any) => { - if (typeof tx.sign === "function") tx.sign(signer); - else if (typeof tx.partialSign === "function") tx.partialSign(signer); - return tx; - }, - signAllTransactions: async (txs: any[]) => - txs.map((tx) => { - if (typeof tx.sign === "function") tx.sign(signer); - else if (typeof tx.partialSign === "function") tx.partialSign(signer); - return tx; - }), - }; + const wallet = createAnchorWallet(signer); - const provider = new AnchorProvider(connection, wallet as any, { commitment: "confirmed" }); + const provider = new AnchorProvider(connection, wallet, { commitment: "confirmed" }); const program = new Program(idlJson as Idl, provider); + const methods = program.methods as unknown as ProgramMethods; const [poolPda] = PublicKey.findProgramAddressSync([Buffer.from("pool")], programId); const [mintPda] = PublicKey.findProgramAddressSync([Buffer.from("bunkercash_mint")], programId); @@ -105,7 +120,7 @@ async function main() { console.log("Mint already exists, skipping create_bunkercash_mint."); } else { console.log("Step 1: Creating BunkerCash mint..."); - const sig1 = await (program.methods as any) + const sig1 = await methods .createBunkercashMint() .accounts({ pool: poolPda, @@ -131,7 +146,7 @@ async function main() { console.log("Metadata already exists, skipping init_mint_metadata."); } else { console.log(`Step 2: Initializing metadata (name="${name}", symbol="${symbol}")...`); - const sig2 = await (program.methods as any) + const sig2 = await methods .initMintMetadata(name, symbol, uri) .accounts({ pool: poolPda, diff --git a/ts/apps/admin/scripts/update-metadata.ts b/ts/apps/admin/scripts/update-metadata.ts index df292dd..712389f 100644 --- a/ts/apps/admin/scripts/update-metadata.ts +++ b/ts/apps/admin/scripts/update-metadata.ts @@ -2,10 +2,19 @@ import { readFileSync } from "node:fs"; import { homedir } from "node:os"; import { resolve } from "node:path"; import { AnchorProvider, Program, type Idl } from "@coral-xyz/anchor"; -import { Connection, Keypair, PublicKey, SystemProgram, SYSVAR_INSTRUCTIONS_PUBKEY } from "@solana/web3.js"; +import type { Wallet } from "@coral-xyz/anchor/dist/cjs/provider"; +import { Connection, Keypair, PublicKey, SystemProgram, SYSVAR_INSTRUCTIONS_PUBKEY, Transaction, VersionedTransaction } from "@solana/web3.js"; const TOKEN_METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); +type SignableTransaction = Transaction | VersionedTransaction; +type ProgramMethod = { + accounts(accounts: Record): { + rpc(): Promise; + }; +}; +type ProgramMethods = Record ProgramMethod>; + function parseArgs(argv: string[]) { const out: Record = {}; for (let i = 0; i < argv.length; i += 1) { @@ -32,6 +41,24 @@ function loadKeypair(path: string): Keypair { return Keypair.fromSecretKey(secret); } +function signWithKeypair(tx: T, signer: Keypair): T { + if (tx instanceof Transaction) { + tx.partialSign(signer); + } else { + tx.sign([signer]); + } + return tx; +} + +function createAnchorWallet(signer: Keypair): Wallet { + return { + publicKey: signer.publicKey, + signTransaction: async (tx: T) => signWithKeypair(tx, signer), + signAllTransactions: async (txs: T[]) => + txs.map((tx) => signWithKeypair(tx, signer)), + }; +} + function getClusterFromRpc(rpcUrl: string): "devnet" | "testnet" | "mainnet-beta" { if (rpcUrl.includes("devnet")) return "devnet"; if (rpcUrl.includes("testnet")) return "testnet"; @@ -65,23 +92,11 @@ async function main() { const programId = new PublicKey(idlJson.address); const connection = new Connection(rpcUrl, "confirmed"); - const wallet = { - publicKey: signer.publicKey, - signTransaction: async (tx: any) => { - if (typeof tx.sign === "function") tx.sign(signer); - else if (typeof tx.partialSign === "function") tx.partialSign(signer); - return tx; - }, - signAllTransactions: async (txs: any[]) => - txs.map((tx) => { - if (typeof tx.sign === "function") tx.sign(signer); - else if (typeof tx.partialSign === "function") tx.partialSign(signer); - return tx; - }), - }; + const wallet = createAnchorWallet(signer); - const provider = new AnchorProvider(connection, wallet as any, { commitment: "confirmed" }); + const provider = new AnchorProvider(connection, wallet, { commitment: "confirmed" }); const program = new Program(idlJson as Idl, provider); + const methods = program.methods as unknown as ProgramMethods; const [poolPda] = PublicKey.findProgramAddressSync([Buffer.from("bunkercash_pool")], programId); const [mintPda] = PublicKey.findProgramAddressSync([Buffer.from("bunkercash_mint")], programId); @@ -96,7 +111,7 @@ async function main() { console.log("Metadata PDA:", metadataPda.toBase58()); console.log("Admin (signer):", signer.publicKey.toBase58()); - const sig = await (program.methods as any) + const sig = await methods .updateMintMetadata(name, symbol, uri) .accounts({ pool: poolPda, diff --git a/ts/apps/admin/tailwind.config.ts b/ts/apps/admin/tailwind.config.ts index 20f89b6..e76e4c9 100644 --- a/ts/apps/admin/tailwind.config.ts +++ b/ts/apps/admin/tailwind.config.ts @@ -1,4 +1,5 @@ import type { Config } from "tailwindcss"; +import tailwindcssAnimate from "tailwindcss-animate"; export default { darkMode: ["class"], @@ -61,5 +62,5 @@ export default { }, }, }, - plugins: [require("tailwindcss-animate")], + plugins: [tailwindcssAnimate], } satisfies Config; diff --git a/ts/apps/admin/worker.js b/ts/apps/admin/worker.js index 13050d7..48aa097 100644 --- a/ts/apps/admin/worker.js +++ b/ts/apps/admin/worker.js @@ -3,6 +3,8 @@ import { AdminAuthNonceDurableObject } from "./lib/admin-auth-nonce-durable-obje export { AdminAuthNonceDurableObject }; -export default { +const worker = { fetch: openNextWorker.fetch.bind(openNextWorker), }; + +export default worker; diff --git a/ts/apps/admin/wrangler.jsonc b/ts/apps/admin/wrangler.jsonc index 3bd1351..35b188b 100644 --- a/ts/apps/admin/wrangler.jsonc +++ b/ts/apps/admin/wrangler.jsonc @@ -9,28 +9,6 @@ "directory": ".open-next/assets", "binding": "ASSETS" }, - "services": [ - { - "binding": "WORKER_SELF_REFERENCE", - "service": "bunkercash-admin" - } - ], - "vars": { - "NEXT_PUBLIC_SOLANA_RPC_URL": "https://api.devnet.solana.com", - "NEXT_PUBLIC_SOLANA_CLUSTER": "devnet", - "NEXT_PUBLIC_CLUSTER": "devnet", - "NEXT_PUBLIC_USDC_MINT": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", - "NEXT_PUBLIC_TOKEN_METADATA_URI": "https://bunkercash-web.bunkercoin.workers.dev/bunkercash-metadata.json", - "NEXT_PUBLIC_SQUADS_MULTISIG_PUBKEY": "HEzTX4LNQ7cjrXTt1vKXyEZGtc94TKRUc9kWNFexJSGz" - }, - // Set ADMIN_OVERRIDE_WALLET in Cloudflare-managed worker env/secrets, not in version control. - "kv_namespaces": [ - { - "binding": "GEOBLOCKING_KV", - "id": "9abcd5888b5c436fba6f445f8ba68e98", - "preview_id": "a6f9582a6f8444bea09b37128e00bb17" - } - ], "durable_objects": { "bindings": [ { @@ -45,12 +23,108 @@ "new_sqlite_classes": ["AdminAuthNonceDurableObject"] } ], - "d1_databases": [ - { - "binding": "METRICS_DB", - "database_id": "97cc29d2-b9e4-4430-83ce-bb1272e1d629", - "database_name": "bunkercash-metrics", - "migrations_dir": "../../packages/metrics-data/migrations" + "env": { + "dev": { + "name": "bunkercash-admin-dev", + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "bunkercash-admin-dev" + } + ], + "vars": { + "NEXT_PUBLIC_DEPLOY_ENV": "dev", + "NEXT_PUBLIC_SOLANA_RPC_URL": "https://api.devnet.solana.com", + "NEXT_PUBLIC_SOLANA_CLUSTER": "devnet", + "NEXT_PUBLIC_CLUSTER": "devnet", + "NEXT_PUBLIC_USDC_MINT": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "NEXT_PUBLIC_BUNKERCASH_PROGRAM_ID": "Fp8b6p287TL5oPMwLVdwGys5phHNLcmTKNvVoGdCJS6g", + "NEXT_PUBLIC_TOKEN_METADATA_URI": "https://bunkercash-web-dev.bunkercoin.workers.dev/bunkercash-metadata.json", + "NEXT_PUBLIC_SQUADS_MULTISIG_PUBKEY": "HEzTX4LNQ7cjrXTt1vKXyEZGtc94TKRUc9kWNFexJSGz" + }, + "kv_namespaces": [ + { + "binding": "GEOBLOCKING_KV", + "id": "9abcd5888b5c436fba6f445f8ba68e98", + "preview_id": "a6f9582a6f8444bea09b37128e00bb17" + } + ], + "d1_databases": [ + { + "binding": "METRICS_DB", + "database_id": "97cc29d2-b9e4-4430-83ce-bb1272e1d629", + "database_name": "bunkercash-metrics-dev", + "migrations_dir": "../../packages/metrics-data/migrations" + } + ] + }, + "staging": { + "name": "bunkercash-admin-staging", + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "bunkercash-admin-staging" + } + ], + "vars": { + "NEXT_PUBLIC_DEPLOY_ENV": "staging", + "NEXT_PUBLIC_SOLANA_RPC_URL": "https://api.devnet.solana.com", + "NEXT_PUBLIC_SOLANA_CLUSTER": "devnet", + "NEXT_PUBLIC_CLUSTER": "devnet", + "NEXT_PUBLIC_USDC_MINT": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "NEXT_PUBLIC_BUNKERCASH_PROGRAM_ID": "Fp8b6p287TL5oPMwLVdwGys5phHNLcmTKNvVoGdCJS6g", + "NEXT_PUBLIC_TOKEN_METADATA_URI": "https://bunkercash-web-staging.bunkercoin.workers.dev/bunkercash-metadata.json", + "NEXT_PUBLIC_SQUADS_MULTISIG_PUBKEY": "HEzTX4LNQ7cjrXTt1vKXyEZGtc94TKRUc9kWNFexJSGz" + }, + "kv_namespaces": [ + { + "binding": "GEOBLOCKING_KV", + "id": "9abcd5888b5c436fba6f445f8ba68e98", + "preview_id": "a6f9582a6f8444bea09b37128e00bb17" + } + ], + "d1_databases": [ + { + "binding": "METRICS_DB", + "database_id": "97cc29d2-b9e4-4430-83ce-bb1272e1d629", + "database_name": "bunkercash-metrics-staging", + "migrations_dir": "../../packages/metrics-data/migrations" + } + ] + }, + "production": { + "name": "bunkercash-admin", + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "bunkercash-admin" + } + ], + "vars": { + "NEXT_PUBLIC_DEPLOY_ENV": "production", + "NEXT_PUBLIC_SOLANA_RPC_URL": "REPLACE_WITH_MAINNET_RPC_URL", + "NEXT_PUBLIC_SOLANA_CLUSTER": "mainnet-beta", + "NEXT_PUBLIC_CLUSTER": "mainnet-beta", + "NEXT_PUBLIC_USDC_MINT": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "NEXT_PUBLIC_BUNKERCASH_PROGRAM_ID": "REPLACE_WITH_MAINNET_PROGRAM_ID", + "NEXT_PUBLIC_TOKEN_METADATA_URI": "https://bunkercash.com/bunkercash-metadata.json", + "NEXT_PUBLIC_SQUADS_MULTISIG_PUBKEY": "REPLACE_WITH_MAINNET_SQUADS_MULTISIG" + }, + "kv_namespaces": [ + { + "binding": "GEOBLOCKING_KV", + "id": "REPLACE_WITH_PRODUCTION_GEOBLOCKING_KV_ID", + "preview_id": "REPLACE_WITH_PRODUCTION_GEOBLOCKING_KV_PREVIEW_ID" + } + ], + "d1_databases": [ + { + "binding": "METRICS_DB", + "database_id": "REPLACE_WITH_PRODUCTION_METRICS_DB_ID", + "database_name": "bunkercash-metrics-production", + "migrations_dir": "../../packages/metrics-data/migrations" + } + ] } - ] + } } diff --git a/ts/apps/web/.env.example b/ts/apps/web/.env.example index 3b2cfa8..9c67670 100644 --- a/ts/apps/web/.env.example +++ b/ts/apps/web/.env.example @@ -1,7 +1,12 @@ # Example env for the web app (copy to `.env.local`) -# Solana RPC endpoint (devnet by default) +# Deployment environment: dev, staging, or production. +NEXT_PUBLIC_DEPLOY_ENV=dev + +# Solana RPC endpoint and cluster (devnet by default) NEXT_PUBLIC_SOLANA_RPC_URL=https://api.devnet.solana.com +NEXT_PUBLIC_SOLANA_CLUSTER=devnet +NEXT_PUBLIC_CLUSTER=devnet # Must be exactly "true" to trust cf-ipcountry headers in middleware. TRUST_CLOUDFLARE_HEADERS= @@ -11,6 +16,9 @@ GEOBLOCKING_TEST_COUNTRY= # USDC mint used by the current contract on devnet NEXT_PUBLIC_USDC_MINT=4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU +# BunkerCash program id for this environment. +NEXT_PUBLIC_BUNKERCASH_PROGRAM_ID=Fp8b6p287TL5oPMwLVdwGys5phHNLcmTKNvVoGdCJS6g + # Devnet-only reference account (tracked by the team): 89gWf9GspsbZ8SZoG3td3kR1XcgVrijpxghKzcmMHJNh # This is a new account used ONLY on devnet. Confirm its role before wiring it in # (e.g. test wallet vs. an alternate USDC mint) and never use it on mainnet. diff --git a/ts/apps/web/components/BuyPrimaryInterface.tsx b/ts/apps/web/components/BuyPrimaryInterface.tsx index 5afc281..c86a4e9 100644 --- a/ts/apps/web/components/BuyPrimaryInterface.tsx +++ b/ts/apps/web/components/BuyPrimaryInterface.tsx @@ -25,6 +25,7 @@ import { useToast } from "@/components/ui/ToastContext"; import { useSupportedUsdcMint } from "@/hooks/useSupportedUsdcMint"; import { invalidateTransactionCache } from "@/hooks/useMyTransactions"; import { sendAndConfirmWalletTransaction } from "@/lib/sendAndConfirmWalletTransaction"; +import { buildTransactionReview, requirePreSignReview } from "@/lib/transaction-review"; import { useOptionalWallet } from "@/hooks/useOptionalWallet"; import { PhantomConnectButton } from "@/components/wallet/PhantomConnectButton"; import { InfoTooltip } from "@/components/ui/InfoTooltip"; @@ -85,6 +86,7 @@ type BuyPoolState = { purchaseLimitUsdc: bigint; totalDepositedUsdc: bigint; purchaseFeeBps: number; + fetchedAt: number; }; // Module-level cache of the last successfully fetched pool state. Survives @@ -215,6 +217,7 @@ export function BuyPrimaryInterface() { purchaseLimitUsdc, totalDepositedUsdc, purchaseFeeBps, + fetchedAt: Date.now(), }; buyPoolStateCache = { endpoint, state: nextState }; setPoolState(nextState); @@ -277,6 +280,10 @@ export function BuyPrimaryInterface() { const pricePerToken = poolState ? derivePrice(poolState.nav, poolState.totalBunkercashSupply) : null; + const pricingAgeSeconds = poolState + ? Math.max(0, Math.floor((Date.now() - poolState.fetchedAt) / 1000)) + : null; + const pricingIsStale = pricingAgeSeconds !== null && pricingAgeSeconds > 60; const supportsUsdcDeposits = !!usdcTokenProgram && (usdcTokenProgram.equals(TOKEN_PROGRAM_ID) || @@ -492,6 +499,24 @@ export function BuyPrimaryInterface() { createPoolUsdcVaultIx, depositUsdcIx, ); + requirePreSignReview( + buildTransactionReview({ + instructions: tx.instructions, + summary: "Buy BunkerCash with USDC", + fields: [ + { label: "program ID", value: PROGRAM_ID.toBase58() }, + { label: "pool PDA", value: poolPda.toBase58() }, + { label: "source account", value: userUsdc.toBase58() }, + { label: "destination vault", value: poolUsdcVault.toBase58() }, + { label: "USDC mint", value: configuredUsdcMint.toBase58() }, + { label: "amount", value: `${toUi(usdcAmountRaw, USDC_DECIMALS)} USDC` }, + { + label: "purchase fee", + value: `${purchaseFeeRaw != null ? toUi(purchaseFeeRaw, USDC_DECIMALS) : "0"} USDC`, + }, + ], + }), + ); const sig = await sendAndConfirmWalletTransaction({ connection, wallet, @@ -599,11 +624,21 @@ export function BuyPrimaryInterface() { refreshing )} + {pricingIsStale && ( + + stale + + )}
${pricePerToken != null ? pricePerToken.toFixed(2) : "—"} per token
+ {pricingAgeSeconds !== null && ( +

+ Last NAV read: {pricingAgeSeconds}s ago +

+ )}
diff --git a/ts/apps/web/components/WithdrawInterface.tsx b/ts/apps/web/components/WithdrawInterface.tsx index 4a7df4e..47b0bf5 100644 --- a/ts/apps/web/components/WithdrawInterface.tsx +++ b/ts/apps/web/components/WithdrawInterface.tsx @@ -35,6 +35,7 @@ import { DialogTitle, } from "@/components/ui/dialog"; import { sendAndConfirmWalletTransaction } from "@/lib/sendAndConfirmWalletTransaction"; +import { buildTransactionReview, requirePreSignReview } from "@/lib/transaction-review"; import { useOptionalWallet } from "@/hooks/useOptionalWallet"; import { PhantomConnectButton } from "@/components/wallet/PhantomConnectButton"; @@ -398,6 +399,22 @@ export function WithdrawInterface() { .instruction(); const tx = new Transaction().add(createUserAtaIx, registerIx); + requirePreSignReview( + buildTransactionReview({ + instructions: tx.instructions, + summary: "Create a BunkerCash sell request", + fields: [ + { label: "program ID", value: PROGRAM_ID.toBase58() }, + { label: "pool PDA", value: poolPda.toBase58() }, + { label: "source account", value: userBunkercashAta.toBase58() }, + { label: "escrow account", value: poolBunkercashEscrow.toBase58() }, + { label: "fee destination", value: masterBunkercash.toBase58() }, + { label: "mint", value: mintPda.toBase58() }, + { label: "amount", value: `${toUi(amountRaw, 6)} BNKR` }, + { label: "claim PDA", value: claimPda.toBase58() }, + ], + }), + ); const sig = await sendAndConfirmWalletTransaction({ connection, wallet, @@ -533,6 +550,21 @@ export function WithdrawInterface() { .instruction(); tx.add(cancelIx); + requirePreSignReview( + buildTransactionReview({ + instructions: tx.instructions, + summary: "Cancel a BunkerCash sell request", + fields: [ + { label: "program ID", value: PROGRAM_ID.toBase58() }, + { label: "pool PDA", value: poolPda.toBase58() }, + { label: "claim PDA", value: claimPk.toBase58() }, + { label: "source escrow", value: poolBunkercashEscrow.toBase58() }, + { label: "destination account", value: userBunkercashAta.toBase58() }, + { label: "mint", value: mintPda.toBase58() }, + { label: "remaining escrow", value: `${toUi(BigInt(claim.bunkercashRemaining), 6)} BNKR` }, + ], + }), + ); const sig = await sendAndConfirmWalletTransaction({ connection, wallet, diff --git a/ts/apps/web/hooks/__tests__/useSquadsTransaction.test.ts b/ts/apps/web/hooks/__tests__/useSquadsTransaction.test.ts index 2b7ae53..f15f4d6 100644 --- a/ts/apps/web/hooks/__tests__/useSquadsTransaction.test.ts +++ b/ts/apps/web/hooks/__tests__/useSquadsTransaction.test.ts @@ -23,7 +23,7 @@ const TRANSACTION_PDA = new PublicKey( ) const BLOCKHASH = "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N" const SIG1 = "sig-vault-tx-create-111" -const SIG2 = "sig-proposal-approve-222" +const SIG2 = "sig-proposal-create-222" // ── Mock @solana/wallet-adapter-react ────────────────────────────────────── const mockSignAllTransactions = vi.fn() @@ -47,6 +47,10 @@ vi.mock("@solana/wallet-adapter-react", () => ({ useWallet: (...args: unknown[]) => mockUseWallet(...args), })) +vi.mock("@/hooks/useOptionalWallet", () => ({ + useOptionalWallet: () => mockUseWallet(), +})) + // ── Mock @sqds/multisig ─────────────────────────────────────────────────── const mockFromAccountAddress = vi.fn() const mockVaultTransactionCreate = vi.fn() @@ -144,7 +148,7 @@ describe("useSquadsTransaction", () => { }) // ── Happy path ────────────────────────────────────────────────────────── - it("should split vault-create and proposal-approve into two transactions", async () => { + it("should split vault-create and proposal-create into two transactions without approval", async () => { setupHappyPathMocks() const { result } = renderHook(() => useSquadsTransaction()) @@ -169,10 +173,11 @@ describe("useSquadsTransaction", () => { expect(submitResult!).not.toBeNull() expect(submitResult!.txIndex).toBe(BigInt(6)) // 5 + 1 expect(submitResult!.signature).toBe(SIG1) - expect(submitResult!.autoApproved).toBe(true) + expect(submitResult!.autoApproved).toBe(false) expect(submitResult!.proposalPda).toBe(PROPOSAL_PDA.toBase58()) expect(submitResult!.transactionPda).toBe(TRANSACTION_PDA.toBase58()) expect(submitResult!.squadsUrl).toContain("devnet.squads.so") + expect(mockProposalApprove).not.toHaveBeenCalled() }) // ── Transaction index increments correctly ────────────────────────────── @@ -192,9 +197,7 @@ describe("useSquadsTransaction", () => { expect(mockProposalCreate).toHaveBeenCalledWith( expect.objectContaining({ transactionIndex: BigInt(43) }), ) - expect(mockProposalApprove).toHaveBeenCalledWith( - expect.objectContaining({ transactionIndex: BigInt(43) }), - ) + expect(mockProposalApprove).not.toHaveBeenCalled() }) // ── Sends TX1 before TX2 (sequential order) ──────────────────────────── @@ -225,7 +228,7 @@ describe("useSquadsTransaction", () => { }) // ── Memo is forwarded correctly ───────────────────────────────────────── - it("should pass memo to vaultTransactionCreate and proposalApprove", async () => { + it("should pass memo to vaultTransactionCreate only", async () => { setupHappyPathMocks() const { result } = renderHook(() => useSquadsTransaction()) @@ -237,13 +240,11 @@ describe("useSquadsTransaction", () => { expect(mockVaultTransactionCreate).toHaveBeenCalledWith( expect.objectContaining({ memo: "Process claim #7" }), ) - expect(mockProposalApprove).toHaveBeenCalledWith( - expect.objectContaining({ memo: "approve: Process claim #7" }), - ) + expect(mockProposalApprove).not.toHaveBeenCalled() }) - // ── No memo → no approve memo ────────────────────────────────────────── - it("should not pass approve memo when no memo is provided", async () => { + // ── No memo → no approval instruction ────────────────────────────────── + it("should not create an approval instruction when no memo is provided", async () => { setupHappyPathMocks() const { result } = renderHook(() => useSquadsTransaction()) @@ -252,9 +253,7 @@ describe("useSquadsTransaction", () => { await result.current.submit([dummyInstruction]) }) - expect(mockProposalApprove).toHaveBeenCalledWith( - expect.objectContaining({ memo: undefined }), - ) + expect(mockProposalApprove).not.toHaveBeenCalled() }) // ── Non-member wallet is rejected ─────────────────────────────────────── @@ -403,7 +402,7 @@ describe("useSquadsTransaction", () => { }) // ── Creator is the connected wallet ───────────────────────────────────── - it("should use the connected wallet as creator and member", async () => { + it("should use the connected wallet as creator without approving", async () => { setupHappyPathMocks() const { result } = renderHook(() => useSquadsTransaction()) @@ -418,9 +417,7 @@ describe("useSquadsTransaction", () => { expect(mockProposalCreate).toHaveBeenCalledWith( expect.objectContaining({ creator: WALLET_PUBKEY }), ) - expect(mockProposalApprove).toHaveBeenCalledWith( - expect.objectContaining({ member: WALLET_PUBKEY }), - ) + expect(mockProposalApprove).not.toHaveBeenCalled() }) // ── Proposal isDraft is false ─────────────────────────────────────────── diff --git a/ts/apps/web/hooks/useSquadsTransaction.ts b/ts/apps/web/hooks/useSquadsTransaction.ts index 9448888..a1408db 100644 --- a/ts/apps/web/hooks/useSquadsTransaction.ts +++ b/ts/apps/web/hooks/useSquadsTransaction.ts @@ -44,16 +44,17 @@ function assertSquadsConfigured() { /** * Hook for creating Squads v4 vault transaction proposals. * - * Wraps the given instructions in a vault transaction, creates the proposal, - * and immediately casts the creator's approval. + * Wraps the given instructions in a vault transaction and creates the proposal. + * Approval must happen as a separate explicit action after reviewing the + * decoded proposal details. * * Because the serialized inner message can be large, the work is split across * two on-chain transactions to stay under Solana's 1232-byte packet limit: * TX 1 – vaultTransactionCreate (contains the full serialized inner message) - * TX 2 – proposalCreate + proposalApprove + * TX 2 – proposalCreate * - * Both are signed together via `signAllTransactions` for a single wallet popup, - * then sent sequentially (TX 2 depends on TX 1 being confirmed). + * Both are signed together via `signAllTransactions`, then sent sequentially + * (TX 2 depends on TX 1 being confirmed). No approval is included. */ export function useSquadsTransaction() { const { connection } = useConnection() @@ -136,16 +137,9 @@ export function useSquadsTransaction() { isDraft: false, }) - const approveProposalIx = multisig.instructions.proposalApprove({ - multisigPda, - transactionIndex: nextIndex, - member: wallet.publicKey, - memo: memo ? `approve: ${memo}` : undefined, - }) - // ── 4. Split into two transactions to stay under the 1232-byte limit ─ // TX 1: vaultTransactionCreate (large — carries the serialized inner message) - // TX 2: proposalCreate + proposalApprove (small — only Squads PDAs) + // TX 2: proposalCreate (small — only Squads PDAs) const tx1Message = new TransactionMessage({ payerKey: wallet.publicKey, recentBlockhash: blockhash, @@ -155,7 +149,7 @@ export function useSquadsTransaction() { const tx2Message = new TransactionMessage({ payerKey: wallet.publicKey, recentBlockhash: blockhash, - instructions: [createProposalIx, approveProposalIx], + instructions: [createProposalIx], }).compileToV0Message() const vtx1 = new VersionedTransaction(tx1Message) @@ -177,7 +171,7 @@ export function useSquadsTransaction() { "confirmed", ) - // ── 6. Send TX 2 (proposal + approve) ─────────────────────────────── + // ── 6. Send TX 2 (proposal create only) ───────────────────────────── // If the original blockhash expired while waiting for TX1, retry with a fresh one. let sig2: string try { @@ -196,7 +190,7 @@ export function useSquadsTransaction() { const retryMsg = new TransactionMessage({ payerKey: wallet.publicKey, recentBlockhash: fresh.blockhash, - instructions: [createProposalIx, approveProposalIx], + instructions: [createProposalIx], }).compileToV0Message() const retryTx = new VersionedTransaction(retryMsg) const retrySigned = await wallet.signAllTransactions([retryTx]) @@ -236,7 +230,7 @@ export function useSquadsTransaction() { transactionPda: transactionPda.toBase58(), squadsUrl, signature: sig1, - autoApproved: true, + autoApproved: false, } setResult(out) return out diff --git a/ts/apps/web/lib/bunkercash.fixed.idl.json b/ts/apps/web/lib/bunkercash.fixed.idl.json index 0059ece..a34361b 100644 --- a/ts/apps/web/lib/bunkercash.fixed.idl.json +++ b/ts/apps/web/lib/bunkercash.fixed.idl.json @@ -2472,6 +2472,48 @@ ], "args": [] }, + { + "name": "update_master_wallet", + "discriminator": [ + 243, + 44, + 250, + 16, + 79, + 226, + 43, + 176 + ], + "accounts": [ + { + "name": "pool", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 112, + 111, + 111, + 108 + ] + } + ] + } + }, + { + "name": "current_master_wallet", + "signer": true + } + ], + "args": [ + { + "name": "new_master_wallet", + "type": "pubkey" + } + ] + }, { "name": "settle_claims", "discriminator": [ @@ -3426,6 +3468,10 @@ "name": "last_paid_epoch_seq", "type": "u64" }, + { + "name": "claim_seq", + "type": "u64" + }, { "name": "bump", "type": "u8" @@ -4019,6 +4065,10 @@ "name": "claim_counter", "type": "u64" }, + { + "name": "next_claim_seq", + "type": "u64" + }, { "name": "withdrawal_counter", "type": "u64" @@ -4226,6 +4276,10 @@ "name": "epoch_seq", "type": "u64" }, + { + "name": "snapshot_claim_seq", + "type": "u64" + }, { "name": "timestamp", "type": "i64" @@ -4327,4 +4381,4 @@ } } ] -} \ No newline at end of file +} diff --git a/ts/apps/web/lib/constants.ts b/ts/apps/web/lib/constants.ts index 25a5a15..04c196b 100644 --- a/ts/apps/web/lib/constants.ts +++ b/ts/apps/web/lib/constants.ts @@ -59,7 +59,10 @@ export function getSquadsDashboardUrl( return base; } -export const USDC_MINTS: Record = {}; +export const USDC_MINTS: Record = { + "mainnet-beta": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + devnet: "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", +}; export function getClusterFromEndpoint(endpoint: string): ClusterType { const envCluster = getConfiguredSolanaCluster(); diff --git a/ts/apps/web/lib/program.ts b/ts/apps/web/lib/program.ts index e7657e4..4a027a6 100644 --- a/ts/apps/web/lib/program.ts +++ b/ts/apps/web/lib/program.ts @@ -6,9 +6,20 @@ import idlJson from './bunkercash.fixed.idl.json' type IdlWithAddress = Idl & { address: string } -const idl = idlJson as unknown as Idl const idlWithAddress = idlJson as unknown as IdlWithAddress -const PROGRAM_ID = new PublicKey(idlWithAddress.address) + +function resolveProgramAddress(): string { + const configuredProgramId = process.env.NEXT_PUBLIC_BUNKERCASH_PROGRAM_ID?.trim() + if (configuredProgramId) return configuredProgramId + if (process.env.NEXT_PUBLIC_DEPLOY_ENV === 'production') { + throw new Error('NEXT_PUBLIC_BUNKERCASH_PROGRAM_ID is required in production') + } + return idlWithAddress.address +} + +const programAddress = resolveProgramAddress() +const PROGRAM_ID = new PublicKey(programAddress) +const idl = { ...idlJson, address: programAddress } as unknown as Idl export type BunkercashIDL = Idl type BrowserWallet = ConstructorParameters[1] diff --git a/ts/apps/web/lib/solana-env.ts b/ts/apps/web/lib/solana-env.ts index 3ab3620..0c74a40 100644 --- a/ts/apps/web/lib/solana-env.ts +++ b/ts/apps/web/lib/solana-env.ts @@ -7,6 +7,7 @@ export function getConfiguredSolanaCluster(): SolanaWalletCluster { const cluster = process.env.NEXT_PUBLIC_SOLANA_CLUSTER ?? process.env.NEXT_PUBLIC_CLUSTER; + const deployEnv = process.env.NEXT_PUBLIC_DEPLOY_ENV; if ( cluster === "mainnet-beta" || @@ -17,11 +18,18 @@ export function getConfiguredSolanaCluster(): SolanaWalletCluster { return cluster; } + if (deployEnv === "production") { + throw new Error("Production Solana cluster must be explicitly set to mainnet-beta"); + } + return "devnet"; } export function getConfiguredRpcCluster(): SolanaCluster { const cluster = getConfiguredSolanaCluster(); + if (process.env.NEXT_PUBLIC_DEPLOY_ENV === "production" && cluster !== "mainnet-beta") { + throw new Error("Production Solana cluster must be mainnet-beta"); + } return cluster === "localnet" ? "devnet" : cluster; } diff --git a/ts/apps/web/lib/support-requests.test.ts b/ts/apps/web/lib/support-requests.test.ts index 9b392dc..2d1acd1 100644 --- a/ts/apps/web/lib/support-requests.test.ts +++ b/ts/apps/web/lib/support-requests.test.ts @@ -116,6 +116,7 @@ describe("enforceSupportRequestRateLimit", () => { }); afterEach(() => { + delete process.env.NEXT_PUBLIC_DEPLOY_ENV; vi.useRealTimers(); vi.clearAllMocks(); }); @@ -189,6 +190,46 @@ describe("enforceSupportRequestRateLimit", () => { expect(rateLimitFetchMock).toHaveBeenCalledTimes(1); expect(kvPutMock).not.toHaveBeenCalled(); }); + + it("does not trust spoofable forwarded headers in production", async () => { + process.env.NEXT_PUBLIC_DEPLOY_ENV = "production"; + + await enforceSupportRequestRateLimit( + makeRequest({ + "x-forwarded-for": "198.51.100.10", + "x-real-ip": "198.51.100.11", + }), + supportInput, + ); + await enforceSupportRequestRateLimit( + makeRequest({ + "x-forwarded-for": "203.0.113.10", + "x-real-ip": "203.0.113.11", + }), + supportInput, + ); + + expect(rateLimitIdFromNameMock.mock.calls[0]?.[0]).toBe( + rateLimitIdFromNameMock.mock.calls[2]?.[0], + ); + }); + + it("keeps spoofable header fallback available outside production", async () => { + process.env.NEXT_PUBLIC_DEPLOY_ENV = "dev"; + + await enforceSupportRequestRateLimit( + makeRequest({ "x-forwarded-for": "198.51.100.10" }), + supportInput, + ); + await enforceSupportRequestRateLimit( + makeRequest({ "x-forwarded-for": "203.0.113.10" }), + supportInput, + ); + + expect(rateLimitIdFromNameMock.mock.calls[0]?.[0]).not.toBe( + rateLimitIdFromNameMock.mock.calls[2]?.[0], + ); + }); }); describe("SupportRateLimitDurableObject", () => { diff --git a/ts/apps/web/lib/support-requests.ts b/ts/apps/web/lib/support-requests.ts index 04b1375..90b6fa8 100644 --- a/ts/apps/web/lib/support-requests.ts +++ b/ts/apps/web/lib/support-requests.ts @@ -16,6 +16,10 @@ const IP_RATE_LIMIT_MAX_REQUESTS = 3; const IP_RATE_LIMIT_WINDOW_SECONDS = 15 * 60; const EMAIL_RATE_LIMIT_MAX_REQUESTS = 5; const EMAIL_RATE_LIMIT_WINDOW_SECONDS = 24 * 60 * 60; +// Turnstile/CAPTCHA decision: not required for the initial support form gate. +// The public endpoint is limited by trusted Cloudflare client IP plus email. +// Add Turnstile if production telemetry shows sustained bot abuse inside +// these windows. export type { CreateSupportRequestInput, @@ -47,6 +51,10 @@ function readString(value: unknown): string | null { return normalized.length > 0 ? normalized : null; } +function isProductionDeployEnv(): boolean { + return process.env.NEXT_PUBLIC_DEPLOY_ENV?.trim() === "production"; +} + function normalizeOptional(value: unknown, maxLength: number): string | null { const normalized = readString(value); if (!normalized) { @@ -102,6 +110,10 @@ function getClientIp(request: Request): string | null { return cfConnectingIp; } + if (isProductionDeployEnv()) { + return "missing-cf-connecting-ip"; + } + const xRealIp = readString(request.headers.get("x-real-ip")); if (xRealIp) { return xRealIp; diff --git a/ts/apps/web/lib/transaction-review.test.ts b/ts/apps/web/lib/transaction-review.test.ts new file mode 100644 index 0000000..ddb73c8 --- /dev/null +++ b/ts/apps/web/lib/transaction-review.test.ts @@ -0,0 +1,37 @@ +import { PublicKey, TransactionInstruction } from "@solana/web3.js"; +import { describe, expect, it } from "vitest"; +import { buildTransactionReview, formatTransactionReview } from "./transaction-review"; + +describe("transaction review disclosure", () => { + it("formats program and account data from the submitted instruction", () => { + const programId = PublicKey.unique(); + const source = PublicKey.unique(); + const destination = PublicKey.unique(); + const instruction = new TransactionInstruction({ + programId, + keys: [ + { pubkey: source, isSigner: true, isWritable: true }, + { pubkey: destination, isSigner: false, isWritable: true }, + ], + data: Buffer.alloc(0), + }); + + const review = buildTransactionReview({ + instructions: [instruction], + accountLabels: { + [source.toBase58()]: "source account", + [destination.toBase58()]: "destination account", + }, + }); + const text = formatTransactionReview(review); + + expect(review.instructions[0].programId).toBe(programId.toBase58()); + expect(review.instructions[0].accounts.map((account) => account.pubkey)).toEqual( + instruction.keys.map((key) => key.pubkey.toBase58()), + ); + expect(text).toContain(`program ID: ${programId.toBase58()}`); + expect(text).toContain(`source account: ${source.toBase58()} (signer, writable)`); + expect(text).toContain(`destination account: ${destination.toBase58()} (non-signer, writable)`); + }); +}); + diff --git a/ts/apps/web/lib/transaction-review.ts b/ts/apps/web/lib/transaction-review.ts new file mode 100644 index 0000000..7e9d5ce --- /dev/null +++ b/ts/apps/web/lib/transaction-review.ts @@ -0,0 +1,110 @@ +import type { TransactionInstruction } from "@solana/web3.js"; + +export interface TransactionReviewField { + label: string; + value: string; +} + +export interface TransactionReviewInput { + title?: string; + summary?: string; + fields?: TransactionReviewField[]; + accountLabels?: Record; + remainingAccounts?: TransactionReviewField[]; +} + +export interface TransactionReviewAccount { + label: string; + pubkey: string; + isSigner: boolean; + isWritable: boolean; +} + +export interface TransactionReviewInstruction { + index: number; + programId: string; + accounts: TransactionReviewAccount[]; +} + +export interface TransactionReview { + title: string; + summary: string; + fields: TransactionReviewField[]; + remainingAccounts: TransactionReviewField[]; + instructions: TransactionReviewInstruction[]; +} + +export function buildTransactionReview({ + instructions, + title, + summary, + fields = [], + accountLabels, + remainingAccounts = [], +}: TransactionReviewInput & { + instructions: TransactionInstruction[]; +}): TransactionReview { + return { + title: title ?? "Pre-sign transaction review", + summary: summary ?? "Review the exact programs and accounts before signing.", + fields, + remainingAccounts, + instructions: instructions.map((instruction, index) => ({ + index, + programId: instruction.programId.toBase58(), + accounts: instruction.keys.map((key, accountIndex) => { + const pubkey = key.pubkey.toBase58(); + return { + label: accountLabels?.[pubkey] ?? `Account ${accountIndex}`, + pubkey, + isSigner: key.isSigner, + isWritable: key.isWritable, + }; + }), + })), + }; +} + +export function formatTransactionReview(review: TransactionReview): string { + const lines = [review.title, "", review.summary]; + + if (review.fields.length > 0) { + lines.push("", "Action details"); + for (const field of review.fields) { + lines.push(`${field.label}: ${field.value}`); + } + } + + for (const instruction of review.instructions) { + lines.push("", `Instruction ${instruction.index + 1}`); + lines.push(`program ID: ${instruction.programId}`); + for (const account of instruction.accounts) { + const flags = [ + account.isSigner ? "signer" : "non-signer", + account.isWritable ? "writable" : "readonly", + ].join(", "); + lines.push(`${account.label}: ${account.pubkey} (${flags})`); + } + } + + if (review.remainingAccounts.length > 0) { + lines.push("", "Remaining accounts"); + for (const account of review.remainingAccounts) { + lines.push(`${account.label}: ${account.value}`); + } + } + + lines.push("", "Continue to wallet signature?"); + return lines.join("\n"); +} + +export function requirePreSignReview(review: TransactionReview): void { + if (typeof window === "undefined" || typeof window.confirm !== "function") { + return; + } + + if (!window.confirm(formatTransactionReview(review))) { + throw new Error("Transaction review rejected before signing"); + } +} + diff --git a/ts/apps/web/package.json b/ts/apps/web/package.json index f8dccd0..2e0c26e 100644 --- a/ts/apps/web/package.json +++ b/ts/apps/web/package.json @@ -6,9 +6,18 @@ "scripts": { "dev": "next dev --turbopack", "build": "next build", - "build:cf": "opennextjs-cloudflare build", + "preflight:dev": "node ../../scripts/deploy-preflight.mjs --app web --env dev", + "preflight:staging": "node ../../scripts/deploy-preflight.mjs --app web --env staging", + "preflight:production": "node ../../scripts/deploy-preflight.mjs --app web --env production", + "build:cf": "npm run build:cf:dev", + "build:cf:dev": "npm run preflight:dev && opennextjs-cloudflare build", + "build:cf:staging": "npm run preflight:staging && opennextjs-cloudflare build", + "build:cf:production": "npm run preflight:production && opennextjs-cloudflare build", "preview": "opennextjs-cloudflare preview", - "deploy": "opennextjs-cloudflare build && opennextjs-cloudflare deploy", + "deploy": "npm run deploy:dev", + "deploy:dev": "npm run preflight:dev && opennextjs-cloudflare build && opennextjs-cloudflare deploy --env dev", + "deploy:staging": "npm run preflight:staging && opennextjs-cloudflare build && opennextjs-cloudflare deploy --env staging", + "deploy:production": "npm run preflight:production && opennextjs-cloudflare build && opennextjs-cloudflare deploy --env production", "start": "next start", "lint": "eslint", "test": "vitest run", @@ -18,7 +27,7 @@ "@bunkercash/cloudflare-kv": "workspace:0.1.0", "@bunkercash/metrics-data": "workspace:0.1.0", "@bunkercash/support-requests": "workspace:0.1.0", - "@coral-xyz/anchor": "=0.30.1", + "@coral-xyz/anchor": "=0.31.1", "@heroicons/react": "=2.2.0", "@hookform/resolvers": "=5.2.2", "@opennextjs/cloudflare": "=1.17.1", @@ -55,7 +64,6 @@ "@solana/wallet-adapter-react-ui": "=0.9.35", "@solana/web3.js": "=1.98.4", "@sqds/multisig": "=2.1.4", - "@sqds/sdk": "=2.0.4", "@tanstack/react-query": "=5.90.20", "class-variance-authority": "=0.7.1", "clsx": "=2.1.1", diff --git a/ts/apps/web/worker.js b/ts/apps/web/worker.js index ce24a40..4a7afdd 100644 --- a/ts/apps/web/worker.js +++ b/ts/apps/web/worker.js @@ -16,7 +16,7 @@ export { const SCHEDULED_REQUEST_URL = "https://scheduled.internal/__metrics_daily"; -export default { +const worker = { fetch: openNextWorker.fetch.bind(openNextWorker), async scheduled(_controller, env, ctx) { @@ -28,3 +28,5 @@ export default { }); }, }; + +export default worker; diff --git a/ts/apps/web/wrangler.jsonc b/ts/apps/web/wrangler.jsonc index 7a6fb00..e4589fe 100644 --- a/ts/apps/web/wrangler.jsonc +++ b/ts/apps/web/wrangler.jsonc @@ -6,60 +6,141 @@ "compatibility_date": "2024-09-23", "compatibility_flags": ["nodejs_compat", "global_fetch_strictly_public"], "observability": { - "enabled": true, + "enabled": true }, "assets": { "directory": ".open-next/assets", - "binding": "ASSETS", + "binding": "ASSETS" }, - "services": [ - { - "binding": "WORKER_SELF_REFERENCE", - "service": "bunkercash-web", - }, - ], - "triggers": { - "crons": ["10 0 * * *"], - }, - "routes": [ - { "pattern": "bunkercash.com", "custom_domain": true }, - { "pattern": "www.bunkercash.com", "custom_domain": true }, - ], - "vars": { - "NEXT_PUBLIC_SOLANA_RPC_URL": "https://api.devnet.solana.com", - "NEXT_PUBLIC_SOLANA_CLUSTER": "devnet", - "NEXT_PUBLIC_CLUSTER": "devnet", - "NEXT_PUBLIC_USDC_MINT": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", - "TRUST_CLOUDFLARE_HEADERS": "true", - "NEXT_PUBLIC_SQUADS_MULTISIG_PUBKEY": "HEzTX4LNQ7cjrXTt1vKXyEZGtc94TKRUc9kWNFexJSGz", - }, - "kv_namespaces": [ - { - "binding": "GEOBLOCKING_KV", - "id": "9abcd5888b5c436fba6f445f8ba68e98", - "preview_id": "a6f9582a6f8444bea09b37128e00bb17", - }, - ], "durable_objects": { "bindings": [ { "name": "SUPPORT_RATE_LIMIT", - "class_name": "SupportRateLimitDurableObject", - }, - ], + "class_name": "SupportRateLimitDurableObject" + } + ] }, "migrations": [ { "tag": "v1_support_rate_limit", - "new_sqlite_classes": ["SupportRateLimitDurableObject"], - }, + "new_sqlite_classes": ["SupportRateLimitDurableObject"] + } ], - "d1_databases": [ - { - "binding": "METRICS_DB", - "database_id": "97cc29d2-b9e4-4430-83ce-bb1272e1d629", - "database_name": "bunkercash-metrics", - "migrations_dir": "../../packages/metrics-data/migrations", + "env": { + "dev": { + "name": "bunkercash-web-dev", + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "bunkercash-web-dev" + } + ], + "triggers": { + "crons": ["10 0 * * *"] + }, + "vars": { + "NEXT_PUBLIC_DEPLOY_ENV": "dev", + "NEXT_PUBLIC_SOLANA_RPC_URL": "https://api.devnet.solana.com", + "NEXT_PUBLIC_SOLANA_CLUSTER": "devnet", + "NEXT_PUBLIC_CLUSTER": "devnet", + "NEXT_PUBLIC_USDC_MINT": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "NEXT_PUBLIC_BUNKERCASH_PROGRAM_ID": "Fp8b6p287TL5oPMwLVdwGys5phHNLcmTKNvVoGdCJS6g", + "TRUST_CLOUDFLARE_HEADERS": "true", + "NEXT_PUBLIC_SQUADS_MULTISIG_PUBKEY": "HEzTX4LNQ7cjrXTt1vKXyEZGtc94TKRUc9kWNFexJSGz" + }, + "kv_namespaces": [ + { + "binding": "GEOBLOCKING_KV", + "id": "9abcd5888b5c436fba6f445f8ba68e98", + "preview_id": "a6f9582a6f8444bea09b37128e00bb17" + } + ], + "d1_databases": [ + { + "binding": "METRICS_DB", + "database_id": "97cc29d2-b9e4-4430-83ce-bb1272e1d629", + "database_name": "bunkercash-metrics-dev", + "migrations_dir": "../../packages/metrics-data/migrations" + } + ] }, - ], + "staging": { + "name": "bunkercash-web-staging", + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "bunkercash-web-staging" + } + ], + "triggers": { + "crons": ["10 0 * * *"] + }, + "vars": { + "NEXT_PUBLIC_DEPLOY_ENV": "staging", + "NEXT_PUBLIC_SOLANA_RPC_URL": "https://api.devnet.solana.com", + "NEXT_PUBLIC_SOLANA_CLUSTER": "devnet", + "NEXT_PUBLIC_CLUSTER": "devnet", + "NEXT_PUBLIC_USDC_MINT": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", + "NEXT_PUBLIC_BUNKERCASH_PROGRAM_ID": "Fp8b6p287TL5oPMwLVdwGys5phHNLcmTKNvVoGdCJS6g", + "TRUST_CLOUDFLARE_HEADERS": "true", + "NEXT_PUBLIC_SQUADS_MULTISIG_PUBKEY": "HEzTX4LNQ7cjrXTt1vKXyEZGtc94TKRUc9kWNFexJSGz" + }, + "kv_namespaces": [ + { + "binding": "GEOBLOCKING_KV", + "id": "9abcd5888b5c436fba6f445f8ba68e98", + "preview_id": "a6f9582a6f8444bea09b37128e00bb17" + } + ], + "d1_databases": [ + { + "binding": "METRICS_DB", + "database_id": "97cc29d2-b9e4-4430-83ce-bb1272e1d629", + "database_name": "bunkercash-metrics-staging", + "migrations_dir": "../../packages/metrics-data/migrations" + } + ] + }, + "production": { + "name": "bunkercash-web", + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "bunkercash-web" + } + ], + "triggers": { + "crons": ["10 0 * * *"] + }, + "routes": [ + { "pattern": "bunkercash.com", "custom_domain": true }, + { "pattern": "www.bunkercash.com", "custom_domain": true } + ], + "vars": { + "NEXT_PUBLIC_DEPLOY_ENV": "production", + "NEXT_PUBLIC_SOLANA_RPC_URL": "REPLACE_WITH_MAINNET_RPC_URL", + "NEXT_PUBLIC_SOLANA_CLUSTER": "mainnet-beta", + "NEXT_PUBLIC_CLUSTER": "mainnet-beta", + "NEXT_PUBLIC_USDC_MINT": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "NEXT_PUBLIC_BUNKERCASH_PROGRAM_ID": "REPLACE_WITH_MAINNET_PROGRAM_ID", + "TRUST_CLOUDFLARE_HEADERS": "true", + "NEXT_PUBLIC_SQUADS_MULTISIG_PUBKEY": "REPLACE_WITH_MAINNET_SQUADS_MULTISIG" + }, + "kv_namespaces": [ + { + "binding": "GEOBLOCKING_KV", + "id": "REPLACE_WITH_PRODUCTION_GEOBLOCKING_KV_ID", + "preview_id": "REPLACE_WITH_PRODUCTION_GEOBLOCKING_KV_PREVIEW_ID" + } + ], + "d1_databases": [ + { + "binding": "METRICS_DB", + "database_id": "REPLACE_WITH_PRODUCTION_METRICS_DB_ID", + "database_name": "bunkercash-metrics-production", + "migrations_dir": "../../packages/metrics-data/migrations" + } + ] + } + } } diff --git a/ts/bun.lock b/ts/bun.lock index d0fabde..87fe0e1 100644 --- a/ts/bun.lock +++ b/ts/bun.lock @@ -23,7 +23,7 @@ "@bunkercash/cloudflare-kv": "workspace:0.1.0", "@bunkercash/metrics-data": "workspace:0.1.0", "@bunkercash/support-requests": "workspace:0.1.0", - "@coral-xyz/anchor": "=0.30.1", + "@coral-xyz/anchor": "=0.31.1", "@opennextjs/cloudflare": "=1.17.1", "@radix-ui/react-slot": "=1.2.4", "@solana/spl-token": "=0.4.9", @@ -32,6 +32,7 @@ "@solana/wallet-adapter-react-ui": "=0.9.35", "@solana/wallet-adapter-wallets": "=0.19.32", "@solana/web3.js": "=1.98.4", + "@sqds/multisig": "=2.1.4", "class-variance-authority": "=0.7.1", "clsx": "=2.1.1", "lucide-react": "=0.548.0", @@ -64,7 +65,7 @@ "@bunkercash/cloudflare-kv": "workspace:0.1.0", "@bunkercash/metrics-data": "workspace:0.1.0", "@bunkercash/support-requests": "workspace:0.1.0", - "@coral-xyz/anchor": "=0.30.1", + "@coral-xyz/anchor": "=0.31.1", "@heroicons/react": "=2.2.0", "@hookform/resolvers": "=5.2.2", "@opennextjs/cloudflare": "=1.17.1", @@ -101,7 +102,6 @@ "@solana/wallet-adapter-react-ui": "=0.9.35", "@solana/web3.js": "=1.98.4", "@sqds/multisig": "=2.1.4", - "@sqds/sdk": "=2.0.4", "@tanstack/react-query": "=5.90.20", "class-variance-authority": "=0.7.1", "clsx": "=2.1.1", @@ -412,11 +412,11 @@ "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20260317.1", "", {}, "sha512-+G4eVwyCpm8Au1ex8vQBCuA9wnwqetz4tPNRoB/53qvktERWBRMQnrtvC1k584yRE3emMThtuY0gWshvSJ++PQ=="], - "@coral-xyz/anchor": ["@coral-xyz/anchor@0.30.1", "", { "dependencies": { "@coral-xyz/anchor-errors": "^0.30.1", "@coral-xyz/borsh": "^0.30.1", "@noble/hashes": "^1.3.1", "@solana/web3.js": "^1.68.0", "bn.js": "^5.1.2", "bs58": "^4.0.1", "buffer-layout": "^1.2.2", "camelcase": "^6.3.0", "cross-fetch": "^3.1.5", "crypto-hash": "^1.3.0", "eventemitter3": "^4.0.7", "pako": "^2.0.3", "snake-case": "^3.0.4", "superstruct": "^0.15.4", "toml": "^3.0.0" } }, "sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ=="], + "@coral-xyz/anchor": ["@coral-xyz/anchor@0.31.1", "", { "dependencies": { "@coral-xyz/anchor-errors": "^0.31.1", "@coral-xyz/borsh": "^0.31.1", "@noble/hashes": "^1.3.1", "@solana/web3.js": "^1.69.0", "bn.js": "^5.1.2", "bs58": "^4.0.1", "buffer-layout": "^1.2.2", "camelcase": "^6.3.0", "cross-fetch": "^3.1.5", "eventemitter3": "^4.0.7", "pako": "^2.0.3", "superstruct": "^0.15.4", "toml": "^3.0.0" } }, "sha512-QUqpoEK+gi2S6nlYc2atgT2r41TT3caWr/cPUEL8n8Md9437trZ68STknq897b82p5mW0XrTBNOzRbmIRJtfsA=="], - "@coral-xyz/anchor-errors": ["@coral-xyz/anchor-errors@0.30.1", "", {}, "sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ=="], + "@coral-xyz/anchor-errors": ["@coral-xyz/anchor-errors@0.31.1", "", {}, "sha512-NhNEku4F3zzUSBtrYz84FzYWm48+9OvmT1Hhnwr6GnPQry2dsEqH/ti/7ASjjpoFTWRnPXrjAIT1qM6Isop+LQ=="], - "@coral-xyz/borsh": ["@coral-xyz/borsh@0.30.1", "", { "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" }, "peerDependencies": { "@solana/web3.js": "^1.68.0" } }, "sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ=="], + "@coral-xyz/borsh": ["@coral-xyz/borsh@0.31.1", "", { "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" }, "peerDependencies": { "@solana/web3.js": "^1.69.0" } }, "sha512-9N8AU9F0ubriKfNE3g1WF0/4dtlGXoBN/hd1PvbNBamBNwRgHxH4P+o3Zt7rSEloW1HUs6LfZEchlx9fW7POYw=="], "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], @@ -1278,8 +1278,6 @@ "@sqds/multisig": ["@sqds/multisig@2.1.4", "", { "dependencies": { "@metaplex-foundation/beet": "0.7.1", "@metaplex-foundation/beet-solana": "0.4.0", "@metaplex-foundation/cusper": "^0.0.2", "@solana/spl-token": "^0.3.6", "@solana/web3.js": "^1.70.3", "@types/bn.js": "^5.1.1", "assert": "^2.0.0", "bn.js": "^5.2.1", "buffer": "6.0.3", "invariant": "2.2.4" } }, "sha512-5w+NmwHOzl96nI50R/fjSD6uFydRLNUquhoEmmWbGepS4D9DnQyF2TKcUBfTyxV3sgJt00ypBt7SXB3y8WOzUQ=="], - "@sqds/sdk": ["@sqds/sdk@2.0.4", "", { "dependencies": { "@coral-xyz/anchor": "^0.26.0", "@solana/web3.js": "^1.73.2", "bn.js": "^5.2.1" } }, "sha512-SmwqL55GW9teIPRqYBVUp1tNp3Tfd8olPShas/+5L48XaUHBDEFNuDA9E8KKbIZoB34WSLdgyq0tIJLlhMMHnA=="], - "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="], @@ -1852,8 +1850,6 @@ "crypto-browserify": ["crypto-browserify@3.12.1", "", { "dependencies": { "browserify-cipher": "^1.0.1", "browserify-sign": "^4.2.3", "create-ecdh": "^4.0.4", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "diffie-hellman": "^5.0.3", "hash-base": "~3.0.4", "inherits": "^2.0.4", "pbkdf2": "^3.1.2", "public-encrypt": "^4.0.3", "randombytes": "^2.1.0", "randomfill": "^1.0.4" } }, "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ=="], - "crypto-hash": ["crypto-hash@1.3.0", "", {}, "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg=="], - "crypto-js": ["crypto-js@4.2.0", "", {}, "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="], "css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], @@ -1958,8 +1954,6 @@ "dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], - "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="], - "dotenv": ["dotenv@16.0.3", "", {}, "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="], "draggabilly": ["draggabilly@3.0.0", "", { "dependencies": { "get-size": "^3.0.0", "unidragger": "^3.0.0" } }, "sha512-aEs+B6prbMZQMxc9lgTpCBfyCUhRur/VFucHhIOvlvvdARTj7TcDmX/cdOUtqbjJJUh7+agyJXR5Z6IFe1MxwQ=="], @@ -2424,8 +2418,6 @@ "js-base64": ["js-base64@3.7.8", "", {}, "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow=="], - "js-sha256": ["js-sha256@0.9.0", "", {}, "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA=="], - "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], @@ -2506,8 +2498,6 @@ "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], - "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="], - "lru-cache": ["lru-cache@11.2.7", "", {}, "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA=="], "lucide-react": ["lucide-react@0.548.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-63b16z63jM9yc1MwxajHeuu0FRZFsDtljtDjYm26Kd86UQ5HQzu9ksEtoUUw4RBuewodw/tGFmvipePvRsKeDA=="], @@ -2616,8 +2606,6 @@ "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], - "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], - "node-addon-api": ["node-addon-api@8.7.0", "", {}, "sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA=="], "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], @@ -2978,8 +2966,6 @@ "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], - "snake-case": ["snake-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg=="], - "socket.io-client": ["socket.io-client@4.8.3", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" } }, "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g=="], "socket.io-parser": ["socket.io-parser@4.2.6", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1" } }, "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg=="], @@ -3502,8 +3488,6 @@ "@sqds/multisig/@solana/spl-token": ["@solana/spl-token@0.3.11", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", "@solana/spl-token-metadata": "^0.1.2", "buffer": "^6.0.3" }, "peerDependencies": { "@solana/web3.js": "^1.88.0" } }, "sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ=="], - "@sqds/sdk/@coral-xyz/anchor": ["@coral-xyz/anchor@0.26.0", "", { "dependencies": { "@coral-xyz/borsh": "^0.26.0", "@solana/web3.js": "^1.68.0", "base64-js": "^1.5.1", "bn.js": "^5.1.2", "bs58": "^4.0.1", "buffer-layout": "^1.2.2", "camelcase": "^6.3.0", "cross-fetch": "^3.1.5", "crypto-hash": "^1.3.0", "eventemitter3": "^4.0.7", "js-sha256": "^0.9.0", "pako": "^2.0.3", "snake-case": "^3.0.4", "superstruct": "^0.15.4", "toml": "^3.0.0" } }, "sha512-PxRl+wu5YyptWiR9F2MBHOLLibm87Z4IMUBPreX+DYBtPM+xggvcPi0KAN7+kIL4IrIhXI8ma5V0MCXxSN1pHg=="], - "@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], "@testing-library/dom/dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], @@ -3932,10 +3916,6 @@ "@solflare-wallet/sdk/bs58/base-x": ["base-x@4.0.1", "", {}, "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw=="], - "@sqds/sdk/@coral-xyz/anchor/@coral-xyz/borsh": ["@coral-xyz/borsh@0.26.0", "", { "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" }, "peerDependencies": { "@solana/web3.js": "^1.68.0" } }, "sha512-uCZ0xus0CszQPHYfWAqKS5swS1UxvePu83oOF+TWpUkedsNlg6p2p4azxZNSSqwXb9uXMFgxhuMBX9r3Xoi0vQ=="], - - "@sqds/sdk/@coral-xyz/anchor/bs58": ["bs58@4.0.1", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="], - "@trezor/blockchain-link/@trezor/blockchain-link-utils/@trezor/protobuf": ["@trezor/protobuf@1.5.1", "", { "dependencies": { "@trezor/schema-utils": "1.4.0", "long": "5.2.5", "protobufjs": "7.4.0" }, "peerDependencies": { "tslib": "^2.6.2" } }, "sha512-nAkaCCAqLpErBd+IuKeG5MpbyLR/2RMgCw18TWc80m1Ws/XgQirhHY9Jbk6gLImTXb9GTrxP0+MDSahzd94rSA=="], "@trezor/device-authenticity/@noble/curves/@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="], @@ -4156,8 +4136,6 @@ "@solana/codecs/@solana/codecs-numbers/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - "@sqds/sdk/@coral-xyz/anchor/bs58/base-x": ["base-x@3.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA=="], - "@walletconnect/utils/viem/ox/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], "@walletconnect/utils/viem/ox/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], diff --git a/ts/package-lock.json b/ts/package-lock.json deleted file mode 100644 index c98bf95..0000000 --- a/ts/package-lock.json +++ /dev/null @@ -1,24504 +0,0 @@ -{ - "name": "ts", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "ts", - "workspaces": [ - "apps/*", - "packages/*" - ], - "dependencies": { - "@heroicons/react": "^2.2.0", - "@radix-ui/react-dialog": "^1.1.15" - }, - "devDependencies": { - "@types/bs58": "^5.0.0", - "prettier": "^3.6.2", - "turbo": "^2.5.8", - "typescript": "5.9.2", - "web": "workspace:*" - }, - "engines": { - "node": ">=18" - } - }, - "apps/admin": { - "version": "0.1.0", - "dependencies": { - "@bunkercash/cloudflare-kv": "*", - "@coral-xyz/anchor": "^0.30.1", - "@opennextjs/cloudflare": "^1.17.1", - "@radix-ui/react-slot": "^1.2.4", - "@solana/spl-token": "^0.4.9", - "@solana/wallet-adapter-react": "^0.15.35", - "@solana/wallet-adapter-react-ui": "^0.9.35", - "@solana/wallet-adapter-wallets": "^0.19.32", - "@solana/web3.js": "^1.98.4", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "lucide-react": "^0.548.0", - "next": "^15.5.10", - "react": "19.1.0", - "react-dom": "19.1.0", - "tailwind-merge": "^3.3.1", - "tailwindcss-animate": "^1.0.7" - }, - "devDependencies": { - "@cloudflare/workers-types": "^4.20260317.1", - "@eslint/eslintrc": "^3", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "autoprefixer": "^10.4.20", - "eslint": "^9", - "eslint-config-next": "15.5.4", - "postcss": "^8.4.49", - "tailwindcss": "^3.4.17", - "typescript": "^5", - "vitest": "^4.0.18", - "wrangler": "^4.74.0" - } - }, - "apps/admin/node_modules/@radix-ui/react-slot": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", - "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "apps/admin/node_modules/react": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "apps/admin/node_modules/react-dom": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", - "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.26.0" - }, - "peerDependencies": { - "react": "^19.1.0" - } - }, - "apps/web": { - "version": "0.1.0", - "dependencies": { - "@bunkercash/cloudflare-kv": "*", - "@coral-xyz/anchor": "^0.30.1", - "@heroicons/react": "^2.2.0", - "@hookform/resolvers": "^5.2.2", - "@opennextjs/cloudflare": "^1.17.1", - "@radix-ui/react-accordion": "^1.2.12", - "@radix-ui/react-alert-dialog": "^1.1.15", - "@radix-ui/react-aspect-ratio": "^1.1.8", - "@radix-ui/react-avatar": "^1.1.11", - "@radix-ui/react-checkbox": "^1.3.3", - "@radix-ui/react-collapsible": "^1.1.12", - "@radix-ui/react-context-menu": "^2.2.16", - "@radix-ui/react-dialog": "^1.1.4", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-hover-card": "^1.1.15", - "@radix-ui/react-label": "^2.1.8", - "@radix-ui/react-menubar": "^1.1.16", - "@radix-ui/react-navigation-menu": "^1.2.14", - "@radix-ui/react-popover": "^1.1.15", - "@radix-ui/react-progress": "^1.1.8", - "@radix-ui/react-radio-group": "^1.3.8", - "@radix-ui/react-scroll-area": "^1.2.10", - "@radix-ui/react-select": "^2.2.6", - "@radix-ui/react-separator": "^1.1.8", - "@radix-ui/react-slider": "^1.3.6", - "@radix-ui/react-slot": "^1.2.4", - "@radix-ui/react-switch": "^1.2.6", - "@radix-ui/react-tabs": "^1.1.13", - "@radix-ui/react-toast": "^1.2.15", - "@radix-ui/react-toggle": "^1.1.10", - "@radix-ui/react-toggle-group": "^1.1.11", - "@radix-ui/react-tooltip": "^1.2.8", - "@solana/spl-token": "^0.4.9", - "@solana/wallet-adapter-phantom": "^0.9.28", - "@solana/wallet-adapter-react": "^0.15.35", - "@solana/wallet-adapter-react-ui": "^0.9.35", - "@solana/web3.js": "^1.98.4", - "@sqds/multisig": "^2.1.4", - "@sqds/sdk": "^2.0.4", - "@tanstack/react-query": "^5.90.20", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cmdk": "^1.1.1", - "date-fns": "^4.1.0", - "embla-carousel-react": "^8.6.0", - "input-otp": "^1.4.2", - "jotai": "^2.15.0", - "lucide-react": "^0.548.0", - "next": "^15.5.10", - "next-themes": "^0.4.6", - "react": "19.1.0", - "react-day-picker": "^9.13.0", - "react-dom": "19.1.0", - "react-hook-form": "^7.71.1", - "react-resizable-panels": "^4.5.2", - "recharts": "^3.3.0", - "sonner": "^2.0.7", - "tailwind-merge": "^3.3.1", - "tailwindcss-animate": "^1.0.7", - "vaul": "^1.1.2", - "zod": "^4.3.6" - }, - "devDependencies": { - "@cloudflare/workers-types": "^4.20260317.1", - "@eslint/eslintrc": "^3", - "@testing-library/jest-dom": "^6.9.1", - "@testing-library/react": "^16.3.2", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "autoprefixer": "^10.4.20", - "eslint": "^9", - "eslint-config-next": "15.5.4", - "jsdom": "^28.1.0", - "postcss": "^8.4.49", - "tailwindcss": "^3.4.17", - "typescript": "^5", - "vitest": "^4.0.18", - "wrangler": "^4.74.0" - } - }, - "apps/web/node_modules/@radix-ui/react-slot": { - "version": "1.2.4", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "apps/web/node_modules/react": { - "version": "19.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "apps/web/node_modules/react-dom": { - "version": "19.1.0", - "license": "MIT", - "dependencies": { - "scheduler": "^0.26.0" - }, - "peerDependencies": { - "react": "^19.1.0" - } - }, - "node_modules/@acemir/cssom": { - "version": "0.9.31", - "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", - "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@adobe/css-tools": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", - "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@adraffy/ens-normalize": { - "version": "1.11.1", - "license": "MIT" - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@asamuzakjp/css-color": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.0.1.tgz", - "integrity": "sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^3.1.1", - "@csstools/css-color-parser": "^4.0.2", - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0", - "lru-cache": "^11.2.6" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@asamuzakjp/dom-selector": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.8.1.tgz", - "integrity": "sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/nwsapi": "^2.3.9", - "bidi-js": "^1.0.3", - "css-tree": "^3.1.0", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.2.6" - } - }, - "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@asamuzakjp/nwsapi": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", - "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@ast-grep/napi": { - "version": "0.40.5", - "resolved": "https://registry.npmjs.org/@ast-grep/napi/-/napi-0.40.5.tgz", - "integrity": "sha512-hJA62OeBKUQT68DD2gDyhOqJxZxycqg8wLxbqjgqSzYttCMSDL9tiAQ9abgekBYNHudbJosm9sWOEbmCDfpX2A==", - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@ast-grep/napi-darwin-arm64": "0.40.5", - "@ast-grep/napi-darwin-x64": "0.40.5", - "@ast-grep/napi-linux-arm64-gnu": "0.40.5", - "@ast-grep/napi-linux-arm64-musl": "0.40.5", - "@ast-grep/napi-linux-x64-gnu": "0.40.5", - "@ast-grep/napi-linux-x64-musl": "0.40.5", - "@ast-grep/napi-win32-arm64-msvc": "0.40.5", - "@ast-grep/napi-win32-ia32-msvc": "0.40.5", - "@ast-grep/napi-win32-x64-msvc": "0.40.5" - } - }, - "node_modules/@ast-grep/napi-darwin-arm64": { - "version": "0.40.5", - "resolved": "https://registry.npmjs.org/@ast-grep/napi-darwin-arm64/-/napi-darwin-arm64-0.40.5.tgz", - "integrity": "sha512-2F072fGN0WTq7KI3okuEnkGJVEHLbi56Bw1H6NAMf7j2mJJeQWsRyGOMcyNnUXZDeNdvoMH0OB2a5wwUegY/nQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ast-grep/napi-darwin-x64": { - "version": "0.40.5", - "resolved": "https://registry.npmjs.org/@ast-grep/napi-darwin-x64/-/napi-darwin-x64-0.40.5.tgz", - "integrity": "sha512-dJMidHZhhxuLBYNi6/FKI812jQ7wcFPSKkVPwviez2D+KvYagapUMAV/4dJ7FCORfguVk8Y0jpPAlYmWRT5nvA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ast-grep/napi-linux-arm64-gnu": { - "version": "0.40.5", - "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-arm64-gnu/-/napi-linux-arm64-gnu-0.40.5.tgz", - "integrity": "sha512-nBRCbyoS87uqkaw4Oyfe5VO+SRm2B+0g0T8ME69Qry9ShMf41a2bTdpcQx9e8scZPogq+CTwDHo3THyBV71l9w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ast-grep/napi-linux-arm64-musl": { - "version": "0.40.5", - "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-arm64-musl/-/napi-linux-arm64-musl-0.40.5.tgz", - "integrity": "sha512-/qKsmds5FMoaEj6FdNzepbmLMtlFuBLdrAn9GIWCqOIcVcYvM1Nka8+mncfeXB/MFZKOrzQsQdPTWqrrQzXLrA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ast-grep/napi-linux-x64-gnu": { - "version": "0.40.5", - "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-x64-gnu/-/napi-linux-x64-gnu-0.40.5.tgz", - "integrity": "sha512-DP4oDbq7f/1A2hRTFLhJfDFR6aI5mRWdEfKfHzRItmlKsR9WlcEl1qDJs/zX9R2EEtIDsSKRzuJNfJllY3/W8Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ast-grep/napi-linux-x64-musl": { - "version": "0.40.5", - "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-x64-musl/-/napi-linux-x64-musl-0.40.5.tgz", - "integrity": "sha512-BRZUvVBPUNpWPo6Ns8chXVzxHPY+k9gpsubGTHy92Q26ecZULd/dTkWWdnvfhRqttsSQ9Pe/XQdi5+hDQ6RYcg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ast-grep/napi-win32-arm64-msvc": { - "version": "0.40.5", - "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-arm64-msvc/-/napi-win32-arm64-msvc-0.40.5.tgz", - "integrity": "sha512-y95zSEwc7vhxmcrcH0GnK4ZHEBQrmrszRBNQovzaciF9GUqEcCACNLoBesn4V47IaOp4fYgD2/EhGRTIBFb2Ug==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ast-grep/napi-win32-ia32-msvc": { - "version": "0.40.5", - "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-ia32-msvc/-/napi-win32-ia32-msvc-0.40.5.tgz", - "integrity": "sha512-K/u8De62iUnFCzVUs7FBdTZ2Jrgc5/DLHqjpup66KxZ7GIM9/HGME/O8aSoPkpcAeCD4TiTZ11C1i5p5H98hTg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ast-grep/napi-win32-x64-msvc": { - "version": "0.40.5", - "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-x64-msvc/-/napi-win32-x64-msvc-0.40.5.tgz", - "integrity": "sha512-dqm5zg/o4Nh4VOQPEpMS23ot8HVd22gG0eg01t4CFcZeuzyuSgBlOL3N7xLbz3iH2sVkk7keuBwAzOIpTqziNQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@aws-crypto/crc32": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", - "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/crc32c": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", - "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", - "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-cloudfront": { - "version": "3.984.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudfront/-/client-cloudfront-3.984.0.tgz", - "integrity": "sha512-couDuDLpJtoeWne/nYyJ+I+5ntBVdNgBVRTCoDaXuVV7OC3u/wz5Ps0+GogspEwMLEFoOJ8t691h3YXQtnpQTw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.6", - "@aws-sdk/credential-provider-node": "^3.972.5", - "@aws-sdk/middleware-host-header": "^3.972.3", - "@aws-sdk/middleware-logger": "^3.972.3", - "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.6", - "@aws-sdk/region-config-resolver": "^3.972.3", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.984.0", - "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.4", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.22.0", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.12", - "@smithy/middleware-retry": "^4.4.29", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.1", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.28", - "@smithy/util-defaults-mode-node": "^4.2.31", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-stream": "^4.5.10", - "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.8", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.984.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.984.0.tgz", - "integrity": "sha512-8/Oft9MWQtbG6p9f8eY5fsKC2CcO5YVDlwive8eUYS9mEbgnyQxm68OyH26WvsSTykQ9QkIbR+fOG56RsIBODw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.6", - "@aws-sdk/credential-provider-node": "^3.972.5", - "@aws-sdk/dynamodb-codec": "^3.972.7", - "@aws-sdk/middleware-endpoint-discovery": "^3.972.3", - "@aws-sdk/middleware-host-header": "^3.972.3", - "@aws-sdk/middleware-logger": "^3.972.3", - "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.6", - "@aws-sdk/region-config-resolver": "^3.972.3", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.984.0", - "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.4", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.22.0", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.12", - "@smithy/middleware-retry": "^4.4.29", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.1", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.28", - "@smithy/util-defaults-mode-node": "^4.2.31", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.8", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda": { - "version": "3.984.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.984.0.tgz", - "integrity": "sha512-kqwNBIGNxGVhINwgN/UQfdsQkaMjbu9PFV2EhATWouV+RT60uMjK9JENgLDwbgJmEVbbnPsh9HaZ5KKwPSdiDg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.6", - "@aws-sdk/credential-provider-node": "^3.972.5", - "@aws-sdk/middleware-host-header": "^3.972.3", - "@aws-sdk/middleware-logger": "^3.972.3", - "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.6", - "@aws-sdk/region-config-resolver": "^3.972.3", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.984.0", - "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.4", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.22.0", - "@smithy/eventstream-serde-browser": "^4.2.8", - "@smithy/eventstream-serde-config-resolver": "^4.3.8", - "@smithy/eventstream-serde-node": "^4.2.8", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.12", - "@smithy/middleware-retry": "^4.4.29", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.1", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.28", - "@smithy/util-defaults-mode-node": "^4.2.31", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-stream": "^4.5.10", - "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.8", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-s3": { - "version": "3.984.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.984.0.tgz", - "integrity": "sha512-7ny2Slr93Y+QniuluvcfWwyDi32zWQfznynL56Tk0vVh7bWrvS/odm8WP2nInKicRVNipcJHY2YInur6Q/9V0A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha1-browser": "5.2.0", - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.6", - "@aws-sdk/credential-provider-node": "^3.972.5", - "@aws-sdk/middleware-bucket-endpoint": "^3.972.3", - "@aws-sdk/middleware-expect-continue": "^3.972.3", - "@aws-sdk/middleware-flexible-checksums": "^3.972.4", - "@aws-sdk/middleware-host-header": "^3.972.3", - "@aws-sdk/middleware-location-constraint": "^3.972.3", - "@aws-sdk/middleware-logger": "^3.972.3", - "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-sdk-s3": "^3.972.6", - "@aws-sdk/middleware-ssec": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.6", - "@aws-sdk/region-config-resolver": "^3.972.3", - "@aws-sdk/signature-v4-multi-region": "3.984.0", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.984.0", - "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.4", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.22.0", - "@smithy/eventstream-serde-browser": "^4.2.8", - "@smithy/eventstream-serde-config-resolver": "^4.3.8", - "@smithy/eventstream-serde-node": "^4.2.8", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-blob-browser": "^4.2.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/hash-stream-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/md5-js": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.12", - "@smithy/middleware-retry": "^4.4.29", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.1", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.28", - "@smithy/util-defaults-mode-node": "^4.2.31", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-stream": "^4.5.10", - "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.8", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-sqs": { - "version": "3.984.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.984.0.tgz", - "integrity": "sha512-TDvHpOUWlpanc3xQ5Xw0y8L2hoojBFCCSmXQ/6rKqGOf1ScX3dMA+K9aF0Zp0iwjhSh4VvsHD42esl8XwQZDjA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.6", - "@aws-sdk/credential-provider-node": "^3.972.5", - "@aws-sdk/middleware-host-header": "^3.972.3", - "@aws-sdk/middleware-logger": "^3.972.3", - "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-sdk-sqs": "^3.972.5", - "@aws-sdk/middleware-user-agent": "^3.972.6", - "@aws-sdk/region-config-resolver": "^3.972.3", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.984.0", - "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.4", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.22.0", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/md5-js": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.12", - "@smithy/middleware-retry": "^4.4.29", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.1", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.28", - "@smithy/util-defaults-mode-node": "^4.2.31", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.973.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.20.tgz", - "integrity": "sha512-i3GuX+lowD892F3IuJf8o6AbyDupMTdyTxQrCJGcn71ni5hTZ82L4nQhcdumxZ7XPJRJJVHS/CR3uYOIIs0PVA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/xml-builder": "^3.972.11", - "@smithy/core": "^3.23.11", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/signature-v4": "^5.3.12", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/crc64-nvme": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.5.tgz", - "integrity": "sha512-2VbTstbjKdT+yKi8m7b3a9CiVac+pL/IY2PHJwsaGkkHmuuqkJZIErPck1h6P3T9ghQMLSdMPyW6Qp7Di5swFg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.18.tgz", - "integrity": "sha512-X0B8AlQY507i5DwjLByeU2Af4ARsl9Vr84koDcXCbAkplmU+1xBFWxEPrWRAoh56waBne/yJqEloSwvRf4x6XA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.20.tgz", - "integrity": "sha512-ey9Lelj001+oOfrbKmS6R2CJAiXX7QKY4Vj9VJv6L2eE6/VjD8DocHIoYqztTm70xDLR4E1jYPTKfIui+eRNDA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/types": "^3.973.6", - "@smithy/fetch-http-handler": "^5.3.15", - "@smithy/node-http-handler": "^4.4.16", - "@smithy/property-provider": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "@smithy/util-stream": "^4.5.19", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.20.tgz", - "integrity": "sha512-5flXSnKHMloObNF+9N0cupKegnH1Z37cdVlpETVgx8/rAhCe+VNlkcZH3HDg2SDn9bI765S+rhNPXGDJJPfbtA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/credential-provider-env": "^3.972.18", - "@aws-sdk/credential-provider-http": "^3.972.20", - "@aws-sdk/credential-provider-login": "^3.972.20", - "@aws-sdk/credential-provider-process": "^3.972.18", - "@aws-sdk/credential-provider-sso": "^3.972.20", - "@aws-sdk/credential-provider-web-identity": "^3.972.20", - "@aws-sdk/nested-clients": "^3.996.10", - "@aws-sdk/types": "^3.973.6", - "@smithy/credential-provider-imds": "^4.2.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.20.tgz", - "integrity": "sha512-gEWo54nfqp2jABMu6HNsjVC4hDLpg9HC8IKSJnp0kqWtxIJYHTmiLSsIfI4ScQjxEwpB+jOOH8dOLax1+hy/Hw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/nested-clients": "^3.996.10", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.21", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.21.tgz", - "integrity": "sha512-hah8if3/B/Q+LBYN5FukyQ1Mym6PLPDsBOBsIgNEYD6wLyZg0UmUF/OKIVC3nX9XH8TfTPuITK+7N/jenVACWA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.18", - "@aws-sdk/credential-provider-http": "^3.972.20", - "@aws-sdk/credential-provider-ini": "^3.972.20", - "@aws-sdk/credential-provider-process": "^3.972.18", - "@aws-sdk/credential-provider-sso": "^3.972.20", - "@aws-sdk/credential-provider-web-identity": "^3.972.20", - "@aws-sdk/types": "^3.973.6", - "@smithy/credential-provider-imds": "^4.2.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.18.tgz", - "integrity": "sha512-Tpl7SRaPoOLT32jbTWchPsn52hYYgJ0kpiFgnwk8pxTANQdUymVSZkzFvv1+oOgZm1CrbQUP9MBeoMZ9IzLZjA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.20.tgz", - "integrity": "sha512-p+R+PYR5Z7Gjqf/6pvbCnzEHcqPCpLzR7Yf127HjJ6EAb4hUcD+qsNRnuww1sB/RmSeCLxyay8FMyqREw4p1RA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/nested-clients": "^3.996.10", - "@aws-sdk/token-providers": "3.1009.0", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.20.tgz", - "integrity": "sha512-rWCmh8o7QY4CsUj63qopzMzkDq/yPpkrpb+CnjBEFSOg/02T/we7sSTVg4QsDiVS9uwZ8VyONhq98qt+pIh3KA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/nested-clients": "^3.996.10", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/dynamodb-codec": { - "version": "3.972.21", - "resolved": "https://registry.npmjs.org/@aws-sdk/dynamodb-codec/-/dynamodb-codec-3.972.21.tgz", - "integrity": "sha512-6wsIKQWJx87F1SZyQ/SfV7ovdvP0R2l5vpgSxT1+b9Qmx2IYnvWNNJfmpd3HJRN7aokEh/IV/eFlVnsZF2NXCQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@smithy/core": "^3.23.11", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "@smithy/util-base64": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/endpoint-cache": { - "version": "3.972.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.972.4.tgz", - "integrity": "sha512-GdASDnWanLnHxKK0hqV97xz23QmfA/C8yGe0PiuEmWiHSe+x+x+mFEj4sXqx9IbfyPncWz8f4EhNwBSG9cgYCg==", - "license": "Apache-2.0", - "dependencies": { - "mnemonist": "0.38.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.8.tgz", - "integrity": "sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-config-provider": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.972.8.tgz", - "integrity": "sha512-S0oXx1QbSpMDBMJn4P0hOxW8ieGAdRT+G9NbL+ESWkkoCGf9D++fKYD2fyBGtIy88OrP7wgECpXgGLAcGpIj0A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/endpoint-cache": "^3.972.4", - "@aws-sdk/types": "^3.973.6", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.8.tgz", - "integrity": "sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.974.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.0.tgz", - "integrity": "sha512-BmdDjqvnuYaC4SY7ypHLXfCSsGYGUZkjCLSZyUAAYn1YT28vbNMJNDwhlfkvvE+hQHG5RJDlEmYuvBxcB9jX1g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@aws-crypto/crc32c": "5.2.0", - "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/crc64-nvme": "^3.972.5", - "@aws-sdk/types": "^3.973.6", - "@smithy/is-array-buffer": "^4.2.2", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-stream": "^4.5.19", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", - "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.8.tgz", - "integrity": "sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", - "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz", - "integrity": "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.20.tgz", - "integrity": "sha512-yhva/xL5H4tWQgsBjwV+RRD0ByCzg0TcByDCLp3GXdn/wlyRNfy8zsswDtCvr1WSKQkSQYlyEzPuWkJG0f5HvQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/core": "^3.23.11", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/signature-v4": "^5.3.12", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-stream": "^4.5.19", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-sqs": { - "version": "3.972.15", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.972.15.tgz", - "integrity": "sha512-X7yt+gJzZEK247nppuUVWS1i83q8zhZdBk1H2b6/qeXNv1ILgw0bQLNbFNG4gJi3P7vZV+PhtPkax0nwXAvRtg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.8.tgz", - "integrity": "sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.972.21", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.21.tgz", - "integrity": "sha512-62XRl1GDYPpkt7cx1AX1SPy9wgNE9Iw/NPuurJu4lmhCWS7sGKO+kS53TQ8eRmIxy3skmvNInnk0ZbWrU5Dpyg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-endpoints": "^3.996.5", - "@smithy/core": "^3.23.11", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-retry": "^4.2.12", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/util-endpoints": { - "version": "3.996.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz", - "integrity": "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "@smithy/util-endpoints": "^3.3.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/nested-clients": { - "version": "3.996.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.10.tgz", - "integrity": "sha512-SlDol5Z+C7Ivnc2rKGqiqfSUmUZzY1qHfVs9myt/nxVwswgfpjdKahyTzLTx802Zfq0NFRs7AejwKzzzl5Co2w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/middleware-host-header": "^3.972.8", - "@aws-sdk/middleware-logger": "^3.972.8", - "@aws-sdk/middleware-recursion-detection": "^3.972.8", - "@aws-sdk/middleware-user-agent": "^3.972.21", - "@aws-sdk/region-config-resolver": "^3.972.8", - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-endpoints": "^3.996.5", - "@aws-sdk/util-user-agent-browser": "^3.972.8", - "@aws-sdk/util-user-agent-node": "^3.973.7", - "@smithy/config-resolver": "^4.4.11", - "@smithy/core": "^3.23.11", - "@smithy/fetch-http-handler": "^5.3.15", - "@smithy/hash-node": "^4.2.12", - "@smithy/invalid-dependency": "^4.2.12", - "@smithy/middleware-content-length": "^4.2.12", - "@smithy/middleware-endpoint": "^4.4.25", - "@smithy/middleware-retry": "^4.4.42", - "@smithy/middleware-serde": "^4.2.14", - "@smithy/middleware-stack": "^4.2.12", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/node-http-handler": "^4.4.16", - "@smithy/protocol-http": "^5.3.12", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-body-length-node": "^4.2.3", - "@smithy/util-defaults-mode-browser": "^4.3.41", - "@smithy/util-defaults-mode-node": "^4.2.44", - "@smithy/util-endpoints": "^3.3.3", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-retry": "^4.2.12", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-endpoints": { - "version": "3.996.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz", - "integrity": "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "@smithy/util-endpoints": "^3.3.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", - "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/config-resolver": "^4.4.11", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.984.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.984.0.tgz", - "integrity": "sha512-TaWbfYCwnuOSvDSrgs7QgoaoXse49E7LzUkVOUhoezwB7bkmhp+iojADm7UepCEu4021SquD7NG1xA+WCvmldA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "^3.972.6", - "@aws-sdk/types": "^3.973.1", - "@smithy/protocol-http": "^5.3.8", - "@smithy/signature-v4": "^5.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.1009.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1009.0.tgz", - "integrity": "sha512-KCPLuTqN9u0Rr38Arln78fRG9KXpzsPWmof+PZzfAHMMQq2QED6YjQrkrfiH7PDefLWEposY1o4/eGwrmKA4JA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/nested-clients": "^3.996.10", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.973.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", - "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", - "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.984.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.984.0.tgz", - "integrity": "sha512-9ebjLA0hMKHeVvXEtTDCCOBtwjb0bOXiuUV06HNeVdgAjH6gj4x4Zwt4IBti83TiyTGOCl5YfZqGx4ehVsasbQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-endpoints": "^3.2.8", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.965.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", - "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", - "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.973.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.7.tgz", - "integrity": "sha512-Hz6EZMUAEzqUd7e+vZ9LE7mn+5gMbxltXy18v+YSFY+9LBJz15wkNZvw5JqfX3z0FS9n3bgUtz3L5rAsfh4YlA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-user-agent": "^3.972.21", - "@aws-sdk/types": "^3.973.6", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-config-provider": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.11", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.11.tgz", - "integrity": "sha512-iitV/gZKQMvY9d7ovmyFnFuTHbBAtrmLnvaSb/3X8vOKyevwtpmEtyc8AdhVWZe0pI/1GsHxlEvQeOePFzy7KQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "fast-xml-parser": "5.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws/lambda-invoke-store": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", - "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.28.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.6", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/types": "^7.28.6" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.28.6", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse--for-generate-function-map": { - "name": "@babel/traverse", - "version": "7.28.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bramus/specificity": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", - "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "^3.0.0" - }, - "bin": { - "specificity": "bin/cli.js" - } - }, - "node_modules/@bunkercash/cloudflare-kv": { - "resolved": "packages/cloudflare-kv", - "link": true - }, - "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz", - "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==", - "license": "MIT OR Apache-2.0", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@cloudflare/unenv-preset": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.15.0.tgz", - "integrity": "sha512-EGYmJaGZKWl+X8tXxcnx4v2bOZSjQeNI5dWFeXivgX9+YCT69AkzHHwlNbVpqtEUTbew8eQurpyOpeN8fg00nw==", - "license": "MIT OR Apache-2.0", - "peerDependencies": { - "unenv": "2.0.0-rc.24", - "workerd": "1.20260301.1 || ~1.20260302.1 || ~1.20260303.1 || ~1.20260304.1 || >1.20260305.0 <2.0.0-0" - }, - "peerDependenciesMeta": { - "workerd": { - "optional": true - } - } - }, - "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20260312.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260312.1.tgz", - "integrity": "sha512-HUAtDWaqUduS6yasV6+NgsK7qBpP1qGU49ow/Wb117IHjYp+PZPUGReDYocpB4GOMRoQlvdd4L487iFxzdARpw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20260312.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260312.1.tgz", - "integrity": "sha512-DOn7TPTHSxJYfi4m4NYga/j32wOTqvJf/pY4Txz5SDKWIZHSTXFyGz2K4B+thoPWLop/KZxGoyTv7db0mk/qyw==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20260312.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260312.1.tgz", - "integrity": "sha512-TdkIh3WzPXYHuvz7phAtFEEvAxvFd30tHrm4gsgpw0R0F5b8PtoM3hfL2uY7EcBBWVYUBtkY2ahDYFfufnXw/g==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20260312.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260312.1.tgz", - "integrity": "sha512-kNauZhL569Iy94t844OMwa1zP6zKFiL3xiJ4tGLS+TFTEfZ3pZsRH6lWWOtkXkjTyCmBEOog0HSEKjIV4oAffw==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20260312.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260312.1.tgz", - "integrity": "sha512-5dBrlSK+nMsZy5bYQpj8t9iiQNvCRlkm9GGvswJa9vVU/1BNO4BhJMlqOLWT24EmFyApZ+kaBiPJMV8847NDTg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workers-types": { - "version": "4.20260317.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20260317.1.tgz", - "integrity": "sha512-+G4eVwyCpm8Au1ex8vQBCuA9wnwqetz4tPNRoB/53qvktERWBRMQnrtvC1k584yRE3emMThtuY0gWshvSJ++PQ==", - "devOptional": true, - "license": "MIT OR Apache-2.0" - }, - "node_modules/@coral-xyz/anchor": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.30.1.tgz", - "integrity": "sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ==", - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "@coral-xyz/anchor-errors": "^0.30.1", - "@coral-xyz/borsh": "^0.30.1", - "@noble/hashes": "^1.3.1", - "@solana/web3.js": "^1.68.0", - "bn.js": "^5.1.2", - "bs58": "^4.0.1", - "buffer-layout": "^1.2.2", - "camelcase": "^6.3.0", - "cross-fetch": "^3.1.5", - "crypto-hash": "^1.3.0", - "eventemitter3": "^4.0.7", - "pako": "^2.0.3", - "snake-case": "^3.0.4", - "superstruct": "^0.15.4", - "toml": "^3.0.0" - }, - "engines": { - "node": ">=11" - } - }, - "node_modules/@coral-xyz/anchor-errors": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/@coral-xyz/anchor-errors/-/anchor-errors-0.30.1.tgz", - "integrity": "sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/@coral-xyz/borsh": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.30.1.tgz", - "integrity": "sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ==", - "license": "Apache-2.0", - "dependencies": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@solana/web3.js": "^1.68.0" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", - "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@csstools/css-calc": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.1.1.tgz", - "integrity": "sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.0.2.tgz", - "integrity": "sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^6.0.2", - "@csstools/css-calc": "^3.1.1" - }, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", - "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.0.tgz", - "integrity": "sha512-H4tuz2nhWgNKLt1inYpoVCfbJbMwX/lQKp3g69rrrIMIYlFD9+zTykOKhNR8uGrAmbS/kT9n6hTFkmDkxLgeTA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0" - }, - "node_modules/@csstools/css-tokenizer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", - "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@date-fns/tz": { - "version": "1.4.1", - "license": "MIT" - }, - "node_modules/@dotenvx/dotenvx": { - "version": "1.31.0", - "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.31.0.tgz", - "integrity": "sha512-GeDxvtjiRuoyWVU9nQneId879zIyNdL05bS7RKiqMkfBSKpHMWHLoRyRqjYWLaXmX/llKO1hTlqHDmatkQAjPA==", - "license": "BSD-3-Clause", - "dependencies": { - "commander": "^11.1.0", - "dotenv": "^16.4.5", - "eciesjs": "^0.4.10", - "execa": "^5.1.1", - "fdir": "^6.2.0", - "ignore": "^5.3.0", - "object-treeify": "1.1.33", - "picomatch": "^4.0.2", - "which": "^4.0.0" - }, - "bin": { - "dotenvx": "src/cli/dotenvx.js", - "git-dotenvx": "src/cli/dotenvx.js" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/@dotenvx/dotenvx/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/@dotenvx/dotenvx/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/@dotenvx/dotenvx/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/@dotenvx/dotenvx/node_modules/isexe": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", - "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@dotenvx/dotenvx/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@dotenvx/dotenvx/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/@ecies/ciphers": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.5.tgz", - "integrity": "sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==", - "license": "MIT", - "engines": { - "bun": ">=1", - "deno": ">=2", - "node": ">=16" - }, - "peerDependencies": { - "@noble/ciphers": "^1.0.0" - } - }, - "node_modules/@emurgo/cardano-serialization-lib-browser": { - "version": "13.2.1", - "license": "MIT" - }, - "node_modules/@emurgo/cardano-serialization-lib-nodejs": { - "version": "13.2.0", - "license": "MIT" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@ethereumjs/common": { - "version": "10.1.1", - "license": "MIT", - "dependencies": { - "@ethereumjs/util": "^10.1.1", - "eventemitter3": "^5.0.1" - } - }, - "node_modules/@ethereumjs/common/node_modules/eventemitter3": { - "version": "5.0.4", - "license": "MIT" - }, - "node_modules/@ethereumjs/rlp": { - "version": "5.0.2", - "license": "MPL-2.0", - "bin": { - "rlp": "bin/rlp.cjs" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ethereumjs/tx": { - "version": "10.1.1", - "license": "MPL-2.0", - "dependencies": { - "@ethereumjs/common": "^10.1.1", - "@ethereumjs/rlp": "^10.1.1", - "@ethereumjs/util": "^10.1.1", - "@noble/curves": "^2.0.1", - "@noble/hashes": "^2.0.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@ethereumjs/util": { - "version": "9.1.0", - "license": "MPL-2.0", - "dependencies": { - "@ethereumjs/rlp": "^5.0.2", - "ethereum-cryptography": "^2.2.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@exodus/bytes": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", - "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@noble/hashes": "^1.8.0 || ^2.0.0" - }, - "peerDependenciesMeta": { - "@noble/hashes": { - "optional": true - } - } - }, - "node_modules/@fivebinaries/coin-selection": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@emurgo/cardano-serialization-lib-browser": "^13.2.0", - "@emurgo/cardano-serialization-lib-nodejs": "13.2.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.3", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.3", - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.6", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.7.4" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "license": "MIT" - }, - "node_modules/@fractalwagmi/popup-connection": { - "version": "1.1.1", - "license": "ISC", - "peerDependencies": { - "react": "^17.0.2 || ^18", - "react-dom": "^17.0.2 || ^18" - } - }, - "node_modules/@fractalwagmi/solana-wallet-adapter": { - "version": "0.1.1", - "license": "ISC", - "dependencies": { - "@fractalwagmi/popup-connection": "^1.0.18", - "@solana/wallet-adapter-base": "^0.9.17", - "bs58": "^5.0.0" - } - }, - "node_modules/@fractalwagmi/solana-wallet-adapter/node_modules/base-x": { - "version": "4.0.1", - "license": "MIT" - }, - "node_modules/@fractalwagmi/solana-wallet-adapter/node_modules/bs58": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^4.0.0" - } - }, - "node_modules/@heroicons/react": { - "version": "2.2.0", - "license": "MIT", - "peerDependencies": { - "react": ">= 16 || ^19.0.0-rc" - } - }, - "node_modules/@hookform/resolvers": { - "version": "5.2.2", - "license": "MIT", - "dependencies": { - "@standard-schema/utils": "^0.3.0" - }, - "peerDependencies": { - "react-hook-form": "^7.55.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@img/colour": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@isaacs/cliui": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", - "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@isaacs/ttlcache": { - "version": "1.4.1", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "license": "ISC", - "peer": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "license": "MIT", - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "license": "MIT", - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "license": "MIT", - "peer": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "license": "MIT", - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "2.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@keystonehq/alias-sampling": { - "version": "0.1.2", - "license": "MIT" - }, - "node_modules/@keystonehq/bc-ur-registry": { - "version": "0.5.4", - "license": "Apache-2.0", - "dependencies": { - "@ngraveio/bc-ur": "^1.1.5", - "bs58check": "^2.1.2", - "tslib": "^2.3.0" - } - }, - "node_modules/@keystonehq/bc-ur-registry-sol": { - "version": "0.9.5", - "license": "ISC", - "dependencies": { - "@keystonehq/bc-ur-registry": "^0.7.0", - "bs58check": "^2.1.2", - "uuid": "^8.3.2" - } - }, - "node_modules/@keystonehq/sdk": { - "version": "0.19.2", - "license": "ISC", - "dependencies": { - "@ngraveio/bc-ur": "^1.0.0", - "qrcode.react": "^1.0.1", - "react-modal": "^3.12.1", - "react-qr-reader": "^2.2.1", - "rxjs": "^6.6.3" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@keystonehq/sol-keyring": { - "version": "0.20.0", - "license": "ISC", - "dependencies": { - "@keystonehq/bc-ur-registry": "0.5.4", - "@keystonehq/bc-ur-registry-sol": "^0.9.2", - "@keystonehq/sdk": "^0.19.2", - "@solana/web3.js": "^1.36.0", - "bs58": "^5.0.0", - "uuid": "^8.3.2" - } - }, - "node_modules/@keystonehq/sol-keyring/node_modules/base-x": { - "version": "4.0.1", - "license": "MIT" - }, - "node_modules/@keystonehq/sol-keyring/node_modules/bs58": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^4.0.0" - } - }, - "node_modules/@ledgerhq/devices": { - "version": "8.10.0", - "license": "Apache-2.0", - "dependencies": { - "@ledgerhq/errors": "^6.29.0", - "@ledgerhq/logs": "^6.14.0", - "rxjs": "7.8.2", - "semver": "7.7.3" - } - }, - "node_modules/@ledgerhq/errors": { - "version": "6.29.0", - "license": "Apache-2.0" - }, - "node_modules/@ledgerhq/hw-transport": { - "version": "6.32.0", - "license": "Apache-2.0", - "dependencies": { - "@ledgerhq/devices": "8.10.0", - "@ledgerhq/errors": "^6.29.0", - "@ledgerhq/logs": "^6.14.0", - "events": "^3.3.0" - } - }, - "node_modules/@ledgerhq/hw-transport-webhid": { - "version": "6.31.0", - "license": "Apache-2.0", - "dependencies": { - "@ledgerhq/devices": "8.10.0", - "@ledgerhq/errors": "^6.29.0", - "@ledgerhq/hw-transport": "6.32.0", - "@ledgerhq/logs": "^6.14.0" - } - }, - "node_modules/@ledgerhq/logs": { - "version": "6.14.0", - "license": "Apache-2.0" - }, - "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.5.1", - "license": "BSD-3-Clause" - }, - "node_modules/@lit/reactive-element": { - "version": "2.1.2", - "license": "BSD-3-Clause", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.5.0" - } - }, - "node_modules/@metaplex-foundation/beet": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet/-/beet-0.7.1.tgz", - "integrity": "sha512-hNCEnS2WyCiYyko82rwuISsBY3KYpe828ubsd2ckeqZr7tl0WVLivGkoyA/qdiaaHEBGdGl71OpfWa2rqL3DiA==", - "license": "Apache-2.0", - "dependencies": { - "ansicolors": "^0.3.2", - "bn.js": "^5.2.0", - "debug": "^4.3.3" - } - }, - "node_modules/@metaplex-foundation/beet-solana": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet-solana/-/beet-solana-0.4.0.tgz", - "integrity": "sha512-B1L94N3ZGMo53b0uOSoznbuM5GBNJ8LwSeznxBxJ+OThvfHQ4B5oMUqb+0zdLRfkKGS7Q6tpHK9P+QK0j3w2cQ==", - "license": "Apache-2.0", - "dependencies": { - "@metaplex-foundation/beet": ">=0.1.0", - "@solana/web3.js": "^1.56.2", - "bs58": "^5.0.0", - "debug": "^4.3.4" - } - }, - "node_modules/@metaplex-foundation/beet-solana/node_modules/base-x": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.1.tgz", - "integrity": "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==", - "license": "MIT" - }, - "node_modules/@metaplex-foundation/beet-solana/node_modules/bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", - "license": "MIT", - "dependencies": { - "base-x": "^4.0.0" - } - }, - "node_modules/@metaplex-foundation/cusper": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/cusper/-/cusper-0.0.2.tgz", - "integrity": "sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==", - "license": "Apache-2.0" - }, - "node_modules/@mobily/ts-belt": { - "version": "3.13.1", - "license": "MIT", - "engines": { - "node": ">= 10.*" - } - }, - "node_modules/@next/env": { - "version": "15.5.10", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.10.tgz", - "integrity": "sha512-plg+9A/KoZcTS26fe15LHg+QxReTazrIOoKKUC3Uz4leGGeNPgLHdevVraAAOX0snnUs3WkRx3eUQpj9mreG6A==", - "license": "MIT" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "15.5.9", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "3.3.1" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.7.tgz", - "integrity": "sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.7.tgz", - "integrity": "sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.7.tgz", - "integrity": "sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.7.tgz", - "integrity": "sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.7.tgz", - "integrity": "sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.7.tgz", - "integrity": "sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.7.tgz", - "integrity": "sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.7.tgz", - "integrity": "sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ngraveio/bc-ur": { - "version": "1.1.13", - "license": "MIT", - "dependencies": { - "@keystonehq/alias-sampling": "^0.1.1", - "assert": "^2.0.0", - "bignumber.js": "^9.0.1", - "cbor-sync": "^1.0.4", - "crc": "^3.8.0", - "jsbi": "^3.1.5", - "sha.js": "^2.4.11" - } - }, - "node_modules/@noble/ciphers": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/curves": { - "version": "1.9.7", - "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", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@node-minify/core": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@node-minify/core/-/core-8.0.6.tgz", - "integrity": "sha512-/vxN46ieWDLU67CmgbArEvOb41zlYFOkOtr9QW9CnTrBLuTyGgkyNWC2y5+khvRw3Br58p2B5ZVSx/PxCTru6g==", - "license": "MIT", - "dependencies": { - "@node-minify/utils": "8.0.6", - "glob": "9.3.5", - "mkdirp": "1.0.4" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@node-minify/core/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@node-minify/core/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@node-minify/core/node_modules/minimatch": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.7.tgz", - "integrity": "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@node-minify/terser": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@node-minify/terser/-/terser-8.0.6.tgz", - "integrity": "sha512-grQ1ipham743ch2c3++C8Isk6toJnxJSyDiwUI/IWUCh4CZFD6aYVw6UAY40IpCnjrq5aXGwiv5OZJn6Pr0hvg==", - "license": "MIT", - "dependencies": { - "@node-minify/utils": "8.0.6", - "terser": "5.16.9" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@node-minify/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/@node-minify/terser/node_modules/terser": { - "version": "5.16.9", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz", - "integrity": "sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==", - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@node-minify/utils": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@node-minify/utils/-/utils-8.0.6.tgz", - "integrity": "sha512-csY4qcR7jUwiZmkreNTJhcypQfts2aY2CK+a+rXgXUImZiZiySh0FvwHjRnlqWKvg+y6ae9lHFzDRjBTmqlTIQ==", - "license": "MIT", - "dependencies": { - "gzip-size": "6.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@opennextjs/aws": { - "version": "3.9.16", - "resolved": "https://registry.npmjs.org/@opennextjs/aws/-/aws-3.9.16.tgz", - "integrity": "sha512-jQQStCysIllNCPqz5W2KSguXpr+ETlOcD8SyNu+h9zwpRVYk4uEPQge+ErG3avI5xsT8vKA7EGLYG59dhj/B6Q==", - "license": "MIT", - "dependencies": { - "@ast-grep/napi": "^0.40.5", - "@aws-sdk/client-cloudfront": "3.984.0", - "@aws-sdk/client-dynamodb": "3.984.0", - "@aws-sdk/client-lambda": "3.984.0", - "@aws-sdk/client-s3": "3.984.0", - "@aws-sdk/client-sqs": "3.984.0", - "@node-minify/core": "^8.0.6", - "@node-minify/terser": "^8.0.6", - "@tsconfig/node18": "^1.0.3", - "aws4fetch": "^1.0.20", - "chalk": "^5.6.2", - "cookie": "^1.0.2", - "esbuild": "0.25.4", - "express": "^5.1.0", - "path-to-regexp": "^6.3.0", - "urlpattern-polyfill": "^10.1.0", - "yaml": "^2.8.1" - }, - "bin": { - "open-next": "dist/index.js" - }, - "peerDependencies": { - "next": "~15.0.8 || ~15.1.12 || ~15.2.9 || ~15.3.9 || ~15.4.11 || ~15.5.10 || ~16.0.11 || ^16.1.5" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@opennextjs/aws/node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" - } - }, - "node_modules/@opennextjs/cloudflare": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@opennextjs/cloudflare/-/cloudflare-1.17.1.tgz", - "integrity": "sha512-TtmjhXUEpSbnb9kgr7IQtmlQugOeX0cHiLc/e6NYAnmqQVro3yN49WvzaclSGFZod/lJFW7pOJ0NGT6JpqypAw==", - "license": "MIT", - "dependencies": { - "@ast-grep/napi": "^0.40.5", - "@dotenvx/dotenvx": "1.31.0", - "@opennextjs/aws": "3.9.16", - "cloudflare": "^4.4.1", - "comment-json": "^4.5.1", - "enquirer": "^2.4.1", - "glob": "^12.0.0", - "ts-tqdm": "^0.8.6", - "yargs": "^18.0.0" - }, - "bin": { - "opennextjs-cloudflare": "dist/cli/index.js" - }, - "peerDependencies": { - "next": "~15.0.8 || ~15.1.12 || ~15.2.9 || ~15.3.9 || ~15.4.11 || ~15.5.10 || ~16.0.11 || ^16.1.5", - "wrangler": "^4.65.0" - } - }, - "node_modules/@opennextjs/cloudflare/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@opennextjs/cloudflare/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@opennextjs/cloudflare/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@opennextjs/cloudflare/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@opennextjs/cloudflare/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "license": "ISC", - "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@opennextjs/cloudflare/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, - "node_modules/@opennextjs/cloudflare/node_modules/glob": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-12.0.0.tgz", - "integrity": "sha512-5Qcll1z7IKgHr5g485ePDdHcNQY0k2dtv/bjYy0iuyGxQw2qSOiiXUXJ+AYQpg3HNoUMHqAruX478Jeev7UULw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@opennextjs/cloudflare/node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@opennextjs/cloudflare/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@opennextjs/cloudflare/node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@opennextjs/cloudflare/node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@opennextjs/cloudflare/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@opennextjs/cloudflare/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@opennextjs/cloudflare/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@opennextjs/cloudflare/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/@opennextjs/cloudflare/node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "license": "MIT", - "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/@opennextjs/cloudflare/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "license": "ISC", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/@particle-network/analytics": { - "version": "1.0.2", - "license": "Apache-2.0", - "dependencies": { - "hash.js": "^1.1.7", - "uuidv4": "^6.2.13" - } - }, - "node_modules/@particle-network/auth": { - "version": "1.3.1", - "license": "Apache-2.0", - "dependencies": { - "@particle-network/analytics": "^1.0.1", - "@particle-network/chains": "*", - "@particle-network/crypto": "^1.0.1", - "buffer": "^6.0.3", - "draggabilly": "^3.0.0" - } - }, - "node_modules/@particle-network/chains": { - "version": "1.8.3", - "license": "Apache-2.0" - }, - "node_modules/@particle-network/crypto": { - "version": "1.0.1", - "license": "Apache-2.0", - "dependencies": { - "crypto-js": "^4.1.1", - "uuidv4": "^6.2.13" - } - }, - "node_modules/@particle-network/solana-wallet": { - "version": "1.3.2", - "license": "Apache-2.0", - "dependencies": { - "@particle-network/auth": "^1.3.1" - }, - "peerDependencies": { - "@solana/web3.js": "^1.50.1", - "bs58": "^4.0.1" - } - }, - "node_modules/@poppinss/colors": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", - "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", - "license": "MIT", - "dependencies": { - "kleur": "^4.1.5" - } - }, - "node_modules/@poppinss/dumper": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", - "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", - "license": "MIT", - "dependencies": { - "@poppinss/colors": "^4.1.5", - "@sindresorhus/is": "^7.0.2", - "supports-color": "^10.0.0" - } - }, - "node_modules/@poppinss/dumper/node_modules/supports-color": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", - "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@poppinss/exception": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", - "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", - "license": "MIT" - }, - "node_modules/@project-serum/sol-wallet-adapter": { - "version": "0.2.6", - "license": "Apache-2.0", - "dependencies": { - "bs58": "^4.0.1", - "eventemitter3": "^4.0.7" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@solana/web3.js": "^1.5.0" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@radix-ui/number": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/@radix-ui/react-accordion": { - "version": "1.2.12", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collapsible": "1.1.12", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.15", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dialog": "1.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.8", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-aspect-ratio/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-aspect-ratio/node_modules/@radix-ui/react-slot": { - "version": "1.2.4", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.1.11", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.3", - "@radix-ui/react-primitive": "2.1.4", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context": { - "version": "1.1.3", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-slot": { - "version": "1.2.4", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.3", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.12", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context-menu": { - "version": "2.2.16", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.15", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.11", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.16", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.3", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-hover-card": { - "version": "1.1.15", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label": { - "version": "2.1.8", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-slot": { - "version": "1.2.4", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.1.16", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menubar": { - "version": "1.1.16", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-navigation-menu": { - "version": "1.2.14", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover": { - "version": "1.1.15", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.8", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.5", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress": { - "version": "1.1.8", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.3", - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context": { - "version": "1.1.3", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-slot": { - "version": "1.2.4", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-radio-group": { - "version": "1.3.8", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.11", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.10", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select": { - "version": "2.2.6", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator": { - "version": "1.1.8", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot": { - "version": "1.2.4", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slider": { - "version": "1.3.6", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-switch": { - "version": "1.2.6", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.1.13", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast": { - "version": "1.2.15", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle": { - "version": "1.1.10", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.11", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-toggle": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.8", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.0", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.5.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.1", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/@react-native-async-storage/async-storage": { - "version": "1.24.0", - "license": "MIT", - "optional": true, - "dependencies": { - "merge-options": "^3.0.4" - }, - "peerDependencies": { - "react-native": "^0.0.0-0 || >=0.60 <1.0" - } - }, - "node_modules/@react-native/assets-registry": { - "version": "0.80.2", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/codegen": { - "version": "0.80.2", - "license": "MIT", - "peer": true, - "dependencies": { - "glob": "^7.1.1", - "hermes-parser": "0.28.1", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/codegen/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@react-native/codegen/node_modules/cliui": { - "version": "8.0.1", - "license": "ISC", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@react-native/codegen/node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", - "peer": true, - "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/@react-native/codegen/node_modules/y18n": { - "version": "5.0.8", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native/codegen/node_modules/yargs": { - "version": "17.7.2", - "license": "MIT", - "peer": true, - "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/@react-native/codegen/node_modules/yargs-parser": { - "version": "21.1.1", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.80.2", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-native/dev-middleware": "0.80.2", - "chalk": "^4.0.0", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "metro": "^0.82.2", - "metro-config": "^0.82.2", - "metro-core": "^0.82.2", - "semver": "^7.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@react-native-community/cli": "*" - }, - "peerDependenciesMeta": { - "@react-native-community/cli": { - "optional": true - } - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native/debugger-frontend": { - "version": "0.80.2", - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware": { - "version": "0.80.2", - "license": "MIT", - "peer": true, - "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.80.2", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^6.2.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/ws": { - "version": "6.2.3", - "license": "MIT", - "peer": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/@react-native/gradle-plugin": { - "version": "0.80.2", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/js-polyfills": { - "version": "0.80.2", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/normalize-colors": { - "version": "0.80.2", - "license": "MIT", - "peer": true - }, - "node_modules/@react-native/virtualized-lists": { - "version": "0.80.2", - "license": "MIT", - "peer": true, - "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^19.0.0", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@reduxjs/toolkit": { - "version": "2.11.2", - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@standard-schema/utils": "^0.3.0", - "immer": "^11.0.0", - "redux": "^5.0.1", - "redux-thunk": "^3.1.0", - "reselect": "^5.1.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", - "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } - } - }, - "node_modules/@reduxjs/toolkit/node_modules/immer": { - "version": "11.1.3", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/@reown/appkit": { - "version": "1.7.2", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.7.2", - "@reown/appkit-controllers": "1.7.2", - "@reown/appkit-polyfills": "1.7.2", - "@reown/appkit-scaffold-ui": "1.7.2", - "@reown/appkit-ui": "1.7.2", - "@reown/appkit-utils": "1.7.2", - "@reown/appkit-wallet": "1.7.2", - "@walletconnect/types": "2.19.1", - "@walletconnect/universal-provider": "2.19.1", - "bs58": "6.0.0", - "valtio": "1.13.2", - "viem": ">=2.23.11" - } - }, - "node_modules/@reown/appkit-common": { - "version": "1.7.2", - "license": "Apache-2.0", - "dependencies": { - "big.js": "6.2.2", - "dayjs": "1.11.13", - "viem": ">=2.23.11" - } - }, - "node_modules/@reown/appkit-controllers": { - "version": "1.7.2", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.7.2", - "@reown/appkit-wallet": "1.7.2", - "@walletconnect/universal-provider": "2.19.1", - "valtio": "1.13.2", - "viem": ">=2.23.11" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@noble/curves": { - "version": "1.8.1", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.7.1" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@noble/hashes": { - "version": "1.7.1", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/core": { - "version": "2.19.1", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/jsonrpc-ws-connection": "1.0.16", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.1.0", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.19.1", - "@walletconnect/utils": "2.19.1", - "@walletconnect/window-getters": "1.0.1", - "es-toolkit": "1.33.0", - "events": "3.3.0", - "uint8arrays": "3.1.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/sign-client": { - "version": "2.19.1", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/core": "2.19.1", - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/logger": "2.1.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.19.1", - "@walletconnect/utils": "2.19.1", - "events": "3.3.0" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/universal-provider": { - "version": "2.19.1", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/jsonrpc-http-connection": "1.0.8", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "@walletconnect/sign-client": "2.19.1", - "@walletconnect/types": "2.19.1", - "@walletconnect/utils": "2.19.1", - "es-toolkit": "1.33.0", - "events": "3.3.0" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils": { - "version": "2.19.1", - "license": "Apache-2.0", - "dependencies": { - "@noble/ciphers": "1.2.1", - "@noble/curves": "1.8.1", - "@noble/hashes": "1.7.1", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.1.0", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.19.1", - "@walletconnect/window-getters": "1.0.1", - "@walletconnect/window-metadata": "1.0.1", - "bs58": "6.0.0", - "detect-browser": "5.3.0", - "elliptic": "6.6.1", - "query-string": "7.1.3", - "uint8arrays": "3.1.0", - "viem": "2.23.2" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/base-x": { - "version": "5.0.1", - "license": "MIT" - }, - "node_modules/@reown/appkit-controllers/node_modules/bs58": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^5.0.0" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/es-toolkit": { - "version": "1.33.0", - "license": "MIT", - "workspaces": [ - "docs", - "benchmarks" - ] - }, - "node_modules/@reown/appkit-polyfills": { - "version": "1.7.2", - "license": "Apache-2.0", - "dependencies": { - "buffer": "6.0.3" - } - }, - "node_modules/@reown/appkit-scaffold-ui": { - "version": "1.7.2", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.7.2", - "@reown/appkit-controllers": "1.7.2", - "@reown/appkit-ui": "1.7.2", - "@reown/appkit-utils": "1.7.2", - "@reown/appkit-wallet": "1.7.2", - "lit": "3.1.0" - } - }, - "node_modules/@reown/appkit-ui": { - "version": "1.7.2", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.7.2", - "@reown/appkit-controllers": "1.7.2", - "@reown/appkit-wallet": "1.7.2", - "lit": "3.1.0", - "qrcode": "1.5.3" - } - }, - "node_modules/@reown/appkit-utils": { - "version": "1.7.2", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.7.2", - "@reown/appkit-controllers": "1.7.2", - "@reown/appkit-polyfills": "1.7.2", - "@reown/appkit-wallet": "1.7.2", - "@walletconnect/logger": "2.1.2", - "@walletconnect/universal-provider": "2.19.1", - "valtio": "1.13.2", - "viem": ">=2.23.11" - }, - "peerDependencies": { - "valtio": "1.13.2" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@noble/curves": { - "version": "1.8.1", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.7.1" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@noble/hashes": { - "version": "1.7.1", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@walletconnect/core": { - "version": "2.19.1", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/jsonrpc-ws-connection": "1.0.16", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.1.0", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.19.1", - "@walletconnect/utils": "2.19.1", - "@walletconnect/window-getters": "1.0.1", - "es-toolkit": "1.33.0", - "events": "3.3.0", - "uint8arrays": "3.1.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@walletconnect/sign-client": { - "version": "2.19.1", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/core": "2.19.1", - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/logger": "2.1.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.19.1", - "@walletconnect/utils": "2.19.1", - "events": "3.3.0" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@walletconnect/universal-provider": { - "version": "2.19.1", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/jsonrpc-http-connection": "1.0.8", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "@walletconnect/sign-client": "2.19.1", - "@walletconnect/types": "2.19.1", - "@walletconnect/utils": "2.19.1", - "es-toolkit": "1.33.0", - "events": "3.3.0" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils": { - "version": "2.19.1", - "license": "Apache-2.0", - "dependencies": { - "@noble/ciphers": "1.2.1", - "@noble/curves": "1.8.1", - "@noble/hashes": "1.7.1", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.1.0", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.19.1", - "@walletconnect/window-getters": "1.0.1", - "@walletconnect/window-metadata": "1.0.1", - "bs58": "6.0.0", - "detect-browser": "5.3.0", - "elliptic": "6.6.1", - "query-string": "7.1.3", - "uint8arrays": "3.1.0", - "viem": "2.23.2" - } - }, - "node_modules/@reown/appkit-utils/node_modules/base-x": { - "version": "5.0.1", - "license": "MIT" - }, - "node_modules/@reown/appkit-utils/node_modules/bs58": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^5.0.0" - } - }, - "node_modules/@reown/appkit-utils/node_modules/es-toolkit": { - "version": "1.33.0", - "license": "MIT", - "workspaces": [ - "docs", - "benchmarks" - ] - }, - "node_modules/@reown/appkit-wallet": { - "version": "1.7.2", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.7.2", - "@reown/appkit-polyfills": "1.7.2", - "@walletconnect/logger": "2.1.2", - "zod": "3.22.4" - } - }, - "node_modules/@reown/appkit-wallet/node_modules/zod": { - "version": "3.22.4", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/@reown/appkit/node_modules/base-x": { - "version": "5.0.1", - "license": "MIT" - }, - "node_modules/@reown/appkit/node_modules/bs58": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^5.0.0" - } - }, - "node_modules/@repo/eslint-config": { - "resolved": "packages/eslint-config", - "link": true - }, - "node_modules/@repo/typescript-config": { - "resolved": "packages/typescript-config", - "link": true - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.15.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@scure/base": { - "version": "1.2.6", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@noble/curves": { - "version": "1.4.2", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@noble/hashes": { - "version": "1.4.0", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@scure/base": { - "version": "1.1.9", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39": { - "version": "1.6.0", - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "license": "MIT" - }, - "node_modules/@sindresorhus/is": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", - "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@smithy/abort-controller": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.12.tgz", - "integrity": "sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.2.tgz", - "integrity": "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader-native": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.3.tgz", - "integrity": "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-base64": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.11.tgz", - "integrity": "sha512-YxFiiG4YDAtX7WMN7RuhHZLeTmRRAOyCbr+zB8e3AQzHPnUhS8zXjB1+cniPVQI3xbWsQPM0X2aaIkO/ME0ymw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-endpoints": "^3.3.3", - "@smithy/util-middleware": "^4.2.12", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "3.23.12", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.12.tgz", - "integrity": "sha512-o9VycsYNtgC+Dy3I0yrwCqv9CWicDnke0L7EVOrZtJpjb2t0EjaEofmMrYc0T1Kn3yk32zm6cspxF9u9Bj7e5w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-stream": "^4.5.20", - "@smithy/util-utf8": "^4.2.2", - "@smithy/uuid": "^1.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.12.tgz", - "integrity": "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.12.tgz", - "integrity": "sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.13.1", - "@smithy/util-hex-encoding": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.12.tgz", - "integrity": "sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.12.tgz", - "integrity": "sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-node": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.12.tgz", - "integrity": "sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.12.tgz", - "integrity": "sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-codec": "^4.2.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.15", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.15.tgz", - "integrity": "sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/querystring-builder": "^4.2.12", - "@smithy/types": "^4.13.1", - "@smithy/util-base64": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-blob-browser": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.13.tgz", - "integrity": "sha512-YrF4zWKh+ghLuquldj6e/RzE3xZYL8wIPfkt0MqCRphVICjyyjH8OwKD7LLlKpVEbk4FLizFfC1+gwK6XQdR3g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/chunked-blob-reader": "^5.2.2", - "@smithy/chunked-blob-reader-native": "^4.2.3", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-node": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.12.tgz", - "integrity": "sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "@smithy/util-buffer-from": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-stream-node": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.12.tgz", - "integrity": "sha512-O3YbmGExeafuM/kP7Y8r6+1y0hIh3/zn6GROx0uNlB54K9oihAL75Qtc+jFfLNliTi6pxOAYZrRKD9A7iA6UFw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.12.tgz", - "integrity": "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz", - "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/md5-js": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.12.tgz", - "integrity": "sha512-W/oIpHCpWU2+iAkfZYyGWE+qkpuf3vEXHLxQQDx9FPNZTTdnul0dZ2d/gUFrtQ5je1G2kp4cjG0/24YueG2LbQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.12.tgz", - "integrity": "sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.26", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.26.tgz", - "integrity": "sha512-8Qfikvd2GVKSm8S6IbjfwFlRY9VlMrj0Dp4vTwAuhqbX7NhJKE5DQc2bnfJIcY0B+2YKMDBWfvexbSZeejDgeg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.23.12", - "@smithy/middleware-serde": "^4.2.15", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "@smithy/util-middleware": "^4.2.12", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "4.4.43", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.43.tgz", - "integrity": "sha512-ZwsifBdyuNHrFGmbc7bAfP2b54+kt9J2rhFd18ilQGAB+GDiP4SrawqyExbB7v455QVR7Psyhb2kjULvBPIhvA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/service-error-classification": "^4.2.12", - "@smithy/smithy-client": "^4.12.6", - "@smithy/types": "^4.13.1", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-retry": "^4.2.12", - "@smithy/uuid": "^1.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "4.2.15", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.15.tgz", - "integrity": "sha512-ExYhcltZSli0pgAKOpQQe1DLFBLryeZ22605y/YS+mQpdNWekum9Ujb/jMKfJKgjtz1AZldtwA/wCYuKJgjjlg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.23.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.12.tgz", - "integrity": "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.12.tgz", - "integrity": "sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.0.tgz", - "integrity": "sha512-Rnq9vQWiR1+/I6NZZMNzJHV6pZYyEHt2ZnuV3MG8z2NNenC4i/8Kzttz7CjZiHSmsN5frhXhg17z3Zqjjhmz1A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/querystring-builder": "^4.2.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.12.tgz", - "integrity": "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "5.3.12", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.12.tgz", - "integrity": "sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.12.tgz", - "integrity": "sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "@smithy/util-uri-escape": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.12.tgz", - "integrity": "sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.12.tgz", - "integrity": "sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.7.tgz", - "integrity": "sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "5.3.12", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.12.tgz", - "integrity": "sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.2.2", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-uri-escape": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "4.12.6", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.6.tgz", - "integrity": "sha512-aib3f0jiMsJ6+cvDnXipBsGDL7ztknYSVqJs1FdN9P+u9tr/VzOR7iygSh6EUOdaBeMCMSh3N0VdyYsG4o91DQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.23.12", - "@smithy/middleware-endpoint": "^4.4.26", - "@smithy/middleware-stack": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-stream": "^4.5.20", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.1.tgz", - "integrity": "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.12.tgz", - "integrity": "sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/querystring-parser": "^4.2.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-base64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz", - "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz", - "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz", - "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz", - "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz", - "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.42", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.42.tgz", - "integrity": "sha512-0vjwmcvkWAUtikXnWIUOyV6IFHTEeQUYh3JUZcDgcszF+hD/StAsQ3rCZNZEPHgI9kVNcbnyc8P2CBHnwgmcwg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.2.12", - "@smithy/smithy-client": "^4.12.6", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.45", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.45.tgz", - "integrity": "sha512-q5dOqqfTgUcLe38TAGiFn9srToKj2YCHJ34QGOLzM+xYLLA+qRZv7N+33kl1MERVusue36ZHnlNaNEvY/PzSrw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^4.4.11", - "@smithy/credential-provider-imds": "^4.2.12", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/smithy-client": "^4.12.6", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.3.tgz", - "integrity": "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz", - "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.12.tgz", - "integrity": "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.12.tgz", - "integrity": "sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/service-error-classification": "^4.2.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "4.5.20", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.20.tgz", - "integrity": "sha512-4yXLm5n/B5SRBR2p8cZ90Sbv4zL4NKsgxdzCzp/83cXw2KxLEumt5p+GAVyRNZgQOSrzXn9ARpO0lUe8XSlSDw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/fetch-http-handler": "^5.3.15", - "@smithy/node-http-handler": "^4.5.0", - "@smithy/types": "^4.13.1", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-buffer-from": "^4.2.2", - "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz", - "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", - "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-waiter": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.13.tgz", - "integrity": "sha512-2zdZ9DTHngRtcYxJK1GUDxruNr53kv5W2Lupe0LMU+Imr6ohQg8M2T14MNkj1Y0wS3FFwpgpGQyvuaMF7CiTmQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^4.2.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/uuid": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", - "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "license": "MIT" - }, - "node_modules/@solana-mobile/mobile-wallet-adapter-protocol": { - "version": "2.2.5", - "license": "Apache-2.0", - "dependencies": { - "@solana/codecs-strings": "^4.0.0", - "@solana/wallet-standard": "^1.1.2", - "@solana/wallet-standard-util": "^1.1.1", - "@wallet-standard/core": "^1.0.3", - "js-base64": "^3.7.5" - }, - "peerDependencies": { - "react-native": ">0.69" - } - }, - "node_modules/@solana-mobile/mobile-wallet-adapter-protocol-web3js": { - "version": "2.2.5", - "license": "Apache-2.0", - "dependencies": { - "@solana-mobile/mobile-wallet-adapter-protocol": "^2.2.5", - "bs58": "^5.0.0", - "js-base64": "^3.7.5" - }, - "peerDependencies": { - "@solana/web3.js": "^1.58.0" - } - }, - "node_modules/@solana-mobile/mobile-wallet-adapter-protocol-web3js/node_modules/base-x": { - "version": "4.0.1", - "license": "MIT" - }, - "node_modules/@solana-mobile/mobile-wallet-adapter-protocol-web3js/node_modules/bs58": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^4.0.0" - } - }, - "node_modules/@solana-mobile/wallet-adapter-mobile": { - "version": "2.2.5", - "license": "Apache-2.0", - "dependencies": { - "@solana-mobile/mobile-wallet-adapter-protocol-web3js": "^2.2.5", - "@solana-mobile/wallet-standard-mobile": "^0.4.3", - "@solana/wallet-adapter-base": "^0.9.23", - "@solana/wallet-standard-features": "^1.2.0", - "js-base64": "^3.7.5" - }, - "optionalDependencies": { - "@react-native-async-storage/async-storage": "^1.17.7" - }, - "peerDependencies": { - "@solana/web3.js": "^1.58.0" - } - }, - "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@solana-mobile/wallet-standard-mobile": { - "version": "0.4.4", - "license": "Apache-2.0", - "dependencies": { - "@solana-mobile/mobile-wallet-adapter-protocol": "^2.2.5", - "@solana/wallet-standard-chains": "^1.1.0", - "@solana/wallet-standard-features": "^1.2.0", - "@wallet-standard/base": "^1.0.1", - "@wallet-standard/features": "^1.0.3", - "bs58": "^5.0.0", - "js-base64": "^3.7.5", - "qrcode": "^1.5.4" - } - }, - "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/base-x": { - "version": "4.0.1", - "license": "MIT" - }, - "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/bs58": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^4.0.0" - } - }, - "node_modules/@solana-program/compute-budget": { - "version": "0.8.0", - "license": "Apache-2.0", - "peerDependencies": { - "@solana/kit": "^2.1.0" - } - }, - "node_modules/@solana-program/stake": { - "version": "0.2.1", - "license": "MIT", - "peerDependencies": { - "@solana/kit": "^2.1.0" - } - }, - "node_modules/@solana-program/system": { - "version": "0.7.0", - "license": "Apache-2.0", - "peerDependencies": { - "@solana/kit": "^2.1.0" - } - }, - "node_modules/@solana-program/token": { - "version": "0.5.1", - "license": "Apache-2.0", - "peerDependencies": { - "@solana/kit": "^2.1.0" - } - }, - "node_modules/@solana-program/token-2022": { - "version": "0.4.2", - "license": "Apache-2.0", - "peerDependencies": { - "@solana/kit": "^2.1.0", - "@solana/sysvars": "^2.1.0" - } - }, - "node_modules/@solana/accounts": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/rpc-spec": "2.3.0", - "@solana/rpc-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/accounts/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/accounts/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/addresses": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/assertions": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/nominal-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/addresses/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/addresses/node_modules/@solana/codecs-numbers": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/addresses/node_modules/@solana/codecs-strings": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/addresses/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/assertions": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/assertions/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/buffer-layout": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "buffer": "~6.0.3" - }, - "engines": { - "node": ">=5.10" - } - }, - "node_modules/@solana/buffer-layout-utils": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz", - "integrity": "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==", - "license": "Apache-2.0", - "dependencies": { - "@solana/buffer-layout": "^4.0.0", - "@solana/web3.js": "^1.32.0", - "bigint-buffer": "^1.1.5", - "bignumber.js": "^9.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@solana/codecs": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-rc.1.tgz", - "integrity": "sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.0.0-rc.1", - "@solana/codecs-data-structures": "2.0.0-rc.1", - "@solana/codecs-numbers": "2.0.0-rc.1", - "@solana/codecs-strings": "2.0.0-rc.1", - "@solana/options": "2.0.0-rc.1" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs-core": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "4.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/codecs-data-structures": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-rc.1.tgz", - "integrity": "sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.0.0-rc.1", - "@solana/codecs-numbers": "2.0.0-rc.1", - "@solana/errors": "2.0.0-rc.1" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs-data-structures/node_modules/@solana/codecs-core": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-rc.1.tgz", - "integrity": "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.0.0-rc.1" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs-data-structures/node_modules/@solana/codecs-numbers": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-rc.1.tgz", - "integrity": "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.0.0-rc.1", - "@solana/errors": "2.0.0-rc.1" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs-data-structures/node_modules/@solana/errors": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-rc.1.tgz", - "integrity": "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "commander": "^12.1.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs-data-structures/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@solana/codecs-numbers": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "4.0.0", - "@solana/errors": "4.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/codecs-strings": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "4.0.0", - "@solana/codecs-numbers": "4.0.0", - "@solana/errors": "4.0.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/codecs/node_modules/@solana/codecs-core": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-rc.1.tgz", - "integrity": "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.0.0-rc.1" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs/node_modules/@solana/codecs-numbers": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-rc.1.tgz", - "integrity": "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.0.0-rc.1", - "@solana/errors": "2.0.0-rc.1" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs/node_modules/@solana/codecs-strings": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-rc.1.tgz", - "integrity": "sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.0.0-rc.1", - "@solana/codecs-numbers": "2.0.0-rc.1", - "@solana/errors": "2.0.0-rc.1" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs/node_modules/@solana/errors": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-rc.1.tgz", - "integrity": "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "commander": "^12.1.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@solana/errors": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "chalk": "5.6.2", - "commander": "14.0.1" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/fast-stable-stringify": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/functional": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/instructions": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/instructions/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/instructions/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/keys": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/assertions": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/nominal-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/keys/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/keys/node_modules/@solana/codecs-numbers": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/keys/node_modules/@solana/codecs-strings": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/keys/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/kit": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/accounts": "2.3.0", - "@solana/addresses": "2.3.0", - "@solana/codecs": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/instructions": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/programs": "2.3.0", - "@solana/rpc": "2.3.0", - "@solana/rpc-parsed-types": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "@solana/rpc-subscriptions": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/signers": "2.3.0", - "@solana/sysvars": "2.3.0", - "@solana/transaction-confirmation": "2.3.0", - "@solana/transaction-messages": "2.3.0", - "@solana/transactions": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/kit/node_modules/@solana/codecs": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.3.0.tgz", - "integrity": "sha512-JVqGPkzoeyU262hJGdH64kNLH0M+Oew2CIPOa/9tR3++q2pEd4jU2Rxdfye9sd0Ce3XJrR5AIa8ZfbyQXzjh+g==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-data-structures": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/options": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/kit/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.3.0.tgz", - "integrity": "sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/kit/node_modules/@solana/codecs-data-structures": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.3.0.tgz", - "integrity": "sha512-qvU5LE5DqEdYMYgELRHv+HMOx73sSoV1ZZkwIrclwUmwTbTaH8QAJURBj0RhQ/zCne7VuLLOZFFGv6jGigWhSw==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/kit/node_modules/@solana/codecs-numbers": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.3.0.tgz", - "integrity": "sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/kit/node_modules/@solana/codecs-strings": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.3.0.tgz", - "integrity": "sha512-y5pSBYwzVziXu521hh+VxqUtp0hYGTl1eWGoc1W+8mdvBdC1kTqm/X7aYQw33J42hw03JjryvYOvmGgk3Qz/Ug==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/kit/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/kit/node_modules/@solana/options": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.3.0.tgz", - "integrity": "sha512-PPnnZBRCWWoZQ11exPxf//DRzN2C6AoFsDI/u2AsQfYih434/7Kp4XLpfOMT/XESi+gdBMFNNfbES5zg3wAIkw==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-data-structures": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/nominal-types": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/options": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-rc.1.tgz", - "integrity": "sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.0.0-rc.1", - "@solana/codecs-data-structures": "2.0.0-rc.1", - "@solana/codecs-numbers": "2.0.0-rc.1", - "@solana/codecs-strings": "2.0.0-rc.1", - "@solana/errors": "2.0.0-rc.1" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/options/node_modules/@solana/codecs-core": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-rc.1.tgz", - "integrity": "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.0.0-rc.1" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/options/node_modules/@solana/codecs-numbers": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-rc.1.tgz", - "integrity": "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.0.0-rc.1", - "@solana/errors": "2.0.0-rc.1" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/options/node_modules/@solana/codecs-strings": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-rc.1.tgz", - "integrity": "sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.0.0-rc.1", - "@solana/codecs-numbers": "2.0.0-rc.1", - "@solana/errors": "2.0.0-rc.1" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5" - } - }, - "node_modules/@solana/options/node_modules/@solana/errors": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-rc.1.tgz", - "integrity": "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "commander": "^12.1.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/options/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@solana/programs": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/programs/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/promises": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/fast-stable-stringify": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/rpc-api": "2.3.0", - "@solana/rpc-spec": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "@solana/rpc-transformers": "2.3.0", - "@solana/rpc-transport-http": "2.3.0", - "@solana/rpc-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-api": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/rpc-parsed-types": "2.3.0", - "@solana/rpc-spec": "2.3.0", - "@solana/rpc-transformers": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/transaction-messages": "2.3.0", - "@solana/transactions": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-api/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-api/node_modules/@solana/codecs-numbers": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-api/node_modules/@solana/codecs-strings": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-api/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-parsed-types": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-spec": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/rpc-spec-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-spec-types": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-spec/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-subscriptions": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/fast-stable-stringify": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/promises": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "@solana/rpc-subscriptions-api": "2.3.0", - "@solana/rpc-subscriptions-channel-websocket": "2.3.0", - "@solana/rpc-subscriptions-spec": "2.3.0", - "@solana/rpc-transformers": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/subscribable": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-subscriptions-api": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/rpc-subscriptions-spec": "2.3.0", - "@solana/rpc-transformers": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/transaction-messages": "2.3.0", - "@solana/transactions": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-subscriptions-channel-websocket": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/rpc-subscriptions-spec": "2.3.0", - "@solana/subscribable": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3", - "ws": "^8.18.0" - } - }, - "node_modules/@solana/rpc-subscriptions-channel-websocket/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-subscriptions-spec": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/promises": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "@solana/subscribable": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-subscriptions-spec/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-subscriptions/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-transformers": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/nominal-types": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "@solana/rpc-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-transformers/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-transport-http": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/rpc-spec": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "undici-types": "^7.11.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-transport-http/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-transport-http/node_modules/undici-types": { - "version": "7.19.2", - "license": "MIT" - }, - "node_modules/@solana/rpc-types": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/nominal-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-types/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-types/node_modules/@solana/codecs-numbers": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-types/node_modules/@solana/codecs-strings": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc-types/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/rpc/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/signers": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/instructions": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/nominal-types": "2.3.0", - "@solana/transaction-messages": "2.3.0", - "@solana/transactions": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/signers/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/signers/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/spl-token": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.14.tgz", - "integrity": "sha512-u09zr96UBpX4U685MnvQsNzlvw9TiY005hk1vJmJr7gMJldoPG1eYU5/wNEyOA5lkMLiR/gOi9SFD4MefOYEsA==", - "license": "Apache-2.0", - "dependencies": { - "@solana/buffer-layout": "^4.0.0", - "@solana/buffer-layout-utils": "^0.2.0", - "@solana/spl-token-group": "^0.0.7", - "@solana/spl-token-metadata": "^0.1.6", - "buffer": "^6.0.3" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.95.5" - } - }, - "node_modules/@solana/spl-token-group": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.7.tgz", - "integrity": "sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug==", - "license": "Apache-2.0", - "dependencies": { - "@solana/codecs": "2.0.0-rc.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.95.3" - } - }, - "node_modules/@solana/spl-token-metadata": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.6.tgz", - "integrity": "sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==", - "license": "Apache-2.0", - "dependencies": { - "@solana/codecs": "2.0.0-rc.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.95.3" - } - }, - "node_modules/@solana/subscribable": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/subscribable/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/sysvars": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/accounts": "2.3.0", - "@solana/codecs": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/rpc-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/sysvars/node_modules/@solana/codecs": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-data-structures": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/options": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/sysvars/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/sysvars/node_modules/@solana/codecs-data-structures": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/sysvars/node_modules/@solana/codecs-numbers": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/sysvars/node_modules/@solana/codecs-strings": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/sysvars/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/sysvars/node_modules/@solana/options": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-data-structures": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transaction-confirmation": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/promises": "2.3.0", - "@solana/rpc": "2.3.0", - "@solana/rpc-subscriptions": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/transaction-messages": "2.3.0", - "@solana/transactions": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transaction-confirmation/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transaction-confirmation/node_modules/@solana/codecs-numbers": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transaction-confirmation/node_modules/@solana/codecs-strings": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transaction-confirmation/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transaction-messages": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-data-structures": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/instructions": "2.3.0", - "@solana/nominal-types": "2.3.0", - "@solana/rpc-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transaction-messages/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transaction-messages/node_modules/@solana/codecs-data-structures": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transaction-messages/node_modules/@solana/codecs-numbers": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transaction-messages/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transactions": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-data-structures": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/instructions": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/nominal-types": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/transaction-messages": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transactions/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transactions/node_modules/@solana/codecs-data-structures": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transactions/node_modules/@solana/codecs-numbers": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transactions/node_modules/@solana/codecs-strings": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/transactions/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/wallet-adapter-alpha": { - "version": "0.1.14", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-avana": { - "version": "0.1.17", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-base": { - "version": "0.9.27", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-standard-features": "^1.3.0", - "@wallet-standard/base": "^1.1.0", - "@wallet-standard/features": "^1.1.0", - "eventemitter3": "^5.0.1" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-base-ui": { - "version": "0.1.6", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-react": "^0.15.39" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0", - "react": "*" - } - }, - "node_modules/@solana/wallet-adapter-base/node_modules/eventemitter3": { - "version": "5.0.4", - "license": "MIT" - }, - "node_modules/@solana/wallet-adapter-bitkeep": { - "version": "0.3.24", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-bitpie": { - "version": "0.5.22", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-clover": { - "version": "0.4.23", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-coin98": { - "version": "0.5.24", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27", - "bs58": "^6.0.0", - "buffer": "^6.0.3" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-coin98/node_modules/base-x": { - "version": "5.0.1", - "license": "MIT" - }, - "node_modules/@solana/wallet-adapter-coin98/node_modules/bs58": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^5.0.0" - } - }, - "node_modules/@solana/wallet-adapter-coinbase": { - "version": "0.1.23", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-coinhub": { - "version": "0.3.22", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-fractal": { - "version": "0.1.12", - "license": "Apache-2.0", - "dependencies": { - "@fractalwagmi/solana-wallet-adapter": "^0.1.1", - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-huobi": { - "version": "0.1.19", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-hyperpay": { - "version": "0.1.18", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-keystone": { - "version": "0.1.19", - "license": "Apache-2.0", - "dependencies": { - "@keystonehq/sol-keyring": "^0.20.0", - "@solana/wallet-adapter-base": "^0.9.27", - "buffer": "^6.0.3" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-krystal": { - "version": "0.1.16", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-ledger": { - "version": "0.9.29", - "license": "Apache-2.0", - "dependencies": { - "@ledgerhq/devices": "^8.4.5", - "@ledgerhq/hw-transport": "^6.31.5", - "@ledgerhq/hw-transport-webhid": "^6.30.1", - "@solana/wallet-adapter-base": "^0.9.27", - "buffer": "^6.0.3" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-mathwallet": { - "version": "0.9.22", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-neko": { - "version": "0.2.16", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-nightly": { - "version": "0.1.20", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-nufi": { - "version": "0.1.21", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-onto": { - "version": "0.1.11", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-particle": { - "version": "0.1.16", - "license": "Apache-2.0", - "dependencies": { - "@particle-network/solana-wallet": "^1.3.2", - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-phantom": { - "version": "0.9.28", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-react": { - "version": "0.15.39", - "license": "Apache-2.0", - "dependencies": { - "@solana-mobile/wallet-adapter-mobile": "^2.2.0", - "@solana/wallet-adapter-base": "^0.9.27", - "@solana/wallet-standard-wallet-adapter-react": "^1.1.4" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0", - "react": "*" - } - }, - "node_modules/@solana/wallet-adapter-react-ui": { - "version": "0.9.39", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27", - "@solana/wallet-adapter-base-ui": "^0.1.6", - "@solana/wallet-adapter-react": "^0.15.39" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0", - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@solana/wallet-adapter-safepal": { - "version": "0.5.22", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-saifu": { - "version": "0.1.19", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-salmon": { - "version": "0.1.18", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27", - "salmon-adapter-sdk": "^1.1.1" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-sky": { - "version": "0.1.19", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-solflare": { - "version": "0.6.32", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27", - "@solana/wallet-standard-chains": "^1.1.1", - "@solflare-wallet/metamask-sdk": "^1.0.3", - "@solflare-wallet/sdk": "^1.4.2", - "@wallet-standard/wallet": "^1.1.0" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-solong": { - "version": "0.9.22", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-spot": { - "version": "0.1.19", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-tokenary": { - "version": "0.1.16", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-tokenpocket": { - "version": "0.4.23", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-torus": { - "version": "0.11.32", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27", - "@toruslabs/solana-embed": "^2.1.0", - "assert": "^2.1.0", - "crypto-browserify": "^3.12.1", - "process": "^0.11.10", - "stream-browserify": "^3.0.0" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-trezor": { - "version": "0.1.6", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27", - "@trezor/connect-web": "^9.5.5", - "buffer": "^6.0.3" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-trust": { - "version": "0.1.17", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-unsafe-burner": { - "version": "0.1.11", - "license": "Apache-2.0", - "dependencies": { - "@noble/curves": "^1.9.1", - "@solana/wallet-adapter-base": "^0.9.27", - "@solana/wallet-standard-features": "^1.3.0", - "@solana/wallet-standard-util": "^1.1.2" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-walletconnect": { - "version": "0.1.21", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27", - "@walletconnect/solana-adapter": "^0.0.8" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-wallets": { - "version": "0.19.37", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-alpha": "^0.1.14", - "@solana/wallet-adapter-avana": "^0.1.17", - "@solana/wallet-adapter-bitkeep": "^0.3.24", - "@solana/wallet-adapter-bitpie": "^0.5.22", - "@solana/wallet-adapter-clover": "^0.4.23", - "@solana/wallet-adapter-coin98": "^0.5.24", - "@solana/wallet-adapter-coinbase": "^0.1.23", - "@solana/wallet-adapter-coinhub": "^0.3.22", - "@solana/wallet-adapter-fractal": "^0.1.12", - "@solana/wallet-adapter-huobi": "^0.1.19", - "@solana/wallet-adapter-hyperpay": "^0.1.18", - "@solana/wallet-adapter-keystone": "^0.1.19", - "@solana/wallet-adapter-krystal": "^0.1.16", - "@solana/wallet-adapter-ledger": "^0.9.29", - "@solana/wallet-adapter-mathwallet": "^0.9.22", - "@solana/wallet-adapter-neko": "^0.2.16", - "@solana/wallet-adapter-nightly": "^0.1.20", - "@solana/wallet-adapter-nufi": "^0.1.21", - "@solana/wallet-adapter-onto": "^0.1.11", - "@solana/wallet-adapter-particle": "^0.1.16", - "@solana/wallet-adapter-phantom": "^0.9.28", - "@solana/wallet-adapter-safepal": "^0.5.22", - "@solana/wallet-adapter-saifu": "^0.1.19", - "@solana/wallet-adapter-salmon": "^0.1.18", - "@solana/wallet-adapter-sky": "^0.1.19", - "@solana/wallet-adapter-solflare": "^0.6.32", - "@solana/wallet-adapter-solong": "^0.9.22", - "@solana/wallet-adapter-spot": "^0.1.19", - "@solana/wallet-adapter-tokenary": "^0.1.16", - "@solana/wallet-adapter-tokenpocket": "^0.4.23", - "@solana/wallet-adapter-torus": "^0.11.32", - "@solana/wallet-adapter-trezor": "^0.1.6", - "@solana/wallet-adapter-trust": "^0.1.17", - "@solana/wallet-adapter-unsafe-burner": "^0.1.11", - "@solana/wallet-adapter-walletconnect": "^0.1.21", - "@solana/wallet-adapter-xdefi": "^0.1.11" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-adapter-xdefi": { - "version": "0.1.11", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.27" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0" - } - }, - "node_modules/@solana/wallet-standard": { - "version": "1.1.4", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-standard-core": "^1.1.2", - "@solana/wallet-standard-wallet-adapter": "^1.1.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@solana/wallet-standard-chains": { - "version": "1.1.1", - "license": "Apache-2.0", - "dependencies": { - "@wallet-standard/base": "^1.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@solana/wallet-standard-core": { - "version": "1.1.2", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-standard-chains": "^1.1.1", - "@solana/wallet-standard-features": "^1.3.0", - "@solana/wallet-standard-util": "^1.1.2" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@solana/wallet-standard-features": { - "version": "1.3.0", - "license": "Apache-2.0", - "dependencies": { - "@wallet-standard/base": "^1.1.0", - "@wallet-standard/features": "^1.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@solana/wallet-standard-util": { - "version": "1.1.2", - "license": "Apache-2.0", - "dependencies": { - "@noble/curves": "^1.8.0", - "@solana/wallet-standard-chains": "^1.1.1", - "@solana/wallet-standard-features": "^1.3.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@solana/wallet-standard-wallet-adapter": { - "version": "1.1.4", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-standard-wallet-adapter-base": "^1.1.4", - "@solana/wallet-standard-wallet-adapter-react": "^1.1.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@solana/wallet-standard-wallet-adapter-react": { - "version": "1.1.4", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-standard-wallet-adapter-base": "^1.1.4", - "@wallet-standard/app": "^1.1.0", - "@wallet-standard/base": "^1.1.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/wallet-adapter-base": "*", - "react": "*" - } - }, - "node_modules/@solana/wallet-standard-wallet-adapter-react/node_modules/@solana/wallet-standard-wallet-adapter-base": { - "version": "1.1.4", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.23", - "@solana/wallet-standard-chains": "^1.1.1", - "@solana/wallet-standard-features": "^1.3.0", - "@solana/wallet-standard-util": "^1.1.2", - "@wallet-standard/app": "^1.1.0", - "@wallet-standard/base": "^1.1.0", - "@wallet-standard/features": "^1.1.0", - "@wallet-standard/wallet": "^1.1.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0", - "bs58": "^6.0.0" - } - }, - "node_modules/@solana/wallet-standard-wallet-adapter/node_modules/@solana/wallet-standard-wallet-adapter-base": { - "version": "1.1.4", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-adapter-base": "^0.9.23", - "@solana/wallet-standard-chains": "^1.1.1", - "@solana/wallet-standard-features": "^1.3.0", - "@solana/wallet-standard-util": "^1.1.2", - "@wallet-standard/app": "^1.1.0", - "@wallet-standard/base": "^1.1.0", - "@wallet-standard/features": "^1.1.0", - "@wallet-standard/wallet": "^1.1.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.98.0", - "bs58": "^6.0.0" - } - }, - "node_modules/@solana/web3.js": { - "version": "1.98.4", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.0", - "@noble/curves": "^1.4.2", - "@noble/hashes": "^1.4.0", - "@solana/buffer-layout": "^4.0.1", - "@solana/codecs-numbers": "^2.1.0", - "agentkeepalive": "^4.5.0", - "bn.js": "^5.2.1", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.1", - "node-fetch": "^2.7.0", - "rpc-websockets": "^9.0.2", - "superstruct": "^2.0.2" - } - }, - "node_modules/@solana/web3.js/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/web3.js/node_modules/@solana/codecs-numbers": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/web3.js/node_modules/@solana/errors": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@solana/web3.js/node_modules/superstruct": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@solflare-wallet/metamask-sdk": { - "version": "1.0.3", - "license": "Apache-2.0", - "dependencies": { - "@solana/wallet-standard-features": "^1.1.0", - "@wallet-standard/base": "^1.0.1", - "bs58": "^5.0.0", - "eventemitter3": "^5.0.1", - "uuid": "^9.0.0" - }, - "peerDependencies": { - "@solana/web3.js": "*" - } - }, - "node_modules/@solflare-wallet/metamask-sdk/node_modules/base-x": { - "version": "4.0.1", - "license": "MIT" - }, - "node_modules/@solflare-wallet/metamask-sdk/node_modules/bs58": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^4.0.0" - } - }, - "node_modules/@solflare-wallet/metamask-sdk/node_modules/eventemitter3": { - "version": "5.0.4", - "license": "MIT" - }, - "node_modules/@solflare-wallet/metamask-sdk/node_modules/uuid": { - "version": "9.0.1", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@solflare-wallet/sdk": { - "version": "1.4.2", - "license": "Apache-2.0", - "dependencies": { - "bs58": "^5.0.0", - "eventemitter3": "^5.0.1", - "uuid": "^9.0.0" - }, - "peerDependencies": { - "@solana/web3.js": "*" - } - }, - "node_modules/@solflare-wallet/sdk/node_modules/base-x": { - "version": "4.0.1", - "license": "MIT" - }, - "node_modules/@solflare-wallet/sdk/node_modules/bs58": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^4.0.0" - } - }, - "node_modules/@solflare-wallet/sdk/node_modules/eventemitter3": { - "version": "5.0.4", - "license": "MIT" - }, - "node_modules/@solflare-wallet/sdk/node_modules/uuid": { - "version": "9.0.1", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@speed-highlight/core": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.14.tgz", - "integrity": "sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==", - "license": "CC0-1.0" - }, - "node_modules/@sqds/multisig": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@sqds/multisig/-/multisig-2.1.4.tgz", - "integrity": "sha512-5w+NmwHOzl96nI50R/fjSD6uFydRLNUquhoEmmWbGepS4D9DnQyF2TKcUBfTyxV3sgJt00ypBt7SXB3y8WOzUQ==", - "license": "MIT", - "dependencies": { - "@metaplex-foundation/beet": "0.7.1", - "@metaplex-foundation/beet-solana": "0.4.0", - "@metaplex-foundation/cusper": "^0.0.2", - "@solana/spl-token": "^0.3.6", - "@solana/web3.js": "^1.70.3", - "@types/bn.js": "^5.1.1", - "assert": "^2.0.0", - "bn.js": "^5.2.1", - "buffer": "6.0.3", - "invariant": "2.2.4" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@sqds/multisig/node_modules/@solana/spl-token": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.11.tgz", - "integrity": "sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==", - "license": "Apache-2.0", - "dependencies": { - "@solana/buffer-layout": "^4.0.0", - "@solana/buffer-layout-utils": "^0.2.0", - "@solana/spl-token-metadata": "^0.1.2", - "buffer": "^6.0.3" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.88.0" - } - }, - "node_modules/@sqds/sdk": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@sqds/sdk/-/sdk-2.0.4.tgz", - "integrity": "sha512-SmwqL55GW9teIPRqYBVUp1tNp3Tfd8olPShas/+5L48XaUHBDEFNuDA9E8KKbIZoB34WSLdgyq0tIJLlhMMHnA==", - "license": "AGPL-3.0-or-later", - "dependencies": { - "@coral-xyz/anchor": "^0.26.0", - "@solana/web3.js": "^1.73.2", - "bn.js": "^5.2.1" - } - }, - "node_modules/@sqds/sdk/node_modules/@coral-xyz/anchor": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.26.0.tgz", - "integrity": "sha512-PxRl+wu5YyptWiR9F2MBHOLLibm87Z4IMUBPreX+DYBtPM+xggvcPi0KAN7+kIL4IrIhXI8ma5V0MCXxSN1pHg==", - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "@coral-xyz/borsh": "^0.26.0", - "@solana/web3.js": "^1.68.0", - "base64-js": "^1.5.1", - "bn.js": "^5.1.2", - "bs58": "^4.0.1", - "buffer-layout": "^1.2.2", - "camelcase": "^6.3.0", - "cross-fetch": "^3.1.5", - "crypto-hash": "^1.3.0", - "eventemitter3": "^4.0.7", - "js-sha256": "^0.9.0", - "pako": "^2.0.3", - "snake-case": "^3.0.4", - "superstruct": "^0.15.4", - "toml": "^3.0.0" - }, - "engines": { - "node": ">=11" - } - }, - "node_modules/@sqds/sdk/node_modules/@coral-xyz/borsh": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.26.0.tgz", - "integrity": "sha512-uCZ0xus0CszQPHYfWAqKS5swS1UxvePu83oOF+TWpUkedsNlg6p2p4azxZNSSqwXb9uXMFgxhuMBX9r3Xoi0vQ==", - "license": "Apache-2.0", - "dependencies": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@solana/web3.js": "^1.68.0" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/@standard-schema/utils": { - "version": "0.3.0", - "license": "MIT" - }, - "node_modules/@stellar/js-xdr": { - "version": "3.1.2", - "license": "Apache-2.0" - }, - "node_modules/@stellar/stellar-base": { - "version": "14.0.4", - "license": "Apache-2.0", - "dependencies": { - "@noble/curves": "^1.9.6", - "@stellar/js-xdr": "^3.1.2", - "base32.js": "^0.1.0", - "bignumber.js": "^9.3.1", - "buffer": "^6.0.3", - "sha.js": "^2.4.12" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@stellar/stellar-sdk": { - "version": "14.2.0", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@stellar/stellar-base": "^14.0.1", - "axios": "^1.12.2", - "bignumber.js": "^9.3.1", - "eventsource": "^2.0.2", - "feaxios": "^0.0.23", - "randombytes": "^2.1.0", - "toml": "^3.0.0", - "urijs": "^1.19.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@swc/helpers": { - "version": "0.5.15", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@tanstack/query-core": { - "version": "5.90.20", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.90.20", - "license": "MIT", - "dependencies": { - "@tanstack/query-core": "5.90.20" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/@testing-library/dom/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@testing-library/dom/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", - "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "picocolors": "^1.1.1", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/react": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", - "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0 || ^19.0.0", - "@types/react-dom": "^18.0.0 || ^19.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@toruslabs/base-controllers": { - "version": "5.11.0", - "license": "ISC", - "dependencies": { - "@ethereumjs/util": "^9.0.3", - "@toruslabs/broadcast-channel": "^10.0.2", - "@toruslabs/http-helpers": "^6.1.1", - "@toruslabs/openlogin-jrpc": "^8.3.0", - "@toruslabs/openlogin-utils": "^8.2.1", - "async-mutex": "^0.5.0", - "bignumber.js": "^9.1.2", - "bowser": "^2.11.0", - "jwt-decode": "^4.0.0", - "loglevel": "^1.9.1" - }, - "engines": { - "node": ">=18.x", - "npm": ">=9.x" - }, - "peerDependencies": { - "@babel/runtime": "7.x" - } - }, - "node_modules/@toruslabs/broadcast-channel": { - "version": "10.0.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.0", - "@toruslabs/eccrypto": "^4.0.0", - "@toruslabs/metadata-helpers": "^5.1.0", - "loglevel": "^1.9.1", - "oblivious-set": "1.4.0", - "socket.io-client": "^4.7.5", - "unload": "^2.4.1" - }, - "engines": { - "node": ">=18.x", - "npm": ">=9.x" - } - }, - "node_modules/@toruslabs/constants": { - "version": "13.4.0", - "license": "MIT", - "engines": { - "node": ">=18.x", - "npm": ">=9.x" - }, - "peerDependencies": { - "@babel/runtime": "7.x" - } - }, - "node_modules/@toruslabs/eccrypto": { - "version": "4.0.0", - "license": "CC0-1.0", - "dependencies": { - "elliptic": "^6.5.4" - }, - "engines": { - "node": ">=18.x", - "npm": ">=9.x" - } - }, - "node_modules/@toruslabs/http-helpers": { - "version": "6.1.1", - "license": "MIT", - "dependencies": { - "lodash.merge": "^4.6.2", - "loglevel": "^1.9.1" - }, - "engines": { - "node": ">=18.x", - "npm": ">=9.x" - }, - "peerDependencies": { - "@babel/runtime": "^7.x", - "@sentry/types": "^7.x" - }, - "peerDependenciesMeta": { - "@sentry/types": { - "optional": true - } - } - }, - "node_modules/@toruslabs/metadata-helpers": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "@toruslabs/eccrypto": "^4.0.0", - "@toruslabs/http-helpers": "^6.1.0", - "elliptic": "^6.5.5", - "ethereum-cryptography": "^2.1.3", - "json-stable-stringify": "^1.1.1" - }, - "engines": { - "node": ">=18.x", - "npm": ">=9.x" - }, - "peerDependencies": { - "@babel/runtime": "7.x" - } - }, - "node_modules/@toruslabs/openlogin-jrpc": { - "version": "8.3.0", - "license": "ISC", - "dependencies": { - "end-of-stream": "^1.4.4", - "events": "^3.3.0", - "fast-safe-stringify": "^2.1.1", - "once": "^1.4.0", - "pump": "^3.0.0", - "readable-stream": "^4.5.2" - }, - "engines": { - "node": ">=18.x", - "npm": ">=9.x" - }, - "peerDependencies": { - "@babel/runtime": "7.x" - } - }, - "node_modules/@toruslabs/openlogin-utils": { - "version": "8.2.1", - "license": "ISC", - "dependencies": { - "@toruslabs/constants": "^13.2.0", - "base64url": "^3.0.1", - "color": "^4.2.3" - }, - "engines": { - "node": ">=18.x", - "npm": ">=9.x" - }, - "peerDependencies": { - "@babel/runtime": "7.x" - } - }, - "node_modules/@toruslabs/solana-embed": { - "version": "2.1.0", - "license": "ISC", - "dependencies": { - "@solana/web3.js": "^1.91.4", - "@toruslabs/base-controllers": "^5.5.5", - "@toruslabs/http-helpers": "^6.1.1", - "@toruslabs/openlogin-jrpc": "^8.1.1", - "eth-rpc-errors": "^4.0.3", - "fast-deep-equal": "^3.1.3", - "lodash-es": "^4.17.21", - "loglevel": "^1.9.1", - "pump": "^3.0.0" - }, - "engines": { - "node": ">=18.x", - "npm": ">=9.x" - }, - "peerDependencies": { - "@babel/runtime": "7.x" - } - }, - "node_modules/@trezor/analytics": { - "version": "1.5.0", - "license": "See LICENSE.md in repo root", - "dependencies": { - "@trezor/env-utils": "1.5.0", - "@trezor/utils": "9.5.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/blockchain-link": { - "version": "2.6.1", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "@solana-program/compute-budget": "^0.8.0", - "@solana-program/stake": "^0.2.1", - "@solana-program/token": "^0.5.1", - "@solana-program/token-2022": "^0.4.2", - "@solana/kit": "^2.3.0", - "@solana/rpc-types": "^2.3.0", - "@stellar/stellar-sdk": "14.2.0", - "@trezor/blockchain-link-types": "1.5.0", - "@trezor/blockchain-link-utils": "1.5.1", - "@trezor/env-utils": "1.5.0", - "@trezor/utils": "9.5.0", - "@trezor/utxo-lib": "2.5.0", - "@trezor/websocket-client": "1.3.0", - "@types/web": "^0.0.197", - "crypto-browserify": "3.12.0", - "socks-proxy-agent": "8.0.5", - "stream-browserify": "^3.0.0", - "xrpl": "4.4.3" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/blockchain-link-types": { - "version": "1.5.0", - "license": "See LICENSE.md in repo root", - "dependencies": { - "@trezor/utils": "9.5.0", - "@trezor/utxo-lib": "2.5.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/blockchain-link-utils": { - "version": "1.5.1", - "license": "See LICENSE.md in repo root", - "dependencies": { - "@mobily/ts-belt": "^3.13.1", - "@stellar/stellar-sdk": "14.2.0", - "@trezor/env-utils": "1.5.0", - "@trezor/protobuf": "1.5.1", - "@trezor/utils": "9.5.0", - "xrpl": "4.4.3" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/crypto-browserify": { - "version": "3.12.0", - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@trezor/connect": { - "version": "9.7.1", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "@ethereumjs/common": "^10.1.0", - "@ethereumjs/tx": "^10.1.0", - "@fivebinaries/coin-selection": "3.0.0", - "@mobily/ts-belt": "^3.13.1", - "@noble/hashes": "^1.6.1", - "@scure/bip39": "^1.5.1", - "@solana-program/compute-budget": "^0.8.0", - "@solana-program/system": "^0.7.0", - "@solana-program/token": "^0.5.1", - "@solana-program/token-2022": "^0.4.2", - "@solana/kit": "^2.3.0", - "@trezor/blockchain-link": "2.6.1", - "@trezor/blockchain-link-types": "1.5.0", - "@trezor/blockchain-link-utils": "1.5.1", - "@trezor/connect-analytics": "1.4.0", - "@trezor/connect-common": "0.5.0", - "@trezor/crypto-utils": "1.2.0", - "@trezor/device-authenticity": "1.1.1", - "@trezor/device-utils": "1.2.0", - "@trezor/env-utils": "^1.5.0", - "@trezor/protobuf": "1.5.1", - "@trezor/protocol": "1.3.0", - "@trezor/schema-utils": "1.4.0", - "@trezor/transport": "1.6.1", - "@trezor/type-utils": "1.2.0", - "@trezor/utils": "9.5.0", - "@trezor/utxo-lib": "2.5.0", - "blakejs": "^1.2.1", - "bs58": "^6.0.0", - "bs58check": "^4.0.0", - "cbor": "^10.0.10", - "cross-fetch": "^4.0.0", - "jws": "^4.0.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-analytics": { - "version": "1.4.0", - "license": "See LICENSE.md in repo root", - "dependencies": { - "@trezor/analytics": "1.5.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-common": { - "version": "0.5.0", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "@trezor/env-utils": "1.5.0", - "@trezor/type-utils": "1.2.0", - "@trezor/utils": "9.5.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-web": { - "version": "9.7.1", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "@trezor/connect": "9.7.1", - "@trezor/connect-common": "0.5.0", - "@trezor/utils": "9.5.0", - "@trezor/websocket-client": "1.3.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect/node_modules/base-x": { - "version": "5.0.1", - "license": "MIT" - }, - "node_modules/@trezor/connect/node_modules/bs58": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^5.0.0" - } - }, - "node_modules/@trezor/crypto-utils": { - "version": "1.2.0", - "license": "SEE LICENSE IN LICENSE.md", - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/device-authenticity": { - "version": "1.1.1", - "license": "See LICENSE.md in repo root", - "dependencies": { - "@noble/curves": "^2.0.1", - "@trezor/crypto-utils": "1.2.0", - "@trezor/protobuf": "1.5.1", - "@trezor/schema-utils": "1.4.0", - "@trezor/utils": "9.5.0" - } - }, - "node_modules/@trezor/device-utils": { - "version": "1.2.0", - "license": "See LICENSE.md in repo root" - }, - "node_modules/@trezor/env-utils": { - "version": "1.5.0", - "license": "See LICENSE.md in repo root", - "dependencies": { - "ua-parser-js": "^2.0.4" - }, - "peerDependencies": { - "expo-constants": "*", - "expo-localization": "*", - "react-native": "*", - "tslib": "^2.6.2" - }, - "peerDependenciesMeta": { - "expo-constants": { - "optional": true - }, - "expo-localization": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@trezor/protobuf": { - "version": "1.5.1", - "license": "See LICENSE.md in repo root", - "dependencies": { - "@trezor/schema-utils": "1.4.0", - "long": "5.2.5", - "protobufjs": "7.4.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/protocol": { - "version": "1.3.0", - "license": "See LICENSE.md in repo root", - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/schema-utils": { - "version": "1.4.0", - "license": "See LICENSE.md in repo root", - "dependencies": { - "@sinclair/typebox": "^0.33.7", - "ts-mixer": "^6.0.3" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/transport": { - "version": "1.6.1", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "@trezor/protobuf": "1.5.1", - "@trezor/protocol": "1.3.0", - "@trezor/type-utils": "1.2.0", - "@trezor/utils": "9.5.0", - "cross-fetch": "^4.0.0", - "usb": "^2.15.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/type-utils": { - "version": "1.2.0", - "license": "See LICENSE.md in repo root" - }, - "node_modules/@trezor/utils": { - "version": "9.5.0", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "bignumber.js": "^9.3.1" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/utxo-lib": { - "version": "2.5.0", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "@trezor/utils": "9.5.0", - "bech32": "^2.0.0", - "bip66": "^2.0.0", - "bitcoin-ops": "^1.4.1", - "blake-hash": "^2.0.0", - "blakejs": "^1.2.1", - "bn.js": "^5.2.2", - "bs58": "^6.0.0", - "bs58check": "^4.0.0", - "cashaddrjs": "0.4.4", - "create-hmac": "^1.1.7", - "int64-buffer": "^1.1.0", - "pushdata-bitcoin": "^1.0.1", - "tiny-secp256k1": "^1.1.7", - "typeforce": "^1.18.0", - "varuint-bitcoin": "2.0.0", - "wif": "^5.0.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/utxo-lib/node_modules/base-x": { - "version": "5.0.1", - "license": "MIT" - }, - "node_modules/@trezor/utxo-lib/node_modules/bs58": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^5.0.0" - } - }, - "node_modules/@trezor/websocket-client": { - "version": "1.3.0", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "@trezor/utils": "9.5.0", - "ws": "^8.18.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/websocket-client/node_modules/ws": { - "version": "8.19.0", - "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/@tsconfig/node18": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-1.0.3.tgz", - "integrity": "sha512-RbwvSJQsuN9TB04AQbGULYfOGE/RnSFk/FLQ5b0NmDf5Kx2q/lABZbHQPKCO1vZ6Fiwkplu+yb9pGdLy1iGseQ==", - "license": "MIT" - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-cAw/jKBzo98m6Xz1X5ETqymWfIMbXbu6nK15W4LQYjeHJkVqSmM5PO8Bd9KVHQJ/F4rHcSso9LcjtgCW6TGu2w==", - "deprecated": "This is a stub types definition. bs58 provides its own type definitions, so you do not need this installed.", - "dev": true, - "license": "MIT", - "dependencies": { - "bs58": "*" - } - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.2", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-shape": { - "version": "3.1.8", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "license": "MIT" - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "license": "MIT", - "peer": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.30", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.4" - } - }, - "node_modules/@types/react": { - "version": "19.2.9", - "devOptional": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.3", - "devOptional": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "license": "MIT", - "peer": true - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "license": "MIT" - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.6", - "license": "MIT" - }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "license": "MIT" - }, - "node_modules/@types/w3c-web-usb": { - "version": "1.0.13", - "license": "MIT" - }, - "node_modules/@types/web": { - "version": "0.0.197", - "license": "Apache-2.0" - }, - "node_modules/@types/ws": { - "version": "7.4.7", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "license": "MIT", - "peer": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.53.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/type-utils": "8.53.1", - "@typescript-eslint/utils": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.53.1", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.53.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.53.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.53.1", - "@typescript-eslint/types": "^8.53.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.53.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.53.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.53.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/utils": "8.53.1", - "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.53.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.53.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.53.1", - "@typescript-eslint/tsconfig-utils": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", - "debug": "^4.4.3", - "minimatch": "^9.0.5", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.53.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.53.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.53.1", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@vitest/expect": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", - "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", - "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.18", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", - "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", - "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.18", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", - "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.18", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", - "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", - "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.18", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@wallet-standard/app": { - "version": "1.1.0", - "license": "Apache-2.0", - "dependencies": { - "@wallet-standard/base": "^1.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wallet-standard/base": { - "version": "1.1.0", - "license": "Apache-2.0", - "engines": { - "node": ">=16" - } - }, - "node_modules/@wallet-standard/core": { - "version": "1.1.1", - "license": "Apache-2.0", - "dependencies": { - "@wallet-standard/app": "^1.1.0", - "@wallet-standard/base": "^1.1.0", - "@wallet-standard/errors": "^0.1.1", - "@wallet-standard/features": "^1.1.0", - "@wallet-standard/wallet": "^1.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wallet-standard/errors": { - "version": "0.1.1", - "license": "Apache-2.0", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^13.1.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wallet-standard/errors/node_modules/commander": { - "version": "13.1.0", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@wallet-standard/features": { - "version": "1.1.0", - "license": "Apache-2.0", - "dependencies": { - "@wallet-standard/base": "^1.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wallet-standard/wallet": { - "version": "1.1.0", - "license": "Apache-2.0", - "dependencies": { - "@wallet-standard/base": "^1.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@walletconnect/core": { - "version": "2.19.0", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/jsonrpc-ws-connection": "1.0.16", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.1.0", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.19.0", - "@walletconnect/utils": "2.19.0", - "@walletconnect/window-getters": "1.0.1", - "events": "3.3.0", - "lodash.isequal": "4.5.0", - "uint8arrays": "3.1.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@walletconnect/core/node_modules/@walletconnect/types": { - "version": "2.19.0", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "events": "3.3.0" - } - }, - "node_modules/@walletconnect/environment": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/environment/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/@walletconnect/events": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "keyvaluestorage-interface": "^1.0.0", - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/events/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/@walletconnect/heartbeat": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "@walletconnect/events": "^1.0.1", - "@walletconnect/time": "^1.0.2", - "events": "^3.3.0" - } - }, - "node_modules/@walletconnect/jsonrpc-http-connection": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "@walletconnect/jsonrpc-utils": "^1.0.6", - "@walletconnect/safe-json": "^1.0.1", - "cross-fetch": "^3.1.4", - "events": "^3.3.0" - } - }, - "node_modules/@walletconnect/jsonrpc-provider": { - "version": "1.0.14", - "license": "MIT", - "dependencies": { - "@walletconnect/jsonrpc-utils": "^1.0.8", - "@walletconnect/safe-json": "^1.0.2", - "events": "^3.3.0" - } - }, - "node_modules/@walletconnect/jsonrpc-types": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "events": "^3.3.0", - "keyvaluestorage-interface": "^1.0.0" - } - }, - "node_modules/@walletconnect/jsonrpc-utils": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "@walletconnect/environment": "^1.0.1", - "@walletconnect/jsonrpc-types": "^1.0.3", - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/jsonrpc-utils/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/@walletconnect/jsonrpc-ws-connection": { - "version": "1.0.16", - "license": "MIT", - "dependencies": { - "@walletconnect/jsonrpc-utils": "^1.0.6", - "@walletconnect/safe-json": "^1.0.2", - "events": "^3.3.0", - "ws": "^7.5.1" - } - }, - "node_modules/@walletconnect/keyvaluestorage": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "@walletconnect/safe-json": "^1.0.1", - "idb-keyval": "^6.2.1", - "unstorage": "^1.9.0" - }, - "peerDependencies": { - "@react-native-async-storage/async-storage": "1.x" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "node_modules/@walletconnect/logger": { - "version": "2.1.2", - "license": "MIT", - "dependencies": { - "@walletconnect/safe-json": "^1.0.2", - "pino": "7.11.0" - } - }, - "node_modules/@walletconnect/relay-api": { - "version": "1.0.11", - "license": "MIT", - "dependencies": { - "@walletconnect/jsonrpc-types": "^1.0.2" - } - }, - "node_modules/@walletconnect/relay-auth": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@noble/curves": "1.8.0", - "@noble/hashes": "1.7.0", - "@walletconnect/safe-json": "^1.0.1", - "@walletconnect/time": "^1.0.2", - "uint8arrays": "^3.0.0" - } - }, - "node_modules/@walletconnect/relay-auth/node_modules/@noble/curves": { - "version": "1.8.0", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.7.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@walletconnect/relay-auth/node_modules/@noble/hashes": { - "version": "1.7.0", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@walletconnect/safe-json": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/safe-json/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/@walletconnect/sign-client": { - "version": "2.19.0", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/core": "2.19.0", - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/logger": "2.1.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.19.0", - "@walletconnect/utils": "2.19.0", - "events": "3.3.0" - } - }, - "node_modules/@walletconnect/sign-client/node_modules/@walletconnect/types": { - "version": "2.19.0", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "events": "3.3.0" - } - }, - "node_modules/@walletconnect/solana-adapter": { - "version": "0.0.8", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit": "1.7.2", - "@walletconnect/universal-provider": "2.19.0", - "@walletconnect/utils": "2.19.0", - "bs58": "6.0.0" - }, - "peerDependencies": { - "@solana/wallet-adapter-base": "0.x", - "@solana/web3.js": "1.x" - } - }, - "node_modules/@walletconnect/solana-adapter/node_modules/base-x": { - "version": "5.0.1", - "license": "MIT" - }, - "node_modules/@walletconnect/solana-adapter/node_modules/bs58": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^5.0.0" - } - }, - "node_modules/@walletconnect/time": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/time/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/@walletconnect/types": { - "version": "2.19.1", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "events": "3.3.0" - } - }, - "node_modules/@walletconnect/universal-provider": { - "version": "2.19.0", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/jsonrpc-http-connection": "1.0.8", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "@walletconnect/sign-client": "2.19.0", - "@walletconnect/types": "2.19.0", - "@walletconnect/utils": "2.19.0", - "events": "3.3.0", - "lodash": "4.17.21" - } - }, - "node_modules/@walletconnect/universal-provider/node_modules/@walletconnect/types": { - "version": "2.19.0", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "events": "3.3.0" - } - }, - "node_modules/@walletconnect/utils": { - "version": "2.19.0", - "license": "Apache-2.0", - "dependencies": { - "@noble/ciphers": "1.2.1", - "@noble/curves": "1.8.1", - "@noble/hashes": "1.7.1", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.1.0", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.19.0", - "@walletconnect/window-getters": "1.0.1", - "@walletconnect/window-metadata": "1.0.1", - "detect-browser": "5.3.0", - "elliptic": "6.6.1", - "query-string": "7.1.3", - "uint8arrays": "3.1.0", - "viem": "2.23.2" - } - }, - "node_modules/@walletconnect/utils/node_modules/@noble/curves": { - "version": "1.8.1", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.7.1" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@walletconnect/utils/node_modules/@noble/hashes": { - "version": "1.7.1", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@walletconnect/utils/node_modules/@walletconnect/types": { - "version": "2.19.0", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "events": "3.3.0" - } - }, - "node_modules/@walletconnect/window-getters": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/window-getters/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/@walletconnect/window-metadata": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "@walletconnect/window-getters": "^1.0.1", - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/window-metadata/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/@xrplf/isomorphic": { - "version": "1.0.1", - "license": "ISC", - "dependencies": { - "@noble/hashes": "^1.0.0", - "eventemitter3": "5.0.1", - "ws": "^8.13.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@xrplf/isomorphic/node_modules/eventemitter3": { - "version": "5.0.1", - "license": "MIT" - }, - "node_modules/@xrplf/isomorphic/node_modules/ws": { - "version": "8.19.0", - "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/@xrplf/secret-numbers": { - "version": "2.0.0", - "license": "ISC", - "dependencies": { - "@xrplf/isomorphic": "^1.0.1", - "ripple-keypairs": "^2.0.0" - } - }, - "node_modules/abitype": { - "version": "1.2.3", - "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/abort-controller": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "license": "MIT", - "peer": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/admin": { - "resolved": "apps/admin", - "link": true - }, - "node_modules/agent-base": { - "version": "7.1.4", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "license": "MIT", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/anser": { - "version": "1.4.10", - "license": "MIT", - "peer": true - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "license": "MIT" - }, - "node_modules/any-promise": { - "version": "1.3.0", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aria-query": { - "version": "5.3.2", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.9", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-timsort": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", - "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", - "license": "MIT" - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "license": "MIT", - "peer": true - }, - "node_modules/asn1.js": { - "version": "4.10.1", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.2", - "license": "MIT" - }, - "node_modules/assert": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "dev": true, - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "license": "MIT", - "peer": true - }, - "node_modules/async-mutex": { - "version": "0.5.0", - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.23", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001760", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws4fetch": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/aws4fetch/-/aws4fetch-1.0.20.tgz", - "integrity": "sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g==", - "license": "MIT" - }, - "node_modules/axe-core": { - "version": "4.11.1", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "1.13.4", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.28.1", - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-parser": "0.28.1" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "license": "MIT", - "peer": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/base-x": { - "version": "3.0.11", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/base32.js": { - "version": "0.1.0", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "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/base64url": { - "version": "3.0.1", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.17", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/bech32": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/big-integer": { - "version": "1.6.36", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/big.js": { - "version": "6.2.2", - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bigjs" - } - }, - "node_modules/bigint-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", - "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "bindings": "^1.3.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/bignumber.js": { - "version": "9.3.1", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "license": "MIT", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bip66": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/bitcoin-ops": { - "version": "1.4.1", - "license": "MIT" - }, - "node_modules/blake-hash": { - "version": "2.0.0", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/blake-hash/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/blake3-wasm": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", - "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", - "license": "MIT" - }, - "node_modules/blakejs": { - "version": "1.2.1", - "license": "MIT" - }, - "node_modules/bn.js": { - "version": "5.2.2", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/borsh": { - "version": "0.7.0", - "license": "Apache-2.0", - "dependencies": { - "bn.js": "^5.2.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" - } - }, - "node_modules/bowser": { - "version": "2.13.1", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.1", - "license": "MIT", - "dependencies": { - "bn.js": "^5.2.1", - "randombytes": "^2.1.0", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.5", - "license": "ISC", - "dependencies": { - "bn.js": "^5.2.2", - "browserify-rsa": "^4.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.6.1", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.9", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-sign/node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "2.3.8", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/browserify-sign/node_modules/string_decoder": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/browserslist": { - "version": "4.28.1", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs58": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/bs58check": { - "version": "2.1.2", - "license": "MIT", - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "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/buffer-equal-constant-time": { - "version": "1.0.1", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "license": "MIT" - }, - "node_modules/buffer-layout": { - "version": "1.2.2", - "license": "MIT", - "engines": { - "node": ">=4.5" - } - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001765", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/cashaddrjs": { - "version": "0.4.4", - "license": "MIT", - "dependencies": { - "big-integer": "1.6.36" - } - }, - "node_modules/cbor": { - "version": "10.0.11", - "license": "MIT", - "dependencies": { - "nofilter": "^3.0.2" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cbor-sync": { - "version": "1.0.4", - "license": "MIT" - }, - "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/chromium-edge-launcher": { - "version": "0.2.0", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cipher-base": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/class-variance-authority": { - "version": "0.7.1", - "license": "Apache-2.0", - "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/cliui": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/cloudflare": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/cloudflare/-/cloudflare-4.5.0.tgz", - "integrity": "sha512-fPcbPKx4zF45jBvQ0z7PCdgejVAPBBCZxwqk1k7krQNfpM07Cfj97/Q6wBzvYqlWXx/zt1S9+m8vnfCe06umbQ==", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - } - }, - "node_modules/cloudflare/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/cloudflare/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/clsx": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cmdk": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "^1.1.1", - "@radix-ui/react-dialog": "^1.1.6", - "@radix-ui/react-id": "^1.1.0", - "@radix-ui/react-primitive": "^2.0.2" - }, - "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", - "react-dom": "^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/color": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "14.0.1", - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/comment-json": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.6.2.tgz", - "integrity": "sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w==", - "license": "MIT", - "dependencies": { - "array-timsort": "^1.0.3", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/connect": { - "version": "3.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/cookie-es": { - "version": "1.2.2", - "license": "MIT" - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/crc": { - "version": "3.8.0", - "license": "MIT", - "dependencies": { - "buffer": "^5.1.0" - } - }, - "node_modules/crc/node_modules/buffer": { - "version": "5.7.1", - "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.1.13" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.2", - "license": "MIT" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/cross-fetch": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.7.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crossws": { - "version": "0.3.5", - "license": "MIT", - "dependencies": { - "uncrypto": "^0.1.3" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.1", - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.1", - "browserify-sign": "^4.2.3", - "create-ecdh": "^4.0.4", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "diffie-hellman": "^5.0.3", - "hash-base": "~3.0.4", - "inherits": "^2.0.4", - "pbkdf2": "^3.1.2", - "public-encrypt": "^4.0.3", - "randombytes": "^2.1.0", - "randomfill": "^1.0.4" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/crypto-hash": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-js": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssstyle": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-6.2.0.tgz", - "integrity": "sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^5.0.1", - "@csstools/css-syntax-patches-for-csstree": "^1.0.28", - "css-tree": "^3.1.0", - "lru-cache": "^11.2.6" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cssstyle/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "devOptional": true, - "license": "MIT" - }, - "node_modules/d3-array": { - "version": "3.2.4", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.2", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/data-urls": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", - "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/data-urls/node_modules/tr46": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", - "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", - "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", - "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.11.0", - "tr46": "^6.0.0", - "webidl-conversions": "^8.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/date-fns": { - "version": "4.1.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/date-fns-jalali": { - "version": "4.1.0-0", - "license": "MIT" - }, - "node_modules/dayjs": { - "version": "1.11.13", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true, - "license": "MIT" - }, - "node_modules/decimal.js-light": { - "version": "2.5.1", - "license": "MIT" - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/defu": { - "version": "6.1.4", - "license": "MIT" - }, - "node_modules/delay": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/derive-valtio": { - "version": "0.1.0", - "license": "MIT", - "peerDependencies": { - "valtio": "*" - } - }, - "node_modules/des.js": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destr": { - "version": "2.0.5", - "license": "MIT" - }, - "node_modules/destroy": { - "version": "1.2.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-browser": { - "version": "5.3.0", - "license": "MIT" - }, - "node_modules/detect-europe-js": { - "version": "0.1.2", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "license": "Apache-2.0" - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.2", - "license": "MIT" - }, - "node_modules/dijkstrajs": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/dlv": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/doctrine": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/dot-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dotenv": { - "version": "16.0.3", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/draggabilly": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "get-size": "^3.0.0", - "unidragger": "^3.0.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" - }, - "node_modules/duplexify": { - "version": "4.1.3", - "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/duplexify/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/eciesjs": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.18.tgz", - "integrity": "sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==", - "license": "MIT", - "dependencies": { - "@ecies/ciphers": "^0.2.5", - "@noble/ciphers": "^1.3.0", - "@noble/curves": "^1.9.7", - "@noble/hashes": "^1.8.0" - }, - "engines": { - "bun": ">=1", - "deno": ">=2", - "node": ">=16" - } - }, - "node_modules/eciesjs/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/ee-first": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.267", - "license": "ISC" - }, - "node_modules/elliptic": { - "version": "6.6.1", - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.2", - "license": "MIT" - }, - "node_modules/embla-carousel": { - "version": "8.6.0", - "license": "MIT" - }, - "node_modules/embla-carousel-react": { - "version": "8.6.0", - "license": "MIT", - "dependencies": { - "embla-carousel": "8.6.0", - "embla-carousel-reactive-utils": "8.6.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/embla-carousel-reactive-utils": { - "version": "8.6.0", - "license": "MIT", - "peerDependencies": { - "embla-carousel": "8.6.0" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/engine.io-client": { - "version": "6.6.4", - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.4.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.18.3", - "xmlhttprequest-ssl": "~2.1.1" - } - }, - "node_modules/engine.io-client/node_modules/ws": { - "version": "8.18.3", - "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/engine.io-parser": { - "version": "5.2.3", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "license": "MIT", - "peer": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "license": "MIT", - "peer": true, - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/error-stack-parser-es": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", - "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/es-abstract": { - "version": "1.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.1", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.1.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.3.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.5", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-toolkit": { - "version": "1.44.0", - "license": "MIT", - "workspaces": [ - "docs", - "benchmarks" - ] - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "license": "MIT" - }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "es6-promise": "^4.0.3" - } - }, - "node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.39.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-next": { - "version": "15.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@next/eslint-plugin-next": "15.5.4", - "@rushstack/eslint-patch": "^1.10.3", - "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-jsx-a11y": "^6.10.0", - "eslint-plugin-react": "^7.37.0", - "eslint-plugin-react-hooks": "^5.0.0" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-next/node_modules/@next/eslint-plugin-next": { - "version": "15.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "3.3.1" - } - }, - "node_modules/eslint-config-prettier": { - "version": "10.1.8", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "funding": { - "url": "https://opencollective.com/eslint-config-prettier" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.10.1", - "dev": true, - "license": "ISC", - "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.4.0", - "get-tsconfig": "^4.10.0", - "is-bun-module": "^2.0.0", - "stable-hash": "^0.0.5", - "tinyglobby": "^0.2.13", - "unrs-resolver": "^1.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-import-resolver-typescript" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.32.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.2", - "dev": true, - "license": "MIT", - "dependencies": { - "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.1" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-only-warn": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-turbo": { - "version": "2.7.5", - "dev": true, - "license": "MIT", - "dependencies": { - "dotenv": "16.0.3" - }, - "peerDependencies": { - "eslint": ">6.6.0", - "turbo": ">2.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eth-rpc-errors": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "fast-safe-stringify": "^2.0.6" - } - }, - "node_modules/ethereum-cryptography": { - "version": "2.2.1", - "license": "MIT", - "dependencies": { - "@noble/curves": "1.4.2", - "@noble/hashes": "1.4.0", - "@scure/bip32": "1.4.0", - "@scure/bip39": "1.3.0" - } - }, - "node_modules/ev-emitter": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/eventsource": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exenv": { - "version": "1.2.2", - "license": "BSD-3-Clause" - }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/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/express/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/eyes": { - "version": "0.1.8", - "engines": { - "node": "> 0.1.90" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-redact": { - "version": "3.5.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "license": "MIT" - }, - "node_modules/fast-stable-stringify": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/fast-xml-builder": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", - "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "path-expression-matcher": "^1.1.3" - } - }, - "node_modules/fast-xml-parser": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", - "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "fast-xml-builder": "^1.0.0", - "strnum": "^2.1.2" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastestsmallesttextencoderdecoder": { - "version": "1.0.22", - "license": "CC0-1.0", - "peer": true - }, - "node_modules/fastq": { - "version": "1.20.1", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/feaxios": { - "version": "0.0.23", - "license": "MIT", - "dependencies": { - "is-retry-allowed": "^3.0.0" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/filter-obj": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "dev": true, - "license": "ISC" - }, - "node_modules/flow-enums-runtime": { - "version": "0.0.6", - "license": "MIT", - "peer": true - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data-encoder": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", - "license": "MIT" - }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", - "license": "MIT", - "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" - }, - "engines": { - "node": ">= 12.20" - } - }, - "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/fraction.js": { - "version": "5.3.4", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-size": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.13.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "license": "ISC", - "peer": true - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/h3": { - "version": "1.15.5", - "license": "MIT", - "dependencies": { - "cookie-es": "^1.2.2", - "crossws": "^0.3.5", - "defu": "^6.1.4", - "destr": "^2.0.5", - "iron-webcrypto": "^1.2.1", - "node-mock-http": "^1.0.4", - "radix3": "^1.1.2", - "ufo": "^1.6.3", - "uncrypto": "^0.1.3" - } - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-base": { - "version": "3.0.5", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hermes-estree": { - "version": "0.28.1", - "license": "MIT", - "peer": true - }, - "node_modules/hermes-parser": { - "version": "0.28.1", - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-estree": "0.28.1" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", - "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.6.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/http-errors": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/idb-keyval": { - "version": "6.2.2", - "license": "Apache-2.0" - }, - "node_modules/ieee754": { - "version": "1.2.1", - "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/ignore": { - "version": "5.3.2", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "1.2.1", - "license": "MIT", - "peer": true, - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/immer": { - "version": "10.2.0", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", - "peer": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/input-otp": { - "version": "1.4.2", - "license": "MIT", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/int64-buffer": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ip-address": { - "version": "10.1.0", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "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/iron-webcrypto": { - "version": "1.2.1", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/brc-dd" - } - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "license": "MIT", - "peer": true - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bun-module": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.7.1" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "license": "MIT", - "peer": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-nan": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-retry-allowed": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-standalone-pwa": { - "version": "0.1.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "license": "MIT" - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "license": "MIT", - "peer": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/isomorphic-ws": { - "version": "4.0.1", - "license": "MIT", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/isows": { - "version": "1.0.7", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/jackspeak": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", - "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^9.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jayson": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "@types/connect": "^3.4.33", - "@types/node": "^12.12.54", - "@types/ws": "^7.4.4", - "commander": "^2.20.3", - "delay": "^5.0.0", - "es6-promisify": "^5.0.0", - "eyes": "^0.1.8", - "isomorphic-ws": "^4.0.1", - "json-stringify-safe": "^5.0.1", - "stream-json": "^1.9.1", - "uuid": "^8.3.2", - "ws": "^7.5.10" - }, - "bin": { - "jayson": "bin/jayson.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jayson/node_modules/@types/node": { - "version": "12.20.55", - "license": "MIT" - }, - "node_modules/jayson/node_modules/commander": { - "version": "2.20.3", - "license": "MIT" - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "license": "MIT", - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "license": "MIT", - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jiti": { - "version": "1.21.7", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/jotai": { - "version": "2.16.2", - "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0", - "@babel/template": ">=7.0.0", - "@types/react": ">=17.0.0", - "react": ">=17.0.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@babel/template": { - "optional": true - }, - "@types/react": { - "optional": true - }, - "react": { - "optional": true - } - } - }, - "node_modules/js-base64": { - "version": "3.7.8", - "license": "BSD-3-Clause" - }, - "node_modules/js-sha256": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", - "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", - "license": "MIT" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbi": { - "version": "3.2.5", - "license": "Apache-2.0" - }, - "node_modules/jsc-safe-url": { - "version": "0.2.4", - "license": "0BSD", - "peer": true - }, - "node_modules/jsdom": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-28.1.0.tgz", - "integrity": "sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@acemir/cssom": "^0.9.31", - "@asamuzakjp/dom-selector": "^6.8.1", - "@bramus/specificity": "^2.4.2", - "@exodus/bytes": "^1.11.0", - "cssstyle": "^6.0.1", - "data-urls": "^7.0.0", - "decimal.js": "^10.6.0", - "html-encoding-sniffer": "^6.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "is-potential-custom-element-name": "^1.0.1", - "parse5": "^8.0.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^6.0.0", - "undici": "^7.21.0", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^8.0.1", - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "canvas": "^3.0.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/tr46": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", - "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/jsdom/node_modules/webidl-conversions": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", - "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20" - } - }, - "node_modules/jsdom/node_modules/whatwg-url": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", - "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.11.0", - "tr46": "^6.0.0", - "webidl-conversions": "^8.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "license": "MIT", - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "license": "MIT", - "peer": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "isarray": "^2.0.5", - "jsonify": "^0.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "license": "ISC" - }, - "node_modules/json5": { - "version": "2.2.3", - "license": "MIT", - "peer": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonify": { - "version": "0.0.1", - "license": "Public Domain", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/jsqr": { - "version": "1.4.0", - "license": "Apache-2.0" - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/jwa": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwt-decode": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/keyvaluestorage-interface": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "dev": true, - "license": "MIT", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lighthouse-logger": { - "version": "1.4.2", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "license": "MIT" - }, - "node_modules/lit": { - "version": "3.1.0", - "license": "BSD-3-Clause", - "dependencies": { - "@lit/reactive-element": "^2.0.0", - "lit-element": "^4.0.0", - "lit-html": "^3.1.0" - } - }, - "node_modules/lit-element": { - "version": "4.2.2", - "license": "BSD-3-Clause", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.5.0", - "@lit/reactive-element": "^2.1.0", - "lit-html": "^3.3.0" - } - }, - "node_modules/lit-html": { - "version": "3.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "@types/trusted-types": "^2.0.2" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.23", - "license": "MIT" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "license": "MIT" - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "license": "MIT", - "peer": true - }, - "node_modules/loglevel": { - "version": "1.9.2", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/long": { - "version": "5.2.5", - "license": "Apache-2.0" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "license": "ISC", - "peer": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.548.0", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/marky": { - "version": "1.3.0", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/memoize-one": { - "version": "5.2.1", - "license": "MIT", - "peer": true - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-options": { - "version": "3.0.4", - "license": "MIT", - "optional": true, - "dependencies": { - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/metro": { - "version": "0.82.5", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "@babel/types": "^7.25.2", - "accepts": "^1.3.7", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "error-stack-parser": "^2.0.6", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.29.1", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.82.5", - "metro-cache": "0.82.5", - "metro-cache-key": "0.82.5", - "metro-config": "0.82.5", - "metro-core": "0.82.5", - "metro-file-map": "0.82.5", - "metro-resolver": "0.82.5", - "metro-runtime": "0.82.5", - "metro-source-map": "0.82.5", - "metro-symbolicate": "0.82.5", - "metro-transform-plugins": "0.82.5", - "metro-transform-worker": "0.82.5", - "mime-types": "^2.1.27", - "nullthrows": "^1.1.1", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "throat": "^5.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "bin": { - "metro": "src/cli.js" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-babel-transformer": { - "version": "0.82.5", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.29.1", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.29.1", - "license": "MIT", - "peer": true - }, - "node_modules/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.29.1", - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-estree": "0.29.1" - } - }, - "node_modules/metro-cache": { - "version": "0.82.5", - "license": "MIT", - "peer": true, - "dependencies": { - "exponential-backoff": "^3.1.1", - "flow-enums-runtime": "^0.0.6", - "https-proxy-agent": "^7.0.5", - "metro-core": "0.82.5" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-cache-key": { - "version": "0.82.5", - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-config": { - "version": "0.82.5", - "license": "MIT", - "peer": true, - "dependencies": { - "connect": "^3.6.5", - "cosmiconfig": "^5.0.5", - "flow-enums-runtime": "^0.0.6", - "jest-validate": "^29.7.0", - "metro": "0.82.5", - "metro-cache": "0.82.5", - "metro-core": "0.82.5", - "metro-runtime": "0.82.5" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-config/node_modules/argparse": { - "version": "1.0.10", - "license": "MIT", - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/metro-config/node_modules/cosmiconfig": { - "version": "5.2.1", - "license": "MIT", - "peer": true, - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/import-fresh": { - "version": "2.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/js-yaml": { - "version": "3.14.2", - "license": "MIT", - "peer": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/metro-config/node_modules/parse-json": { - "version": "4.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/resolve-from": { - "version": "3.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-core": { - "version": "0.82.5", - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.82.5" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-file-map": { - "version": "0.82.5", - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.4.0", - "fb-watchman": "^2.0.0", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-minify-terser": { - "version": "0.82.5", - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "terser": "^5.15.0" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-resolver": { - "version": "0.82.5", - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-runtime": { - "version": "0.82.5", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.25.0", - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-source-map": { - "version": "0.82.5", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.25.3", - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-symbolicate": "0.82.5", - "nullthrows": "^1.1.1", - "ob1": "0.82.5", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-symbolicate": { - "version": "0.82.5", - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-source-map": "0.82.5", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "bin": { - "metro-symbolicate": "src/index.js" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-transform-plugins": { - "version": "0.82.5", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "flow-enums-runtime": "^0.0.6", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-transform-worker": { - "version": "0.82.5", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "metro": "0.82.5", - "metro-babel-transformer": "0.82.5", - "metro-cache": "0.82.5", - "metro-cache-key": "0.82.5", - "metro-minify-terser": "0.82.5", - "metro-source-map": "0.82.5", - "metro-transform-plugins": "0.82.5", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/metro/node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/metro/node_modules/ci-info": { - "version": "2.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/metro/node_modules/cliui": { - "version": "8.0.1", - "license": "ISC", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/metro/node_modules/hermes-estree": { - "version": "0.29.1", - "license": "MIT", - "peer": true - }, - "node_modules/metro/node_modules/hermes-parser": { - "version": "0.29.1", - "license": "MIT", - "peer": true, - "dependencies": { - "hermes-estree": "0.29.1" - } - }, - "node_modules/metro/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/metro/node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", - "peer": true, - "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/metro/node_modules/y18n": { - "version": "5.0.8", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/metro/node_modules/yargs": { - "version": "17.7.2", - "license": "MIT", - "peer": true, - "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/metro/node_modules/yargs-parser": { - "version": "21.1.1", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.2", - "license": "MIT" - }, - "node_modules/mime": { - "version": "1.6.0", - "license": "MIT", - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/miniflare": { - "version": "4.20260312.1", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260312.1.tgz", - "integrity": "sha512-YSWxec9ssisqkQgaCgcIQxZlB41E9hMiq1nxUgxXHRrE9NsfyC6ptSt8yfgBobsKIseAVKLTB/iEDpMumBv8oA==", - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "0.8.1", - "sharp": "^0.34.5", - "undici": "7.18.2", - "workerd": "1.20260312.1", - "ws": "8.18.0", - "youch": "4.1.0-beta.10" - }, - "bin": { - "miniflare": "bootstrap.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/miniflare/node_modules/undici": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", - "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/miniflare/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "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/minimalistic-assert": { - "version": "1.0.1", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mnemonist": { - "version": "0.38.3", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz", - "integrity": "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==", - "license": "MIT", - "dependencies": { - "obliterator": "^1.6.1" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "license": "MIT" - }, - "node_modules/multiformats": { - "version": "9.9.0", - "license": "(Apache-2.0 AND MIT)" - }, - "node_modules/mz": { - "version": "2.7.0", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nan": { - "version": "2.25.0", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-postinstall": { - "version": "0.3.4", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/next": { - "version": "15.5.10", - "resolved": "https://registry.npmjs.org/next/-/next-15.5.10.tgz", - "integrity": "sha512-r0X65PNwyDDyOrWNKpQoZvOatw7BcsTPRKdwEqtc9cj3wv7mbBIk9tKed4klRaFXJdX0rugpuMTHslDrAU1bBg==", - "license": "MIT", - "dependencies": { - "@next/env": "15.5.10", - "@swc/helpers": "0.5.15", - "caniuse-lite": "^1.0.30001579", - "postcss": "8.4.31", - "styled-jsx": "5.1.6" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "15.5.7", - "@next/swc-darwin-x64": "15.5.7", - "@next/swc-linux-arm64-gnu": "15.5.7", - "@next/swc-linux-arm64-musl": "15.5.7", - "@next/swc-linux-x64-gnu": "15.5.7", - "@next/swc-linux-x64-musl": "15.5.7", - "@next/swc-win32-arm64-msvc": "15.5.7", - "@next/swc-win32-x64-msvc": "15.5.7", - "sharp": "^0.34.3" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.51.1", - "babel-plugin-react-compiler": "*", - "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next-themes": { - "version": "0.4.6", - "license": "MIT", - "peerDependencies": { - "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/no-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "license": "MIT" - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch-native": { - "version": "1.6.7", - "license": "MIT" - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "license": "MIT", - "peer": true - }, - "node_modules/node-mock-http": { - "version": "1.0.4", - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.27", - "license": "MIT" - }, - "node_modules/nofilter": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=12.19" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nullthrows": { - "version": "1.1.1", - "license": "MIT", - "peer": true - }, - "node_modules/ob1": { - "version": "0.82.5", - "license": "MIT", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-treeify": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", - "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.9", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obliterator": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", - "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==", - "license": "MIT" - }, - "node_modules/oblivious-set": { - "version": "1.4.0", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/ofetch": { - "version": "1.5.1", - "license": "MIT", - "dependencies": { - "destr": "^2.0.5", - "node-fetch-native": "^1.6.7", - "ufo": "^1.6.1" - } - }, - "node_modules/on-exit-leak-free": { - "version": "0.2.0", - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "7.4.2", - "license": "MIT", - "peer": true, - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ox": { - "version": "0.11.3", - "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/@noble/ciphers": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ox/node_modules/@noble/curves": { - "version": "1.9.1", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ox/node_modules/@scure/bip32": { - "version": "1.7.0", - "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/ox/node_modules/eventemitter3": { - "version": "5.0.1", - "license": "MIT" - }, - "node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/pako": { - "version": "2.1.0", - "license": "(MIT AND Zlib)" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.9", - "license": "ISC", - "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "pbkdf2": "^3.1.5", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", - "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-expression-matcher": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", - "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "license": "MIT" - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT" - }, - "node_modules/pbkdf2": { - "version": "3.1.5", - "license": "MIT", - "dependencies": { - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "ripemd160": "^2.0.3", - "safe-buffer": "^5.2.1", - "sha.js": "^2.4.12", - "to-buffer": "^1.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pino": { - "version": "7.11.0", - "license": "MIT", - "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.0.0", - "on-exit-leak-free": "^0.2.0", - "pino-abstract-transport": "v0.5.0", - "pino-std-serializers": "^4.0.0", - "process-warning": "^1.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.1.0", - "safe-stable-stringify": "^2.1.0", - "sonic-boom": "^2.2.1", - "thread-stream": "^0.15.1" - }, - "bin": { - "pino": "bin.js" - } - }, - "node_modules/pino-abstract-transport": { - "version": "0.5.0", - "license": "MIT", - "dependencies": { - "duplexify": "^4.1.2", - "split2": "^4.0.0" - } - }, - "node_modules/pino-std-serializers": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/pirates": { - "version": "4.0.7", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pngjs": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.1.0", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.8.1", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/react-is": { - "version": "18.3.1", - "license": "MIT", - "peer": true - }, - "node_modules/process": { - "version": "0.11.10", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/process-warning": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/promise": { - "version": "8.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/protobufjs": { - "version": "7.4.0", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-compare": { - "version": "2.6.0", - "license": "MIT" - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.2", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.3", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pushdata-bitcoin": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "bitcoin-ops": "^1.3.0" - } - }, - "node_modules/qr.js": { - "version": "0.0.0", - "license": "MIT" - }, - "node_modules/qrcode": { - "version": "1.5.4", - "license": "MIT", - "dependencies": { - "dijkstrajs": "^1.0.1", - "pngjs": "^5.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "qrcode": "bin/qrcode" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/qrcode.react": { - "version": "1.0.1", - "license": "ISC", - "dependencies": { - "loose-envify": "^1.4.0", - "prop-types": "^15.6.0", - "qr.js": "0.0.0" - }, - "peerDependencies": { - "react": "^15.5.3 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/query-string": { - "version": "7.1.3", - "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.2.2", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/queue": { - "version": "6.0.2", - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "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/quick-format-unescaped": { - "version": "4.0.4", - "license": "MIT" - }, - "node_modules/radix3": { - "version": "1.1.2", - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/react": { - "version": "19.2.3", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-day-picker": { - "version": "9.13.0", - "license": "MIT", - "dependencies": { - "@date-fns/tz": "^1.4.1", - "date-fns": "^4.1.0", - "date-fns-jalali": "^4.1.0-0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/gpbl" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/react-devtools-core": { - "version": "6.1.5", - "license": "MIT", - "peer": true, - "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" - } - }, - "node_modules/react-dom": { - "version": "19.2.3", - "license": "MIT", - "peer": true, - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.3" - } - }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.27.0", - "license": "MIT", - "peer": true - }, - "node_modules/react-hook-form": { - "version": "7.71.1", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18 || ^19" - } - }, - "node_modules/react-is": { - "version": "19.2.3", - "license": "MIT", - "peer": true - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "license": "MIT" - }, - "node_modules/react-modal": { - "version": "3.16.3", - "license": "MIT", - "dependencies": { - "exenv": "^1.2.0", - "prop-types": "^15.7.2", - "react-lifecycles-compat": "^3.0.0", - "warning": "^4.0.3" - }, - "peerDependencies": { - "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19", - "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19" - } - }, - "node_modules/react-native": { - "version": "0.80.2", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/create-cache-key-function": "^29.7.0", - "@react-native/assets-registry": "0.80.2", - "@react-native/codegen": "0.80.2", - "@react-native/community-cli-plugin": "0.80.2", - "@react-native/gradle-plugin": "0.80.2", - "@react-native/js-polyfills": "0.80.2", - "@react-native/normalize-colors": "0.80.2", - "@react-native/virtualized-lists": "0.80.2", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "0.28.1", - "base64-js": "^1.5.1", - "chalk": "^4.0.0", - "commander": "^12.0.0", - "flow-enums-runtime": "^0.0.6", - "glob": "^7.1.1", - "invariant": "^2.2.4", - "jest-environment-node": "^29.7.0", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.82.2", - "metro-source-map": "^0.82.2", - "nullthrows": "^1.1.1", - "pretty-format": "^29.7.0", - "promise": "^8.3.0", - "react-devtools-core": "^6.1.1", - "react-refresh": "^0.14.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.26.0", - "semver": "^7.1.3", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0", - "ws": "^6.2.3", - "yargs": "^17.6.2" - }, - "bin": { - "react-native": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^19.1.0", - "react": "^19.1.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-native/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/react-native/node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/react-native/node_modules/cliui": { - "version": "8.0.1", - "license": "ISC", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/react-native/node_modules/commander": { - "version": "12.1.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/react-native/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-native/node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", - "peer": true, - "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/react-native/node_modules/ws": { - "version": "6.2.3", - "license": "MIT", - "peer": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/react-native/node_modules/y18n": { - "version": "5.0.8", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-native/node_modules/yargs": { - "version": "17.7.2", - "license": "MIT", - "peer": true, - "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/react-native/node_modules/yargs-parser": { - "version": "21.1.1", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/react-qr-reader": { - "version": "2.2.1", - "license": "MIT", - "dependencies": { - "jsqr": "^1.2.0", - "prop-types": "^15.7.2", - "webrtc-adapter": "^7.2.1" - }, - "peerDependencies": { - "react": "~16", - "react-dom": "~16" - } - }, - "node_modules/react-redux": { - "version": "9.2.0", - "license": "MIT", - "dependencies": { - "@types/use-sync-external-store": "^0.0.6", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "@types/react": "^18.2.25 || ^19", - "react": "^18.0 || ^19", - "redux": "^5.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "node_modules/react-refresh": { - "version": "0.14.2", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.7.2", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "license": "MIT", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-resizable-panels": { - "version": "4.5.2", - "license": "MIT", - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "license": "MIT", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "4.7.0", - "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/readdirp": { - "version": "3.6.0", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/real-require": { - "version": "0.1.0", - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/recharts": { - "version": "3.7.0", - "license": "MIT", - "workspaces": [ - "www" - ], - "dependencies": { - "@reduxjs/toolkit": "1.x.x || 2.x.x", - "clsx": "^2.1.1", - "decimal.js-light": "^2.5.1", - "es-toolkit": "^1.39.3", - "eventemitter3": "^5.0.1", - "immer": "^10.1.1", - "react-redux": "8.x.x || 9.x.x", - "reselect": "5.1.1", - "tiny-invariant": "^1.3.3", - "use-sync-external-store": "^1.2.2", - "victory-vendor": "^37.0.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/recharts/node_modules/eventemitter3": { - "version": "5.0.4", - "license": "MIT" - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redux": { - "version": "5.0.1", - "license": "MIT" - }, - "node_modules/redux-thunk": { - "version": "3.1.0", - "license": "MIT", - "peerDependencies": { - "redux": "^5.0.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "license": "MIT", - "peer": true - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/reselect": { - "version": "5.1.1", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.11", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "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/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.3", - "license": "MIT", - "dependencies": { - "hash-base": "^3.1.2", - "inherits": "^2.0.4" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ripemd160/node_modules/hash-base": { - "version": "3.1.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ripemd160/node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/ripemd160/node_modules/readable-stream": { - "version": "2.3.8", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/ripemd160/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/ripemd160/node_modules/string_decoder": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ripemd160/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/ripple-address-codec": { - "version": "5.0.0", - "license": "ISC", - "dependencies": { - "@scure/base": "^1.1.3", - "@xrplf/isomorphic": "^1.0.0" - }, - "engines": { - "node": ">= 16" - } - }, - "node_modules/ripple-binary-codec": { - "version": "2.6.0", - "license": "ISC", - "dependencies": { - "@xrplf/isomorphic": "^1.0.1", - "bignumber.js": "^9.0.0", - "ripple-address-codec": "^5.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/ripple-keypairs": { - "version": "2.0.0", - "license": "ISC", - "dependencies": { - "@noble/curves": "^1.0.0", - "@xrplf/isomorphic": "^1.0.0", - "ripple-address-codec": "^5.0.0" - }, - "engines": { - "node": ">= 16" - } - }, - "node_modules/rollup": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.59.0", - "@rollup/rollup-android-arm64": "4.59.0", - "@rollup/rollup-darwin-arm64": "4.59.0", - "@rollup/rollup-darwin-x64": "4.59.0", - "@rollup/rollup-freebsd-arm64": "4.59.0", - "@rollup/rollup-freebsd-x64": "4.59.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", - "@rollup/rollup-linux-arm-musleabihf": "4.59.0", - "@rollup/rollup-linux-arm64-gnu": "4.59.0", - "@rollup/rollup-linux-arm64-musl": "4.59.0", - "@rollup/rollup-linux-loong64-gnu": "4.59.0", - "@rollup/rollup-linux-loong64-musl": "4.59.0", - "@rollup/rollup-linux-ppc64-gnu": "4.59.0", - "@rollup/rollup-linux-ppc64-musl": "4.59.0", - "@rollup/rollup-linux-riscv64-gnu": "4.59.0", - "@rollup/rollup-linux-riscv64-musl": "4.59.0", - "@rollup/rollup-linux-s390x-gnu": "4.59.0", - "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@rollup/rollup-linux-x64-musl": "4.59.0", - "@rollup/rollup-openbsd-x64": "4.59.0", - "@rollup/rollup-openharmony-arm64": "4.59.0", - "@rollup/rollup-win32-arm64-msvc": "4.59.0", - "@rollup/rollup-win32-ia32-msvc": "4.59.0", - "@rollup/rollup-win32-x64-gnu": "4.59.0", - "@rollup/rollup-win32-x64-msvc": "4.59.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/router/node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/rpc-websockets": { - "version": "9.3.2", - "license": "LGPL-3.0-only", - "dependencies": { - "@swc/helpers": "^0.5.11", - "@types/uuid": "^8.3.4", - "@types/ws": "^8.2.2", - "buffer": "^6.0.3", - "eventemitter3": "^5.0.1", - "uuid": "^8.3.2", - "ws": "^8.5.0" - }, - "funding": { - "type": "paypal", - "url": "https://paypal.me/kozjak" - }, - "optionalDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - } - }, - "node_modules/rpc-websockets/node_modules/@types/ws": { - "version": "8.18.1", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/rpc-websockets/node_modules/eventemitter3": { - "version": "5.0.4", - "license": "MIT" - }, - "node_modules/rpc-websockets/node_modules/ws": { - "version": "8.19.0", - "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/rtcpeerconnection-shim": { - "version": "1.2.15", - "license": "BSD-3-Clause", - "dependencies": { - "sdp": "^2.6.0" - }, - "engines": { - "node": ">=6.0.0", - "npm": ">=3.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "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": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "6.6.7", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "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-push-apply": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/salmon-adapter-sdk": { - "version": "1.1.1", - "license": "Apache-2.0", - "dependencies": { - "@project-serum/sol-wallet-adapter": "^0.2.6", - "eventemitter3": "^4.0.7" - }, - "peerDependencies": { - "@solana/web3.js": "^1.44.3" - } - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.26.0", - "license": "MIT" - }, - "node_modules/sdp": { - "version": "2.12.0", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.3", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.19.2", - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/send/node_modules/encodeurl": { - "version": "2.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "license": "MIT", - "peer": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.2", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-error": { - "version": "2.1.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/serve-static": { - "version": "1.16.3", - "license": "MIT", - "peer": true, - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/encodeurl": { - "version": "2.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "license": "ISC" - }, - "node_modules/sha.js": { - "version": "2.4.12", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sharp": { - "version": "0.34.5", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.3", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.4", - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/snake-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/socket.io-client": { - "version": "4.8.3", - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.4.1", - "engine.io-client": "~6.6.1", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.5", - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.4.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.7", - "license": "MIT", - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/sonic-boom": { - "version": "2.8.0", - "license": "MIT", - "dependencies": { - "atomic-sleep": "^1.0.0" - } - }, - "node_modules/sonner": { - "version": "2.0.7", - "license": "MIT", - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-on-first": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/stable-hash": { - "version": "0.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "license": "MIT", - "peer": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/stackframe": { - "version": "1.3.4", - "license": "MIT", - "peer": true - }, - "node_modules/stacktrace-parser": { - "version": "0.1.11", - "license": "MIT", - "peer": true, - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "dev": true, - "license": "MIT" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-browserify/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-chain": { - "version": "2.2.5", - "license": "BSD-3-Clause" - }, - "node_modules/stream-json": { - "version": "1.9.1", - "license": "BSD-3-Clause", - "dependencies": { - "stream-chain": "^2.2.5" - } - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "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/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "node_modules/string.prototype.includes": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", - "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/styled-jsx": { - "version": "5.1.6", - "license": "MIT", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/sucrase": { - "version": "3.35.1", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/superstruct": { - "version": "0.15.5", - "license": "MIT" - }, - "node_modules/supports-color": { - "version": "8.1.1", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tailwind-merge": { - "version": "3.4.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.19", - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.7", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss-animate": { - "version": "1.0.7", - "license": "MIT", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/tailwindcss/node_modules/fast-glob": { - "version": "3.3.3", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/tailwindcss/node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tailwindcss/node_modules/postcss-load-config": { - "version": "6.0.1", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/terser": { - "version": "5.46.0", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "license": "MIT", - "peer": true - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "license": "ISC", - "peer": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-encoding-utf-8": { - "version": "1.0.2" - }, - "node_modules/thenify": { - "version": "3.3.1", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/thread-stream": { - "version": "0.15.2", - "license": "MIT", - "dependencies": { - "real-require": "^0.1.0" - } - }, - "node_modules/throat": { - "version": "5.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "license": "MIT" - }, - "node_modules/tiny-secp256k1": { - "version": "1.1.7", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "bindings": "^1.3.0", - "bn.js": "^4.11.8", - "create-hmac": "^1.1.7", - "elliptic": "^6.4.0", - "nan": "^2.13.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/tiny-secp256k1/node_modules/bn.js": { - "version": "4.12.2", - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tldts": { - "version": "7.0.24", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.24.tgz", - "integrity": "sha512-1r6vQTTt1rUiJkI5vX7KG8PR342Ru/5Oh13kEQP2SMbRSZpOey9SrBe27IDxkoWulx8ShWu4K6C0BkctP8Z1bQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^7.0.24" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "7.0.24", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.24.tgz", - "integrity": "sha512-pj7yygNMoMRqG7ML2SDQ0xNIOfN3IBDUcPVM2Sg6hP96oFNN2nqnzHreT3z9xLq85IWJyNTvD38O002DdOrPMw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tmpl": { - "version": "1.0.5", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/to-buffer": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/toml": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/tough-cookie": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", - "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^7.0.5" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, - "node_modules/ts-api-utils": { - "version": "2.4.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "license": "Apache-2.0" - }, - "node_modules/ts-mixer": { - "version": "6.0.4", - "license": "MIT" - }, - "node_modules/ts-tqdm": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/ts-tqdm/-/ts-tqdm-0.8.6.tgz", - "integrity": "sha512-3X3M1PZcHtgQbnwizL+xU8CAgbYbeLHrrDwL9xxcZZrV5J+e7loJm1XrXozHjSkl44J0Zg0SgA8rXbh83kCkcQ==", - "license": "MIT" - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "license": "0BSD" - }, - "node_modules/turbo": { - "version": "2.7.5", - "dev": true, - "license": "MIT", - "bin": { - "turbo": "bin/turbo" - }, - "optionalDependencies": { - "turbo-darwin-64": "2.7.5", - "turbo-darwin-arm64": "2.7.5", - "turbo-linux-64": "2.7.5", - "turbo-linux-arm64": "2.7.5", - "turbo-windows-64": "2.7.5", - "turbo-windows-arm64": "2.7.5" - } - }, - "node_modules/turbo-darwin-arm64": { - "version": "2.7.5", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/type-check": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.7.1", - "license": "(MIT OR CC0-1.0)", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typeforce": { - "version": "1.18.0", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.9.2", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.53.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.53.1", - "@typescript-eslint/parser": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/utils": "8.53.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/ua-is-frozen": { - "version": "0.1.2", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "license": "MIT" - }, - "node_modules/ua-parser-js": { - "version": "2.0.8", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "AGPL-3.0-or-later", - "dependencies": { - "detect-europe-js": "^0.1.2", - "is-standalone-pwa": "^0.1.1", - "ua-is-frozen": "^0.1.2" - }, - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ufo": { - "version": "1.6.3", - "license": "MIT" - }, - "node_modules/uint8array-tools": { - "version": "0.0.8", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/uint8arrays": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "multiformats": "^9.4.2" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/uncrypto": { - "version": "0.1.3", - "license": "MIT" - }, - "node_modules/undici": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", - "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "license": "MIT" - }, - "node_modules/unenv": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", - "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", - "license": "MIT", - "dependencies": { - "pathe": "^2.0.3" - } - }, - "node_modules/unidragger": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "ev-emitter": "^2.0.0" - } - }, - "node_modules/unload": { - "version": "2.4.1", - "license": "Apache-2.0", - "funding": { - "url": "https://github.com/sponsors/pubkey" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unrs-resolver": { - "version": "1.11.1", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.0" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.11.1", - "@unrs/resolver-binding-android-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-x64": "1.11.1", - "@unrs/resolver-binding-freebsd-x64": "1.11.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-musl": "1.11.1", - "@unrs/resolver-binding-wasm32-wasi": "1.11.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" - } - }, - "node_modules/unstorage": { - "version": "1.17.4", - "license": "MIT", - "dependencies": { - "anymatch": "^3.1.3", - "chokidar": "^5.0.0", - "destr": "^2.0.5", - "h3": "^1.15.5", - "lru-cache": "^11.2.0", - "node-fetch-native": "^1.6.7", - "ofetch": "^1.5.1", - "ufo": "^1.6.3" - }, - "peerDependencies": { - "@azure/app-configuration": "^1.8.0", - "@azure/cosmos": "^4.2.0", - "@azure/data-tables": "^13.3.0", - "@azure/identity": "^4.6.0", - "@azure/keyvault-secrets": "^4.9.0", - "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6 || ^7 || ^8", - "@deno/kv": ">=0.9.0", - "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", - "@planetscale/database": "^1.19.0", - "@upstash/redis": "^1.34.3", - "@vercel/blob": ">=0.27.1", - "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1 || ^2 || ^3", - "aws4fetch": "^1.0.20", - "db0": ">=0.2.1", - "idb-keyval": "^6.2.1", - "ioredis": "^5.4.2", - "uploadthing": "^7.4.4" - }, - "peerDependenciesMeta": { - "@azure/app-configuration": { - "optional": true - }, - "@azure/cosmos": { - "optional": true - }, - "@azure/data-tables": { - "optional": true - }, - "@azure/identity": { - "optional": true - }, - "@azure/keyvault-secrets": { - "optional": true - }, - "@azure/storage-blob": { - "optional": true - }, - "@capacitor/preferences": { - "optional": true - }, - "@deno/kv": { - "optional": true - }, - "@netlify/blobs": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/blob": { - "optional": true - }, - "@vercel/functions": { - "optional": true - }, - "@vercel/kv": { - "optional": true - }, - "aws4fetch": { - "optional": true - }, - "db0": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "uploadthing": { - "optional": true - } - } - }, - "node_modules/unstorage/node_modules/chokidar": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/unstorage/node_modules/lru-cache": { - "version": "11.2.5", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/unstorage/node_modules/readdirp": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urijs": { - "version": "1.19.11", - "license": "MIT" - }, - "node_modules/urlpattern-polyfill": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", - "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", - "license": "MIT" - }, - "node_modules/usb": { - "version": "2.17.0", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@types/w3c-web-usb": "^1.0.6", - "node-addon-api": "^8.0.0", - "node-gyp-build": "^4.5.0" - }, - "engines": { - "node": ">=12.22.0 <13.0 || >=14.17.0" - } - }, - "node_modules/usb/node_modules/node-addon-api": { - "version": "8.5.0", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "license": "MIT", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/uuidv4": { - "version": "6.2.13", - "license": "MIT", - "dependencies": { - "@types/uuid": "8.3.4", - "uuid": "8.3.2" - } - }, - "node_modules/valtio": { - "version": "1.13.2", - "license": "MIT", - "dependencies": { - "derive-valtio": "0.1.0", - "proxy-compare": "2.6.0", - "use-sync-external-store": "1.2.0" - }, - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - } - } - }, - "node_modules/valtio/node_modules/use-sync-external-store": { - "version": "1.2.0", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/varuint-bitcoin": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "uint8array-tools": "^0.0.8" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vaul": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "@radix-ui/react-dialog": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/victory-vendor": { - "version": "37.3.6", - "license": "MIT AND ISC", - "dependencies": { - "@types/d3-array": "^3.0.3", - "@types/d3-ease": "^3.0.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-shape": "^3.1.0", - "@types/d3-time": "^3.0.0", - "@types/d3-timer": "^3.0.0", - "d3-array": "^3.1.6", - "d3-ease": "^3.0.1", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-timer": "^3.0.1" - } - }, - "node_modules/viem": { - "version": "2.45.1", - "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.11.3", - "ws": "8.18.3" - }, - "peerDependencies": { - "typescript": ">=5.0.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/viem/node_modules/@noble/curves": { - "version": "1.9.1", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/viem/node_modules/@scure/bip32": { - "version": "1.7.0", - "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/viem/node_modules/ws": { - "version": "8.18.3", - "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/vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vitest": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", - "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.18", - "@vitest/mocker": "4.0.18", - "@vitest/pretty-format": "4.0.18", - "@vitest/runner": "4.0.18", - "@vitest/snapshot": "4.0.18", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.18", - "@vitest/browser-preview": "4.0.18", - "@vitest/browser-webdriverio": "4.0.18", - "@vitest/ui": "4.0.18", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vlq": { - "version": "1.0.1", - "license": "MIT", - "peer": true - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/warning": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/web": { - "resolved": "apps/web", - "link": true - }, - "node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "node_modules/webrtc-adapter": { - "version": "7.7.1", - "license": "BSD-3-Clause", - "dependencies": { - "rtcpeerconnection-shim": "^1.2.15", - "sdp": "^2.12.0" - }, - "engines": { - "node": ">=6.0.0", - "npm": ">=3.10.0" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "license": "MIT", - "peer": true - }, - "node_modules/whatwg-mimetype": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", - "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "license": "ISC" - }, - "node_modules/which-typed-array": { - "version": "1.1.20", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wif": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "bs58check": "^4.0.0" - } - }, - "node_modules/wif/node_modules/base-x": { - "version": "5.0.1", - "license": "MIT" - }, - "node_modules/wif/node_modules/bs58": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^5.0.0" - } - }, - "node_modules/wif/node_modules/bs58check": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "@noble/hashes": "^1.2.0", - "bs58": "^6.0.0" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workerd": { - "version": "1.20260312.1", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260312.1.tgz", - "integrity": "sha512-nNpPkw9jaqo79B+iBCOiksx+N62xC+ETIfyzofUEdY3cSOHJg6oNnVSHm7vHevzVblfV76c8Gr0cXHEapYMBEg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "bin": { - "workerd": "bin/workerd" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20260312.1", - "@cloudflare/workerd-darwin-arm64": "1.20260312.1", - "@cloudflare/workerd-linux-64": "1.20260312.1", - "@cloudflare/workerd-linux-arm64": "1.20260312.1", - "@cloudflare/workerd-windows-64": "1.20260312.1" - } - }, - "node_modules/wrangler": { - "version": "4.74.0", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.74.0.tgz", - "integrity": "sha512-3qprbhgdUyqYGHZ+Y1k0gsyHLMOlLrKL/HU0LDqLlCkbsKPprUA0/ThE4IZsxD84xAAXY6pv5JUuxS2+OnMa3A==", - "license": "MIT OR Apache-2.0", - "dependencies": { - "@cloudflare/kv-asset-handler": "0.4.2", - "@cloudflare/unenv-preset": "2.15.0", - "blake3-wasm": "2.1.5", - "esbuild": "0.27.3", - "miniflare": "4.20260312.1", - "path-to-regexp": "6.3.0", - "unenv": "2.0.0-rc.24", - "workerd": "1.20260312.1" - }, - "bin": { - "wrangler": "bin/wrangler.js", - "wrangler2": "bin/wrangler.js" - }, - "engines": { - "node": ">=20.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@cloudflare/workers-types": "^4.20260312.1" - }, - "peerDependenciesMeta": { - "@cloudflare/workers-types": { - "optional": true - } - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "license": "ISC", - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ws": { - "version": "7.5.10", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.1.2", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/xrpl": { - "version": "4.4.3", - "license": "ISC", - "dependencies": { - "@scure/bip32": "^1.3.1", - "@scure/bip39": "^1.2.1", - "@xrplf/isomorphic": "^1.0.1", - "@xrplf/secret-numbers": "^2.0.0", - "bignumber.js": "^9.0.0", - "eventemitter3": "^5.0.1", - "fast-json-stable-stringify": "^2.1.0", - "ripple-address-codec": "^5.0.0", - "ripple-binary-codec": "^2.5.0", - "ripple-keypairs": "^2.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/xrpl/node_modules/eventemitter3": { - "version": "5.0.4", - "license": "MIT" - }, - "node_modules/y18n": { - "version": "4.0.3", - "license": "ISC" - }, - "node_modules/yallist": { - "version": "3.1.1", - "license": "ISC", - "peer": true - }, - "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/yargs": { - "version": "15.4.1", - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/locate-path": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/p-locate": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/youch": { - "version": "4.1.0-beta.10", - "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", - "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", - "license": "MIT", - "dependencies": { - "@poppinss/colors": "^4.1.5", - "@poppinss/dumper": "^0.6.4", - "@speed-highlight/core": "^1.2.7", - "cookie": "^1.0.2", - "youch-core": "^0.3.3" - } - }, - "node_modules/youch-core": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", - "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", - "license": "MIT", - "dependencies": { - "@poppinss/exception": "^1.2.2", - "error-stack-parser-es": "^1.0.5" - } - }, - "node_modules/zod": { - "version": "4.3.6", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "packages/cloudflare-kv": { - "name": "@bunkercash/cloudflare-kv", - "version": "0.1.0", - "dependencies": { - "@opennextjs/cloudflare": "*" - }, - "devDependencies": { - "@cloudflare/workers-types": "*" - } - }, - "packages/eslint-config": { - "name": "@repo/eslint-config", - "version": "0.0.0", - "devDependencies": { - "@eslint/js": "^9.34.0", - "@next/eslint-plugin-next": "^15.5.0", - "eslint": "^9.34.0", - "eslint-config-prettier": "^10.1.1", - "eslint-plugin-only-warn": "^1.1.0", - "eslint-plugin-react": "^7.37.5", - "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-turbo": "^2.5.0", - "globals": "^16.3.0", - "typescript": "^5.9.2", - "typescript-eslint": "^8.40.0" - } - }, - "packages/eslint-config/node_modules/globals": { - "version": "16.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/typescript-config": { - "name": "@repo/typescript-config", - "version": "0.0.0", - "license": "MIT" - } - } -} diff --git a/ts/package.json b/ts/package.json index cfe61be..176ec80 100644 --- a/ts/package.json +++ b/ts/package.json @@ -4,6 +4,7 @@ "license": "BUSL-1.1", "scripts": { "build": "turbo run build", + "check:lockfiles": "node ../scripts/check-lockfiles.mjs", "dev": "turbo run dev", "lint": "turbo run lint", "format": "prettier --write \"**/*.{ts,tsx,md}\"", diff --git a/ts/scripts/deploy-preflight.mjs b/ts/scripts/deploy-preflight.mjs new file mode 100644 index 0000000..48e2dfe --- /dev/null +++ b/ts/scripts/deploy-preflight.mjs @@ -0,0 +1,231 @@ +#!/usr/bin/env node + +import { readFileSync } from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const MAINNET_USDC_MINT = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; +const DEVNET_USDC_MINT = "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU"; +const KNOWN_DEVNET_PROGRAM_IDS = new Set([ + "Fp8b6p287TL5oPMwLVdwGys5phHNLcmTKNvVoGdCJS6g", +]); +const KNOWN_DEVNET_SQUADS = new Set([ + "HEzTX4LNQ7cjrXTt1vKXyEZGtc94TKRUc9kWNFexJSGz", +]); +const PRODUCTION_DOMAINS = new Set(["bunkercash.com", "www.bunkercash.com"]); +const VALID_ENVS = new Set(["dev", "staging", "production"]); +const VALID_CLUSTERS = new Set(["devnet", "testnet", "mainnet-beta"]); + +function parseArgs(argv) { + const out = {}; + for (let i = 0; i < argv.length; i += 1) { + const arg = argv[i]; + if (arg === "--app") out.app = argv[++i]; + else if (arg === "--env") out.env = argv[++i]; + } + return out; +} + +function stripJsonComments(source) { + let out = ""; + let inString = false; + let quote = ""; + let escaped = false; + + for (let i = 0; i < source.length; i += 1) { + const char = source[i]; + const next = source[i + 1]; + + if (inString) { + out += char; + if (escaped) { + escaped = false; + } else if (char === "\\") { + escaped = true; + } else if (char === quote) { + inString = false; + quote = ""; + } + continue; + } + + if (char === "\"" || char === "'") { + inString = true; + quote = char; + out += char; + continue; + } + + if (char === "/" && next === "/") { + while (i < source.length && source[i] !== "\n") i += 1; + out += "\n"; + continue; + } + + if (char === "/" && next === "*") { + i += 2; + while (i < source.length && !(source[i] === "*" && source[i + 1] === "/")) { + i += 1; + } + i += 1; + continue; + } + + out += char; + } + + return out; +} + +function parseJsonc(filePath) { + const withoutComments = stripJsonComments(readFileSync(filePath, "utf8")); + return JSON.parse(withoutComments.replace(/,\s*([}\]])/g, "$1")); +} + +function die(message) { + console.error(`deploy preflight failed: ${message}`); + process.exit(1); +} + +function isPlaceholder(value) { + return !value || /REPLACE|TODO|YOUR_/i.test(value); +} + +function routePatterns(config) { + return (config.routes ?? []).map((route) => + typeof route === "string" ? route : route.pattern, + ); +} + +function collectBindingIds(config, bindingName) { + return (config[bindingName] ?? []) + .flatMap((entry) => [entry.id, entry.preview_id, entry.database_id]) + .filter(Boolean); +} + +function assertPublicKeyLike(value, label) { + if (isPlaceholder(value) || !/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(value)) { + die(`${label} must be a real base58 public key`); + } +} + +function assertUuidLike(value, label) { + if ( + isPlaceholder(value) || + !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value) + ) { + die(`${label} must be a real UUID`); + } +} + +function assertNoProductionRoutes(config, envName) { + const forbidden = routePatterns(config).filter((pattern) => + PRODUCTION_DOMAINS.has(pattern), + ); + if (forbidden.length > 0) { + die(`${envName} config must not route production domains: ${forbidden.join(", ")}`); + } +} + +function assertProductionConfig(config, allEnvs, appName) { + const vars = config.vars ?? {}; + const cluster = vars.NEXT_PUBLIC_SOLANA_CLUSTER ?? vars.NEXT_PUBLIC_CLUSTER; + const rpc = vars.NEXT_PUBLIC_SOLANA_RPC_URL ?? ""; + const usdcMint = vars.NEXT_PUBLIC_USDC_MINT ?? ""; + const programId = vars.NEXT_PUBLIC_BUNKERCASH_PROGRAM_ID ?? ""; + const squadsMultisig = vars.NEXT_PUBLIC_SQUADS_MULTISIG_PUBKEY ?? ""; + + if (vars.NEXT_PUBLIC_DEPLOY_ENV !== "production") { + die("production config must set NEXT_PUBLIC_DEPLOY_ENV=production"); + } + if (cluster !== "mainnet-beta" || vars.NEXT_PUBLIC_CLUSTER !== "mainnet-beta") { + die("production config must set both cluster vars to mainnet-beta"); + } + if (!rpc || /devnet|testnet|localhost|127\.0\.0\.1/i.test(rpc)) { + die("production RPC must be a mainnet endpoint, not devnet/testnet/local"); + } + if (usdcMint !== MAINNET_USDC_MINT) { + die(`production USDC mint must be canonical mainnet USDC ${MAINNET_USDC_MINT}`); + } + assertPublicKeyLike(programId, "production program id"); + if (KNOWN_DEVNET_PROGRAM_IDS.has(programId)) { + die("production program id is the known devnet program id"); + } + assertPublicKeyLike(squadsMultisig, "production Squads multisig"); + if (KNOWN_DEVNET_SQUADS.has(squadsMultisig)) { + die("production Squads multisig is the known devnet multisig"); + } + + if (appName === "web") { + const productionRoutes = new Set(routePatterns(config)); + for (const domain of PRODUCTION_DOMAINS) { + if (!productionRoutes.has(domain)) { + die(`production web config must include ${domain}`); + } + } + } + + const prodKvIds = collectBindingIds(config, "kv_namespaces"); + const prodD1Ids = collectBindingIds(config, "d1_databases"); + for (const id of prodKvIds) assertUuidLike(id, "production KV id"); + for (const id of prodD1Ids) assertUuidLike(id, "production D1 id"); + + const nonProdIds = new Set(); + for (const [name, envConfig] of Object.entries(allEnvs)) { + if (name === "production") continue; + collectBindingIds(envConfig, "kv_namespaces").forEach((id) => nonProdIds.add(id)); + collectBindingIds(envConfig, "d1_databases").forEach((id) => nonProdIds.add(id)); + } + for (const id of [...prodKvIds, ...prodD1Ids]) { + if (nonProdIds.has(id)) { + die(`production binding id ${id} is reused by a non-production environment`); + } + } +} + +function assertNonProductionConfig(config, envName) { + const vars = config.vars ?? {}; + const cluster = vars.NEXT_PUBLIC_SOLANA_CLUSTER ?? vars.NEXT_PUBLIC_CLUSTER; + + assertNoProductionRoutes(config, envName); + if (vars.NEXT_PUBLIC_DEPLOY_ENV !== envName) { + die(`${envName} config must set NEXT_PUBLIC_DEPLOY_ENV=${envName}`); + } + if (!VALID_CLUSTERS.has(cluster)) { + die(`${envName} config has missing or invalid Solana cluster`); + } + if (envName !== "production" && cluster === "mainnet-beta") { + die(`${envName} config must not point at mainnet-beta`); + } + if (vars.NEXT_PUBLIC_USDC_MINT === MAINNET_USDC_MINT) { + die(`${envName} config must not use canonical mainnet USDC`); + } + if (envName === "dev" && vars.NEXT_PUBLIC_USDC_MINT !== DEVNET_USDC_MINT) { + die("dev config must use the canonical devnet USDC mint"); + } +} + +const args = parseArgs(process.argv.slice(2)); +if (!args.app || !["web", "admin"].includes(args.app)) { + die("--app must be web or admin"); +} +if (!args.env || !VALID_ENVS.has(args.env)) { + die("--env must be dev, staging, or production"); +} + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const wranglerPath = path.join(root, "apps", args.app, "wrangler.jsonc"); +const config = parseJsonc(wranglerPath); +const envConfig = config.env?.[args.env]; +if (!envConfig) { + die(`${args.app} wrangler config is missing env.${args.env}`); +} + +assertNoProductionRoutes(config, "top-level"); +if (args.env === "production") { + assertProductionConfig(envConfig, config.env ?? {}, args.app); +} else { + assertNonProductionConfig(envConfig, args.env); +} + +console.log(`deploy preflight passed: ${args.app}/${args.env}`);