diff --git a/lazer/cardano/lafhis/README.md b/lazer/cardano/lafhis/README.md new file mode 100644 index 00000000..3fb86e60 --- /dev/null +++ b/lazer/cardano/lafhis/README.md @@ -0,0 +1,418 @@ +# ๐Ÿ‡ CoinStable โ€” Traders Duel + +> **Buenos Aires Pythathon 2026** ยท Hackathon Submission ยท March 21โ€“22, 2026 + +A **trustless, on-chain PvP trading duel** built on Cardano and powered by real-time Pyth oracle prices. Two players pick different crypto assets, stake ADA, and watch 60 seconds of live price action decide the winner โ€” **completely verified on-chain**. No house. No trust. Just math. + +--- + +## ๐ŸŽฏ The Game + +Two players. Two assets. One winner. + +**CoinStable** is a real-time duel where each player bets on a different crypto asset (ADA/USD, BTC/USD, ETH/USD, BNB/USD). After a countdown, whoever's asset appreciated the most in **percentage terms** wins the entire pot. + +``` +๐ŸŸฃ Player A bets 25 ADA on ADA/USD +๐Ÿ”ต Player B bets 25 ADA on BTC/USD + +โฑ 60 seconds of live price action... + +ADA/USD: +1.2% ๐Ÿ† +BTC/USD: +0.3% + +Player A wins 50 ADA! +``` + +If the difference between both percentage changes is **under 0.0001%**, it's a **draw** โ€” both players get their ADA back. + +--- + +## ๐Ÿ—บ๏ธ Table of Contents + +- [How It Works](#%EF%B8%8F-how-it-works) +- [Why It's Trustless](#-why-its-trustless) +- [Tech Stack](#%EF%B8%8F-tech-stack) +- [Project Structure](#-project-structure) +- [Smart Contracts](#-smart-contracts) +- [Frontend](#%EF%B8%8F-frontend) +- [Getting Started](#-getting-started) +- [Design Decisions](#-design-decisions) +- [Team](#-team) + +--- + +## โš™๏ธ How It Works + +### Step by Step + +``` +โ‘  Player A creates a duel + โ”œโ”€โ”€ Picks an asset (e.g. ADA/USD) + โ”œโ”€โ”€ Sets a bet amount (10, 25, or 50 ADA) + โ””โ”€โ”€ Deposits into the on-chain contract โ†’ gets a shareable link ๐Ÿ”— + +โ‘ก Player B joins via the link + โ”œโ”€โ”€ Picks a different asset (e.g. BTC/USD) + โ””โ”€โ”€ Deposits matching ADA into the same contract + +โ‘ข The race begins ๐Ÿ + โ”œโ”€โ”€ Backend records start prices from Pyth at join time + โ”œโ”€โ”€ Live "race" visualization shows real-time % change for each asset + โ””โ”€โ”€ Countdown timer ticks away... + +โ‘ฃ Resolution (fully on-chain) โœ… + โ”œโ”€โ”€ Backend fetches final Pyth prices after the deadline + โ”œโ”€โ”€ On-chain validator calculates % change for both assets + โ”œโ”€โ”€ Winner receives the full pot directly to their wallet + โ””โ”€โ”€ Authenticity NFT is burned to close the duel +``` + +### Duel Lifecycle (State Machine) + +``` + [Waiting] โ”€โ”€(Player B joins)โ”€โ”€โ–บ [Active] โ”€โ”€(deadline passed)โ”€โ”€โ–บ [Finished] + โ”‚ โ”‚ + โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€(Cancel)โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ [Refunded] +``` + +Each state transition is a real Cardano transaction โ€” enforced by the on-chain validator. + +--- + +## ๐Ÿ”’ Why It's Trustless + +This is **not** a "trust the backend" game. The outcome is cryptographically determined on-chain. + +- ๐Ÿ“ก **Pyth Lazer** delivers signed price updates directly embedded in the transaction +- ๐Ÿงฎ The **Aiken validator** reads those prices and runs the winner calculation on-chain +- ๐Ÿšซ The **backend cannot lie** โ€” it can only submit transactions the validator approves +- ๐ŸŽŸ๏ธ **NFT-gated duels** prevent spam and ensure each contract is authentic + +### Winner Calculation (on-chain logic) + +``` +change_a = (end_price_a - start_price_a) ร— 1_000_000 / start_price_a +change_b = (end_price_b - start_price_b) ร— 1_000_000 / start_price_b + +if |change_a - change_b| < 1 โ†’ ๐Ÿค Draw (both refunded) +else if change_a > change_b โ†’ ๐Ÿ† Player A wins the full pot +else โ†’ ๐Ÿ† Player B wins the full pot +``` + +The **0.0001% draw threshold** prevents dust-level differences from picking a winner when the race is essentially tied. + +### Horseshoe Tokens + +Every duel winner receives 1 **Horseshoe** โ€” a fungible Cardano token minted atomically in the same transaction that settles the duel. Because minting is gated by the `winner_token` Aiken validator (which requires the backend to co-sign), Horseshoes can only exist as proof of a real on-chain win. They accumulate in your wallet across duels and will form the basis of the leaderboard in a future version of CoinStable. + +--- + +## ๐Ÿ› ๏ธ Tech Stack + +| Layer | Technology | Purpose | +|-------|-----------|---------| +| ๐Ÿ“œ Smart Contracts | [Aiken](https://aiken-lang.org) (Plutus v3) | On-chain duel logic | +| โ›“๏ธ Blockchain | Cardano Testnet (Preprod/Preview) | Settlement layer | +| ๐Ÿ”ฎ Oracle | [Pyth Network โ€” Lazer](https://pyth.network) | Verified price feeds | +| ๐Ÿ‘› Wallet | [MeshJS](https://meshjs.dev) (CIP-30) | Wallet integration | +| ๐Ÿ” Chain Indexer | [Blockfrost](https://blockfrost.io) | UTxO queries | +| ๐Ÿ–ฅ๏ธ Frontend | Next.js 16, React 18, TypeScript | UI & game interface | +| ๐ŸŽจ Styling | Tailwind CSS | Design system | +| ๐Ÿ“ˆ Live Prices | Pyth Hermes Client (WebSocket) | Real-time price ticks | + +### ๐Ÿ”ฎ Why Pyth? + +Pyth Lazer delivers **sub-second price updates** with **on-chain cryptographic verification**. Instead of trusting the backend to report prices, the transaction itself carries signed Pyth price data โ€” and the validator verifies it using the **zero-withdrawal pattern**: + +- Price data is verified **inside the transaction**, not by the backend +- No one can submit a fake price โ€” Pyth's signature ensures authenticity +- The outcome is **fully auditable** by anyone on-chain + +--- + +## ๐Ÿ“‚ Project Structure + +``` +lafhis/ +โ”‚ +โ”œโ”€โ”€ ๐Ÿ“œ pyth-coin-stable-validators/ Smart contracts (Aiken) +โ”‚ โ”œโ”€โ”€ validators/ +โ”‚ โ”‚ โ”œโ”€โ”€ nft.ak NFT minting policy +โ”‚ โ”‚ โ””โ”€โ”€ validators.ak Main duel validator +โ”‚ โ”œโ”€โ”€ plutus.json Compiled Plutus scripts +โ”‚ โ””โ”€โ”€ aiken.toml Aiken project config +โ”‚ +โ”œโ”€โ”€ ๐Ÿ–ฅ๏ธ pyth-coin-stable-front/ Frontend (Next.js) +โ”‚ โ””โ”€โ”€ src/ +โ”‚ โ”œโ”€โ”€ pages/ +โ”‚ โ”‚ โ”œโ”€โ”€ index.tsx Landing page + demo +โ”‚ โ”‚ โ”œโ”€โ”€ create-game.tsx Create a duel +โ”‚ โ”‚ โ”œโ”€โ”€ join-game.tsx Join a duel (Player B) +โ”‚ โ”‚ โ””โ”€โ”€ game/[id].tsx Live duel view +โ”‚ โ”œโ”€โ”€ components/ +โ”‚ โ”‚ โ”œโ”€โ”€ DuelPreview.tsx ๐Ÿ‡ Live race visualization +โ”‚ โ”‚ โ””โ”€โ”€ PriceTicker.tsx Real-time price feed +โ”‚ โ”œโ”€โ”€ context/ +โ”‚ โ”‚ โ””โ”€โ”€ WalletContext.tsx CIP-30 wallet state +โ”‚ โ”œโ”€โ”€ server/ +โ”‚ โ”‚ โ””โ”€โ”€ gameStore.ts In-memory session store +โ”‚ โ””โ”€โ”€ types/ +โ”‚ โ””โ”€โ”€ game.ts TypeScript definitions +โ”‚ +โ”œโ”€โ”€ ๐Ÿ“„ duelo_de_traders_resumen.md Full design document (ES) +โ”œโ”€โ”€ ๐Ÿ“„ duelo_de_traders_interfaces.md API/interface specs (ES) +โ””โ”€โ”€ ๐Ÿ“„ wallet_integration.md MeshJS wallet docs +``` + +--- + +## ๐Ÿ“œ Smart Contracts + +Three validators compiled to **Plutus v3** with Aiken. + +### ๐ŸŽŸ๏ธ NFT Policy (`nft.ak`) + +Controls minting and burning of **authenticity NFTs** โ€” one per duel. Each NFT's asset name is the `duel_id`, derived deterministically as `SHA256(tx_hash || output_index)` of the creating UTxO. This makes every duel uniquely addressable on-chain. + +- **Mint:** Only the backend can authorize; must consume the UTxO used to derive the ID +- **Burn:** Called automatically on Resolve and Cancel to close the duel cleanly + +### โš–๏ธ Bet Validator (`validators.ak`) + +Enforces the duel lifecycle. Parameterized at deploy time by: +- `backend_pkh` โ€” only this key can resolve duels +- `nft_policy_id` โ€” links to the NFT policy above +- `pyth_id` โ€” Pyth Lazer script policy ID on the target network + +**What's stored in the contract UTxO (Datum):** + +``` +DuelDatum { + duel_id : ByteArray โ€” unique duel identifier + player_a : Player { + pkh, โ€” payment key hash + feed_id, โ€” Pyth feed (e.g. 16 = ADA/USD) + start_price โ€” recorded at duel start + } + player_b : Option โ€” None until joined + bet_amount_lovelace : Int โ€” each player's stake + status : Waiting | Active | Finished + deadline : Option โ€” POSIX ms timestamp +} +``` + +**Redeemers (actions):** + +| Action | Who | When | What Happens | +|--------|-----|------|-------------| +| `Join` | Player B + Backend | Status = Waiting | Reads Pyth start prices, activates duel | +| `Resolve` | Backend | Status = Active, after deadline | Calculates winner on-chain, pays out pot | +| `Cancel` | Player A or Backend | Status = Waiting | Refunds Player A, burns NFT | + +### ๐Ÿงฒ Winner Token Policy (`winner_token.ak`) + +Mints and burns **Horseshoe** tokens โ€” the fungible reward given to every duel winner. Parameterized at deploy time by: +- `backend_pkh` โ€” only the backend can authorize minting, ensuring tokens are only issued as part of a real `Resolve` transaction + +**Token:** +- **Name:** `horseshoe` (UTF-8, fixed for all duels) +- **Fungible:** yes โ€” winners accumulate Horseshoes across duels; their balance is the leaderboard + +**Redeemers (actions):** + +| Action | Who | What Happens | +|--------|-----|-------------| +| `MintVictory` | Backend | Mints exactly 1 Horseshoe to the winner, atomically in the same TX as `Resolve` | +| `BurnVictory` | Token holder | Burns any number of Horseshoes โ€” no backend needed, owner controls their tokens | + +Because minting is atomic with resolution, a Horseshoe can only ever exist as cryptographic proof of a real on-chain win. + +--- + +## ๐Ÿ–ฅ๏ธ Frontend + +### Pages + +| Route | Description | +|-------|-------------| +| `/` | ๐Ÿ  Landing page with animated demo race + live price ticker | +| `/create-game` | ๐Ÿ†• Connect wallet, pick asset + bet amount + duration | +| `/join-game?gameId=...` | ๐Ÿค Player B view โ€” pick a different asset and join | +| `/game/[id]` | ๐Ÿ Live duel lobby โ€” race visualization, countdown, status | + +### Key Components + +**๐Ÿ‡ `DuelPreview`** โ€” The heart of the UI. Two lanes with real-time % change bars, a countdown timer, and "Leading" / "Winner" badges. Fetches live prices from Pyth Hermes via WebSocket. Also runs in demo mode on the landing page. + +**๐Ÿ‘› `WalletContext`** โ€” Connects to any CIP-30 compatible wallet (Nami, Eternl, Lace, Flint...). Exposes address, balance, and network ID to the whole app via React Context. + +**๐Ÿšช `RequireWallet`** โ€” Gate component โ€” shows a wallet connect prompt if no wallet is connected, preventing you from accidentally creating a duel without funds. + +### REST API Routes + +| Method | Path | Description | +|--------|------|-------------| +| `POST` | `/api/games` | Create a new game session | +| `GET` | `/api/games/:id` | Fetch current game state | +| `POST` | `/api/games/:id/join` | Player B joins an existing game | +| `GET` | `/api/onchain/deposit-a-config` | Returns `blockfrostId`, `backendPkh`, `pythPolicyId`, compiled validators | +| `POST` | `/api/onchain/deposit-a-submit` | Backend co-signs + submits Player A's partial transaction | +| `POST` | `/api/onchain/deposit-b-submit` | Backend co-signs + submits Player B's partial transaction | +| `POST` | `/api/onchain/pyth-lazer-prices` | Fetches a signed Pyth Lazer update (server-side, needs `PYTH_TOKEN`) | +| `POST` | `/api/onchain/resolve` | Resolves a finished duel: fetches final prices, determines winner, submits resolve TX | + +### โš ๏ธ Known Limitation: Player B Join Transaction + +Everything in the project works end-to-end **except one step**: the browser transaction for Player B joining a duel (`depositB`) is not completing successfully on-chain. Player A creating a game works, the smart contracts are deployed and validated, the UI is fully functional, and the race visualization runs live on the game lobby screen โ€” including a demo preview while waiting for the opponent. + +The issue is a subtle Cardano-specific quirk: the Pyth Lazer signed price update is a large binary payload that must be included in the transaction as a Plutus withdrawal redeemer, and Cardano enforces a strict 64-byte CBOR chunking rule that MeshJS's browser serializer and Blockfrost's submission endpoint handle differently. We spent significant time tracking this down during the hackathon but could not close it within the time window. + +**The complete transaction-building logic exists and is correct** โ€” you can see the full flow working in the standalone Node.js scripts: + +| File | Description | +|------|-------------| +| `pyth-coin-stable-front/src/depositA.mjs` | Player A creates a duel โ€” mints authenticity NFT, locks ADA at script | +| `pyth-coin-stable-front/src/depositB.mjs` | Player B joins โ€” fetches Pyth Lazer prices, verifies on-chain via zero-withdrawal, transitions datum to Active | +| `pyth-coin-stable-front/src/resolve.mjs` | Backend resolves โ€” fetches final prices, determines winner, burns NFT, pays out pot + mints horseshoe token | + +These scripts use the exact same MeshJS transaction builder, Pyth Lazer SDK, and Aiken validators as the frontend, and can be run directly with `node` against Cardano preprod. They prove that the architecture, the smart contracts, and the Pyth integration are all sound. + +In the meantime, the game lobby already shows a **live race preview** โ€” with real-time price bars, a countdown, and asset performance โ€” so you can experience the full look and feel of a duel even before Player B has joined. + +### ๐Ÿงช Reviewer Demo โ€” Step by Step + +Follow these steps to experience the project end-to-end: + +**Prerequisites** +- A Chromium-based browser (Chrome, Brave, Arc) +- [Eternl](https://eternl.io) or [Nami](https://namiwallet.io) wallet extension installed and set to **Preprod** testnet +- Some test ADA in your preprod wallet (get it free at [docs.cardano.org/cardano-testnets/tools/faucet](https://docs.cardano.org/cardano-testnets/tools/faucet/)) +- The app running locally (see **Getting Started** below) or deployed + +**Step 1 โ€” Open the app and connect your wallet** +1. Go to the home page. You'll see the landing page with a live animated demo race showing two assets competing in real time using live Pyth prices. +2. Click **Connect Wallet** in the top right and approve the connection in your wallet extension. + +**Step 2 โ€” Create a game** +1. Click **Create Game** in the navigation. +2. Choose your asset (e.g. `ADA/USD`), set a bet amount (minimum 2 ADA recommended for testnet), and pick a duel duration. +3. Click **Create Game**. Your wallet will prompt you to sign a transaction โ€” this is the `depositA` transaction that mints an authenticity NFT and locks your bet on-chain. +4. Approve the transaction. Once submitted, you'll be redirected to the **Game Lobby**. + +**Step 3 โ€” See the live race preview** +1. On the Game Lobby page you'll immediately see the race visualization running โ€” two asset price bars moving in real time, powered by Pyth Hermes prices. +2. A message reads *"Waiting for opponent to join before the race startsโ€ฆ"* โ€” this is the demo state. The race preview is fully functional even without Player 2. +3. You can copy your **Game ID** or **Invite Link** from this screen to share with a second player. + +**Step 4 โ€” What happens when Player 2 joins** *(architecture demo)* +> The browser-side join transaction is the part that isn't fully wired up due to the CBOR serialization issue described above. To see the full flow including Player B joining and the resolve step, run the Node.js scripts directly: + +```bash +cd pyth-coin-stable-front/src + +# Make sure your .env has BLOCKFROST_ID, PYTH_TOKEN, BACKEND_PKH, MNEMONIC, PYTH_POLICY_ID +node depositA.mjs # Creates the duel on-chain +node depositB.mjs # Player B joins, Pyth prices verified on-chain +node resolve.mjs # Resolves the duel, winner gets the pot + horseshoe token +``` + +Each script prints the transaction hash and a Cardano explorer link so you can follow every step on-chain. + +--- + +## ๐Ÿš€ Getting Started + +### Prerequisites + +- Node.js 18+ +- A Cardano testnet wallet (Nami, Eternl, or similar) with test ADA +- Blockfrost API key ([free tier](https://blockfrost.io) works) +- Pyth Lazer access token + +### Run the Frontend + +```bash +cd pyth-coin-stable-front +npm install +npm run dev +``` + +Open [http://localhost:3000](http://localhost:3000) โ€” you'll see the live demo with real Pyth prices! + +### Build the Smart Contracts + +```bash +cd pyth-coin-stable-validators +aiken build +``` + +Compiled output goes to `plutus.json`. Apply parameters using MeshJS or cardano-cli before deployment. + +### Environment Variables + +Create a `.env.local` in `pyth-coin-stable-front/`: + +```env +PYTH_TOKEN= +BLOCKFROST_ID= +BACKEND_PKH= +MNEMONIC= +``` + +### Run the End-to-End Test Flow + +```bash +cd pyth-coin-stable-front +node src/testFlow.mjs +``` + +This simulates the full lifecycle on Cardano preprod: **Deposit A โ†’ Deposit B โ†’ Resolve**, with real Pyth prices and real on-chain transactions. + +--- + +## ๐Ÿง  Design Decisions + +**Why a 0.0001% draw threshold?** +Crypto prices are volatile, but tiny differences at the millisecond level are noise. A 0.0001% minimum gap ensures the winner meaningfully outperformed โ€” not won by rounding error. + +**Why in-memory session store?** +For the hackathon, this keeps the backend dependency-free and fast to demo. In production, this would be replaced with a persistent DB or a fully on-chain state derivation from UTxO history. + +**Why MeshJS?** +MeshJS is the most ergonomic Cardano transaction builder for JavaScript. It handles CBOR serialization, multi-sig, and wallet integration in a way that pairs naturally with Next.js. + +**Why Aiken?** +Aiken is purpose-built for Cardano. It compiles directly to Plutus v3, has excellent tooling, and is significantly more readable than raw Plutus Haskell โ€” great for a 24-hour hackathon. + +**Why Pyth Lazer specifically?** +Lazer provides the zero-withdrawal pattern: prices are verified **inside the transaction itself**, making the outcome fully trustless and auditable without any off-chain oracle trust assumptions. + +--- + +## ๐Ÿ‘ฅ Team + +**LAFHIS** โ€” We are students from LaFHIS lab at UBA. Built at Buenos Aires Pythathon, March 22, 2026. + +- **Felicitas Garcia** โ€” felicitasgarcia01@gmail.com +- **Ian Grinspan** โ€” iangrinspan7@gmail.com +- **Matias Waisman** โ€” matiasewaisman@gmail.com + +Built with โค๏ธ, Cardano, Pyth Lazer, Aiken, MeshJS, and a lot of โ˜•. + +--- + +## ๐Ÿ”ญ Future Work + +Ideas for what comes next: + +- **๐Ÿ“‰ Short positions** โ€” Let players bet on an asset going *down*, not just up. The validator would need to distinguish long vs. short positions per player. +- **๐Ÿ† Leaderboard** โ€” Winners receive Horseshoe tokens on-chain. A leaderboard could rank players by Horseshoe balance, making every duel meaningful beyond the pot. +- **๐Ÿด Horse Sprite Marketplace** โ€” A marketplace where players spend Horseshoes to purchase NFT horse sprites. Each sprite is a unique Cardano NFT that customizes your horse in the race UI โ€” turning Horseshoes into a real in-game economy. +- **๐Ÿช™ More assets** โ€” Expand beyond ADA/BTC/ETH/BNB to any feed available on Pyth (SOL, MATIC, AVAX, forex, commodities...). +- **โฑ๏ธ Configurable duel duration** โ€” Let the duel creator choose how long the race lasts (30s, 5min, 1h). The deadline is already a parameter in the datum. +- **โš”๏ธ Battle Royale** โ€” More than two players in a single duel. The validator would need to generalize from two players to N, with a winner-takes-all or tiered payout. + +--- + +> โš ๏ธ *This project was built in ~24 hours as a hackathon proof-of-concept. Smart contracts are unaudited โ€” do not use on mainnet with real funds.* diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/.env.example b/lazer/cardano/lafhis/pyth-coin-stable-front/.env.example new file mode 100644 index 00000000..de3fbd1f --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/.env.example @@ -0,0 +1,8 @@ +# Required for the web app on-chain flow +BLOCKFROST_ID= +PYTH_POLICY_ID= +BACKEND_PKH= +MNEMONIC="word1 word2 word3 ..." + +# Required only for standalone scripts in src/*.mjs +PYTH_TOKEN= diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/.eslintrc.json b/lazer/cardano/lafhis/pyth-coin-stable-front/.eslintrc.json new file mode 100644 index 00000000..37224185 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["next/core-web-vitals", "next/typescript"] +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/.gitignore b/lazer/cardano/lafhis/pyth-coin-stable-front/.gitignore new file mode 100644 index 00000000..1a1d40c7 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/.gitignore @@ -0,0 +1,43 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# env files (can opt-in for committing if needed) +.env* +!.env.example + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +package-lock.json diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/README.md b/lazer/cardano/lafhis/pyth-coin-stable-front/README.md new file mode 100644 index 00000000..fec5b77e --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/README.md @@ -0,0 +1,124 @@ +# pyth-coin-stable-front + +Next.js frontend for creating and joining Cardano duels and for driving the on-chain deposit flow backed by Pyth price data. + +## What is included + +- Landing page and duel UI +- Create game / join game flow +- Next.js API routes for temporary game state +- Client and server transaction helpers for `depositA` and `depositB` +- Standalone Node scripts for end-to-end on-chain testing + +## Important assumptions + +- The app is currently wired for **Cardano preprod**. +- Local game state is stored in memory in [`src/server/gameStore.ts`](/home/mati/Facu/pyth-examples/lazer/cardano/lafhis/pyth-coin-stable-front/src/server/gameStore.ts), so restarting the Next server clears all lobbies. +- The backend reads `../pyth-coin-stable-validators/plutus.json`. If that file is missing, the on-chain routes will fail. + +Expected folder layout: + +```text +parent/ +โ”œโ”€โ”€ pyth-coin-stable-front/ +โ””โ”€โ”€ pyth-coin-stable-validators/ + โ””โ”€โ”€ plutus.json +``` + +## Requirements + +- Node.js 20+ recommended +- npm +- A CIP-30 Cardano wallet extension in the browser +- A funded preprod wallet if you want to test real transactions +- A Blockfrost project ID for Cardano preprod +- The backend wallet mnemonic and its payment key hash (`BACKEND_PKH`) + +## Installation + +```bash +npm install +``` + +## Environment variables + +Use the example file as a starting point: + +```bash +cp .env.example .env.local +``` + +If you want to run the standalone scripts in `src/*.mjs`, also copy the same values to `.env` because those scripts load environment variables with `dotenv`: + +```bash +cp .env.example .env +``` + +### Required for the web app on-chain flow + +These variables are needed to create and join games from the UI: + +```env +BLOCKFROST_ID=... +PYTH_POLICY_ID=... +BACKEND_PKH=... +MNEMONIC="word1 word2 word3 ..." +``` + +Notes: + +- `MNEMONIC` is required by the Next.js API routes that co-sign and submit transactions. +- `BACKEND_PKH` must be the payment key hash of the backend wallet used to sign those transactions. +- `../pyth-coin-stable-validators/plutus.json` must exist and contain the compiled validators used by the API routes. + +### Required only for standalone scripts + +These scripts also need a Pyth token, they are examples of transactions that work using our validator: + +- [`src/testFlow.mjs`](/home/mati/Facu/pyth-examples/lazer/cardano/lafhis/pyth-coin-stable-front/src/testFlow.mjs) +- [`src/depositA.mjs`](/home/mati/Facu/pyth-examples/lazer/cardano/lafhis/pyth-coin-stable-front/src/depositA.mjs) +- [`src/depositB.mjs`](/home/mati/Facu/pyth-examples/lazer/cardano/lafhis/pyth-coin-stable-front/src/depositB.mjs) +- [`src/resolve.mjs`](/home/mati/Facu/pyth-examples/lazer/cardano/lafhis/pyth-coin-stable-front/src/resolve.mjs) + +```env +PYTH_TOKEN=... +``` + +## Run locally + +```bash +npm run dev +``` + +Open `http://localhost:3000`. + +Useful routes: + +- `/` +- `/create-game` +- `/join-game` + +## Production build + +```bash +npm run build +npm run start +``` + +## Standalone scripts + +The repository also includes direct Node scripts for manual testing: + +```bash +node src/testFlow.mjs +node src/depositA.mjs +node src/depositB.mjs +node src/resolve.mjs +``` + +Those scripts assume: + +- `.env` exists +- `PYTH_TOKEN` is set +- `../pyth-coin-stable-validators/plutus.json` exists +- the backend wallet has funds on preprod diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/next.config.ts b/lazer/cardano/lafhis/pyth-coin-stable-front/next.config.ts new file mode 100644 index 00000000..2f6491cf --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + reactStrictMode: true, +}; + +export default nextConfig; diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/package.json b/lazer/cardano/lafhis/pyth-coin-stable-front/package.json new file mode 100644 index 00000000..53d12a9e --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/package.json @@ -0,0 +1,34 @@ +{ + "name": "pyth-coin-stable", + "description": "A Mesh starter template for NextJS", + "author": "MeshJS", + "license": "Apache-2.0", + "version": "0.1.0", + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@meshsdk/core": "^1.9.0-beta.0", + "@meshsdk/react": "^1.9.0-beta.0", + "@pythnetwork/hermes-client": "^2.1.0", + "@pythnetwork/pyth-lazer-sdk": "^2.0.0", + "bech32": "^2.0.0", + "dotenv": "^17.3.1", + "next": "^16.2.1", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "15.0.3", + "postcss": "^8", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/postcss.config.mjs b/lazer/cardano/lafhis/pyth-coin-stable-front/postcss.config.mjs new file mode 100644 index 00000000..1a69fd2a --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/public/favicon.ico b/lazer/cardano/lafhis/pyth-coin-stable-front/public/favicon.ico new file mode 100644 index 00000000..4eaae35e Binary files /dev/null and b/lazer/cardano/lafhis/pyth-coin-stable-front/public/favicon.ico differ diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.21.30_PM-removebg-preview.png b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.21.30_PM-removebg-preview.png new file mode 100644 index 00000000..a366c6cd Binary files /dev/null and b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.21.30_PM-removebg-preview.png differ diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.21.35_PM-removebg-preview.png b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.21.35_PM-removebg-preview.png new file mode 100644 index 00000000..6dc166ae Binary files /dev/null and b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.21.35_PM-removebg-preview.png differ diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.21.42_PM-removebg-preview.png b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.21.42_PM-removebg-preview.png new file mode 100644 index 00000000..a66064c0 Binary files /dev/null and b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.21.42_PM-removebg-preview.png differ diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.22.00_PM-removebg-preview.png b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.22.00_PM-removebg-preview.png new file mode 100644 index 00000000..3df1aa0e Binary files /dev/null and b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.22.00_PM-removebg-preview.png differ diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.22.06_PM-removebg-preview.png b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.22.06_PM-removebg-preview.png new file mode 100644 index 00000000..a23a0f9b Binary files /dev/null and b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.22.06_PM-removebg-preview.png differ diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.22.13_PM-removebg-preview.png b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.22.13_PM-removebg-preview.png new file mode 100644 index 00000000..abe3c70d Binary files /dev/null and b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.22.13_PM-removebg-preview.png differ diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.22.19_PM-removebg-preview.png b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.22.19_PM-removebg-preview.png new file mode 100644 index 00000000..d6e1035f Binary files /dev/null and b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/Screenshot_2026-03-22_at_3.22.19_PM-removebg-preview.png differ diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/biglogo.png b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/biglogo.png new file mode 100644 index 00000000..d2bc5902 Binary files /dev/null and b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/biglogo.png differ diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/horseshoe.png b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/horseshoe.png new file mode 100644 index 00000000..d6e1035f Binary files /dev/null and b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/horseshoe.png differ diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/logo.png b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/logo.png new file mode 100644 index 00000000..4eaae35e Binary files /dev/null and b/lazer/cardano/lafhis/pyth-coin-stable-front/public/img/logo.png differ diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/CreateGameConfigBar.tsx b/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/CreateGameConfigBar.tsx new file mode 100644 index 00000000..bf5dd055 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/CreateGameConfigBar.tsx @@ -0,0 +1,128 @@ +import { useMemo, useState } from "react"; + +const RATE_OPTIONS = ["ADA/USD", "BTC/USD", "ETH/USD", "BNB/USD"] as const; +const DURATION_OPTIONS = [ + { label: "1 minute", value: "1m" }, + { label: "5 minutes", value: "5m" }, + { label: "1 hour", value: "1h" }, +] as const; + +export type CreateGameConfigInput = { + rate: (typeof RATE_OPTIONS)[number]; + betAda: number; + duration: (typeof DURATION_OPTIONS)[number]["value"]; +}; + +type CreateGameConfigBarProps = { + creating?: boolean; + error?: string | null; + onCreate?: (config: CreateGameConfigInput) => void | Promise; +}; + +export default function CreateGameConfigBar({ + creating = false, + error = null, + onCreate, +}: CreateGameConfigBarProps) { + const [selectedRate, setSelectedRate] = useState<(typeof RATE_OPTIONS)[number]>("ADA/USD"); + const [selectedBet, setSelectedBet] = useState("10"); + const [selectedDuration, setSelectedDuration] = useState<(typeof DURATION_OPTIONS)[number]["value"]>( + "1m", + ); + + const selectedDurationLabel = useMemo( + () => DURATION_OPTIONS.find((option) => option.value === selectedDuration)?.label ?? selectedDuration, + [selectedDuration], + ); + const betAda = Number(selectedBet); + const canCreate = Number.isFinite(betAda) && betAda >= 5 && !creating; + + return ( +
+

+ Create Game Setup +

+ +
+
+

+ 1. Rate +

+ +
+ +
+

+ 2. Bet +

+
+ setSelectedBet(e.target.value)} + placeholder="Min 5" + className="bet-input-no-spinner w-full bg-transparent text-xs font-bold text-slate-100 outline-none" + /> + ADA +
+
+ +
+

+ 3. Duration +

+ +
+
+ +
+
+

+ Current selection: {selectedRate} | {selectedBet || "0"} ADA |{" "} + {selectedDurationLabel} +

+ +
+ {error &&

{error}

} +
+
+ ); +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/DuelPreview.tsx b/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/DuelPreview.tsx new file mode 100644 index 00000000..387eb1be --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/DuelPreview.tsx @@ -0,0 +1,369 @@ +import { HermesClient } from "@pythnetwork/hermes-client"; +import { useEffect, useRef, useState } from "react"; +import type { GameDuration } from "@/types/game"; + +// โ”€โ”€โ”€ Confetti โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +const CONFETTI_COLORS = [ + "#a78bfa", "#818cf8", "#34d399", "#f472b6", + "#fbbf24", "#60a5fa", "#f87171", "#c084fc", +]; + +type Particle = { + id: number; x: number; delay: number; duration: number; + color: string; size: number; drift: number; shape: "rect" | "circle"; +}; + +function makeParticles(n: number): Particle[] { + return Array.from({ length: n }, (_, i) => ({ + id: i, + x: Math.random() * 100, + delay: Math.random() * 1.2, + duration: 2.2 + Math.random() * 1.6, + color: CONFETTI_COLORS[Math.floor(Math.random() * CONFETTI_COLORS.length)]!, + size: 5 + Math.random() * 6, + drift: (Math.random() - 0.5) * 60, + shape: Math.random() > 0.5 ? "rect" : "circle", + })); +} + +function Confetti() { + const [particles] = useState(() => makeParticles(60)); + return ( +
+ {particles.map((p) => ( +
+ ))} + +
+ ); +} + +type RaceState = "idle" | "running" | "finished"; + +const DURATION_SECONDS: Record = { + "1m": 60, + "5m": 300, + "1h": 3600, +}; + +async function fetchLatestPrices( + client: HermesClient, + ids: Record, +): Promise | null> { + try { + const updates = await client.getLatestPriceUpdates(Object.values(ids)); + const parsed = updates.parsed ?? []; + const result: Record = {}; + for (const feed of parsed) { + const entry = Object.entries(ids).find(([, id]) => id === feed.id); + if (entry) result[entry[0]] = Number(feed.price.price) * Math.pow(10, feed.price.expo); + } + return result; + } catch { + return null; + } +} + +function Bar({ pct, scaleMax, color }: { pct: number; scaleMax: number; color: "violet" | "cyan" }) { + const negative = pct < 0; + const halfFill = Math.min((Math.abs(pct) / scaleMax) * 50, 50); + const bg = negative + ? "bg-red-500 shadow-[0_0_6px_rgba(239,68,68,0.6)]" + : color === "violet" + ? "bg-violet-500 shadow-[0_0_6px_rgba(124,58,237,0.7)]" + : "bg-cyan-400 shadow-[0_0_6px_rgba(34,211,238,0.7)]"; + + return ( +
+
+
+
+ ); +} + +function Lane({ + sym, color, currentPrice, pctChange, scaleMax, leading, winner, raceState, +}: { + sym: string; color: "violet" | "cyan"; currentPrice: number | null; + pctChange: number | null; scaleMax: number; leading: boolean; + winner: boolean; raceState: RaceState; +}) { + const text = color === "violet" ? "text-violet-300" : "text-cyan-300"; + const border = color === "violet" ? "border-violet-500/30" : "border-cyan-500/25"; + const negative = pctChange !== null && pctChange < 0; + const pctColor = negative ? "text-red-400" : "text-emerald-400"; + + return ( +
+ {winner && ( + <> + trophy + + + )} +
+
+ {sym} +
+ {winner && ( + ๐Ÿ† winner + )} + {leading && !winner && ( + leading + )} + {raceState === "idle" && currentPrice !== null && ( + + ${currentPrice < 10 ? currentPrice.toFixed(4) : currentPrice.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })} + + )} + {raceState !== "idle" && pctChange !== null && ( + + {pctChange >= 0 ? "+" : ""}{pctChange.toFixed(3)}% + + )} + {raceState !== "idle" && pctChange === null && ( + loadingโ€ฆ + )} +
+
+ {raceState !== "idle" && ( + <> + +
+ -{scaleMax.toFixed(2)}% + 0 + +{scaleMax.toFixed(2)}% +
+ + )} +
+
+ ); +} + +type DuelPreviewProps = { + symA?: string; + symB?: string; + autoStart?: boolean; + duration?: GameDuration; +}; + +export default function DuelPreview({ + symA = "ADA/USD", + symB = "BTC/USD", + autoStart = false, + duration = "1m", +}: DuelPreviewProps) { + const raceSecs = DURATION_SECONDS[duration]; + + const [raceState, setRaceState] = useState("idle"); + const [seconds, setSeconds] = useState(raceSecs); + const [currentPrices, setCurrentPrices] = useState>({}); + const [startPrices, setStartPrices] = useState>({}); + const [error, setError] = useState(null); + const [ready, setReady] = useState(false); + + const clientRef = useRef(null); + const feedIdsRef = useRef | null>(null); + const pollRef = useRef | null>(null); + const countdownRef = useRef | null>(null); + + useEffect(() => { + const client = new HermesClient("https://hermes.pyth.network", {}); + clientRef.current = client; + const symbols = [symA, symB]; + + void (async () => { + try { + const allFeeds = await client.getPriceFeeds({ assetType: "crypto" }); + const ids: Record = {}; + for (const feed of allFeeds) { + const sym = (feed.attributes.display_symbol ?? "").toUpperCase(); + if (symbols.includes(sym)) ids[sym] = feed.id; + } + if (!ids[symA] || !ids[symB]) return; + feedIdsRef.current = ids; + + const prices = await fetchLatestPrices(client, ids); + if (prices) setCurrentPrices(prices); + setReady(true); + + if (autoStart) void triggerStart(client, ids); + } catch { + setError("Could not connect to Pyth."); + } + })(); + + return () => { + if (pollRef.current) clearInterval(pollRef.current); + if (countdownRef.current) clearInterval(countdownRef.current); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [symA, symB, autoStart]); + + async function triggerStart(client: HermesClient, ids: Record) { + const prices = await fetchLatestPrices(client, ids); + if (!prices) { setError("Failed to fetch prices. Try again."); return; } + + setStartPrices(prices); + setCurrentPrices(prices); + setSeconds(raceSecs); + setRaceState("running"); + + pollRef.current = setInterval(() => { + void fetchLatestPrices(client, ids).then((p) => { if (p) setCurrentPrices(p); }); + }, 3000); + + let s = raceSecs; + countdownRef.current = setInterval(() => { + s -= 1; + setSeconds(s); + if (s <= 0) { + clearInterval(countdownRef.current!); + clearInterval(pollRef.current!); + setRaceState("finished"); + } + }, 1000); + } + + async function startRace() { + if (!clientRef.current || !feedIdsRef.current) return; + setError(null); + await triggerStart(clientRef.current, feedIdsRef.current); + } + + function resetRace() { + if (pollRef.current) clearInterval(pollRef.current); + if (countdownRef.current) clearInterval(countdownRef.current); + setRaceState("idle"); + setSeconds(raceSecs); + setStartPrices({}); + if (clientRef.current && feedIdsRef.current) { + void fetchLatestPrices(clientRef.current, feedIdsRef.current).then((p) => { + if (p) setCurrentPrices(p); + }); + } + } + + function getPct(sym: string): number | null { + const start = startPrices[sym]; + const cur = currentPrices[sym]; + if (!start || !cur) return null; + return ((cur - start) / start) * 100; + } + + const pctA = getPct(symA); + const pctB = getPct(symB); + const aLeading = pctA !== null && pctB !== null && pctA >= pctB; + const winner = + raceState === "finished" && pctA !== null && pctB !== null + ? pctA >= pctB ? symA : symB + : null; + + const scaleMax = Math.max(0.15, Math.abs(pctA ?? 0), Math.abs(pctB ?? 0)); + + const mm = String(Math.floor(seconds / 60)).padStart(2, "0"); + const ss = String(seconds % 60).padStart(2, "0"); + const isDemo = !autoStart; + + return ( +
+ {raceState === "finished" && } +
+

+ {isDemo ? "Demo Duel" : "Live Race"} +

+ + {raceState === "running" ? "โ— live" : raceState === "finished" ? "finished" : ready ? "ready" : "loadingโ€ฆ"} + +
+ +
+ + + +
+ +
+
+ + + + + {mm}:{ss} + +
+ + {raceState === "idle" && !autoStart && ( + + )} + {raceState === "running" && ( + Fetching live from Pythโ€ฆ + )} + {raceState === "finished" && !autoStart && ( + + )} +
+ + {error &&

{error}

} + +

+ {raceState === "idle" + ? "Live prices from Pyth ยท press Start to begin" + : raceState === "running" + ? "Highest % change at end of window wins the pot" + : `${winner} wins this ${isDemo ? "demo round" : "race"}`} +

+
+ ); +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/JoinGameConfigBar.tsx b/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/JoinGameConfigBar.tsx new file mode 100644 index 00000000..29fdcc34 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/JoinGameConfigBar.tsx @@ -0,0 +1,128 @@ +import { useEffect, useState } from "react"; +import type { GameRate } from "@/types/game"; + +const RATE_OPTIONS: GameRate[] = ["ADA/USD", "BTC/USD", "ETH/USD", "BNB/USD"]; + +export type JoinGameInput = { + selectedRate: GameRate; + gameInput: string; +}; + +type JoinGameConfigBarProps = { + joining?: boolean; + error?: string | null; + initialGameInput?: string; + gameInput?: string; + onGameInputChange?: (value: string) => void; + preview?: { + opponentRate: GameRate; + betAda: number; + gameId: string; + } | null; + previewLoading?: boolean; + previewError?: string | null; + onJoin?: (input: JoinGameInput) => void | Promise; +}; + +export default function JoinGameConfigBar({ + joining = false, + error = null, + initialGameInput = "", + gameInput, + onGameInputChange, + preview = null, + previewLoading = false, + previewError = null, + onJoin, +}: JoinGameConfigBarProps) { + const [selectedRate, setSelectedRate] = useState("BTC/USD"); + const [localGameInput, setLocalGameInput] = useState(initialGameInput); + const [origin, setOrigin] = useState(""); + const effectiveGameInput = gameInput ?? localGameInput; + const canJoin = effectiveGameInput.trim().length > 0 && !joining; + const exampleUrl = `${origin || "https://your-app"}/game/EXAMPLE123`; + + useEffect(() => { + if (typeof window !== "undefined") { + setOrigin(window.location.origin); + } + }, []); + + return ( +
+

Join Game Setup

+ +
+
+

+ 1. Choose Asset +

+ +
+ +
+

+ 2. Game ID or Link +

+ { + const value = e.target.value; + if (onGameInputChange) { + onGameInputChange(value); + return; + } + setLocalGameInput(value); + }} + placeholder={`EXAMPLE123 or ${exampleUrl}`} + className="w-full rounded-lg border border-violet-500/35 bg-slate-950/70 px-3 py-2 text-xs font-bold text-slate-100 outline-none transition focus:border-violet-400/75" + /> +
+
+ +
+

Game Preview

+ {previewLoading &&

Loading game data...

} + {!previewLoading && preview && ( +

+ Opponent asset: {preview.opponentRate} | Bet amount:{" "} + {preview.betAda} ADA | Game ID: {preview.gameId} +

+ )} + {!previewLoading && !preview && !previewError &&

Paste a game link or ID to load game details.

} + {!previewLoading && previewError &&

{previewError}

} +
+ +
+
+

+ Current selection: {selectedRate} |{" "} + {effectiveGameInput.trim() || "No game id"} +

+ +
+ {error &&

{error}

} +
+
+ ); +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/Navbar.tsx b/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/Navbar.tsx new file mode 100644 index 00000000..0f750630 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/Navbar.tsx @@ -0,0 +1,62 @@ +import { CardanoWallet, useWallet } from "@meshsdk/react"; +import Link from "next/link"; +import { useEffect, useState } from "react"; + +const HORSESHOE_HEX = Buffer.from("horseshoe", "utf-8").toString("hex"); + +function HorseshoeCounter() { + const { wallet, connected } = useWallet(); + const [count, setCount] = useState(null); + + useEffect(() => { + if (!connected) { setCount(null); return; } + void (async () => { + try { + const assets = await wallet.getAssets(); + const total = assets + .filter((a) => (a.unit as string).toLowerCase().endsWith(HORSESHOE_HEX)) + .reduce((sum, a) => sum + Number(a.quantity), 0); + setCount(total); + } catch { + setCount(null); + } + })(); + }, [connected, wallet]); + + if (!connected || count === null) return null; + + return ( +
+ horseshoe + {count} +
+ ); +} + +export default function Navbar() { + return ( + + ); +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/PriceTicker.tsx b/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/PriceTicker.tsx new file mode 100644 index 00000000..c0fe86f3 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/PriceTicker.tsx @@ -0,0 +1,75 @@ +import { HermesClient } from "@pythnetwork/hermes-client"; +import { useEffect, useState } from "react"; + +type TickerItem = { + symbol: string; + price: number; +}; + +function formatPrice(price: number): string { + if (price >= 1000) return price.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 }); + if (price >= 1) return price.toFixed(4); + return price.toFixed(6); +} + +export default function PriceTicker() { + const [items, setItems] = useState([]); + + useEffect(() => { + async function fetchPrices() { + try { + const client = new HermesClient("https://hermes.pyth.network", {}); + const allFeeds = await client.getPriceFeeds({ assetType: "crypto" }); + + const usdFeeds = allFeeds + .filter((f) => (f.attributes.display_symbol ?? "").toUpperCase().endsWith("/USD")) + .slice(0, 40); + + const ids = usdFeeds.map((f) => f.id); + const idToSymbol = Object.fromEntries( + usdFeeds.map((f) => [f.id, f.attributes.display_symbol as string]), + ); + + const updates = await client.getLatestPriceUpdates(ids); + const parsed = updates.parsed ?? []; + + const tickerItems: TickerItem[] = parsed + .map((feed) => ({ + symbol: idToSymbol[feed.id] ?? feed.id, + price: Number(feed.price.price) * Math.pow(10, feed.price.expo), + })) + .filter((item) => item.price > 0); + + setItems(tickerItems); + } catch (e) { + console.error("Ticker fetch failed", e); + } + } + + void fetchPrices(); + }, []); + + if (items.length === 0) { + return ( +
+

Loading live prices...

+
+ ); + } + + const doubled = [...items, ...items]; + + return ( +
+
+ {doubled.map((item, i) => ( + + {item.symbol} + ${formatPrice(item.price)} + ยท + + ))} +
+
+ ); +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/PythFeedLogger.tsx b/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/PythFeedLogger.tsx new file mode 100644 index 00000000..45f4767b --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/PythFeedLogger.tsx @@ -0,0 +1,55 @@ +import { HermesClient } from "@pythnetwork/hermes-client"; +import { useEffect, useRef } from "react"; + +const TARGET_SYMBOLS = new Set(["ADA/USD", "BTC/USD", "ETH/USD", "BNB/USD"]); + +export default function PythFeedLogger() { + const hasFetched = useRef(false); + + useEffect(() => { + if (hasFetched.current) return; + hasFetched.current = true; + + let isMounted = true; + + async function logPriceFeeds() { + try { + const connection = new HermesClient("https://hermes.pyth.network", {}); + const allFeeds = await connection.getPriceFeeds({ assetType: "crypto" }); + const selectedFeeds = allFeeds.filter((feed) => + TARGET_SYMBOLS.has((feed.attributes.display_symbol ?? "").toUpperCase()), + ); + const priceIds = selectedFeeds.map((feed) => feed.id); + + if (priceIds.length === 0) { + console.warn("No feeds found for ADA/USD, BTC/USD, ETH/USD, and BNB/USD."); + return; + } + + const idToTicker = Object.fromEntries( + selectedFeeds.map((feed) => [feed.id, feed.attributes.display_symbol]), + ); + + const priceUpdates = await connection.getLatestPriceUpdates(priceIds); + if (!isMounted) return; + + const parsedUpdates = priceUpdates.parsed ?? []; + for (const feed of parsedUpdates) { + const price = Number(feed.price.price) * Math.pow(10, feed.price.expo); + const ticker = idToTicker[feed.id] ?? feed.id; + console.log(`${ticker}: $${price.toFixed(2)}`); + } + } catch (error) { + console.error("Error loading Hermes price feeds:", error); + } + } + + void logPriceFeeds(); + + return () => { + isMounted = false; + }; + }, []); + + return null; +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/RequireWallet.tsx b/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/RequireWallet.tsx new file mode 100644 index 00000000..9722adb3 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/components/RequireWallet.tsx @@ -0,0 +1,30 @@ +import { CardanoWallet, useWallet } from "@meshsdk/react"; +import type { ReactNode } from "react"; + +type RequireWalletProps = { + children: ReactNode; + title?: string; + description?: string; +}; + +export default function RequireWallet({ + children, + title = "Connect Wallet", + description = "You need to connect your wallet to continue.", +}: RequireWalletProps) { + const { connected } = useWallet(); + + if (!connected) { + return ( +
+

{title}

+

{description}

+
+ +
+
+ ); + } + + return <>{children}; +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/context/WalletContext.tsx b/lazer/cardano/lafhis/pyth-coin-stable-front/src/context/WalletContext.tsx new file mode 100644 index 00000000..b3eb7b3a --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/context/WalletContext.tsx @@ -0,0 +1,91 @@ +import { createContext, useCallback, useContext, useMemo, useState } from "react"; + +type WalletContextValue = { + connected: boolean; + walletName: string | null; + balanceAda: string | null; + changeAddress: string | null; + networkId: number | null; + connect: () => Promise; + disconnect: () => void; +}; + +const WalletContext = createContext(null); + +export function WalletProvider({ children }: { children: React.ReactNode }) { + const [connected, setConnected] = useState(false); + const [walletName, setWalletName] = useState(null); + const [balanceAda, setBalanceAda] = useState(null); + const [changeAddress, setChangeAddress] = useState(null); + const [networkId, setNetworkId] = useState(null); + + const connect = useCallback(async () => { + const { BrowserWallet } = await import("@meshsdk/wallet"); + + const wallets = BrowserWallet.getInstalledWallets(); + if (wallets.length === 0) { + console.warn("[wallet] no installed wallets found by Mesh BrowserWallet"); + return; + } + + const selectedWallet = wallets[0]?.name; + if (!selectedWallet) { + console.warn("[wallet] wallet list is empty"); + return; + } + + const wallet = await BrowserWallet.enable(selectedWallet); + const [assets, address, currentNetwork] = await Promise.all([ + wallet.getBalance(), + wallet.getChangeAddress(), + wallet.getNetworkId(), + ]); + + const lovelace = assets.find((asset) => asset.unit === "lovelace")?.quantity ?? "0"; + const ada = (Number(lovelace) / 1_000_000).toFixed(6); + + setConnected(true); + setWalletName(selectedWallet); + setBalanceAda(ada); + setChangeAddress(address); + setNetworkId(currentNetwork); + + console.log(`[wallet] connected (Mesh): ${selectedWallet}`); + console.log(`[wallet] networkId: ${currentNetwork}`); + console.log(`[wallet] lovelace: ${lovelace}`); + console.log(`[wallet] balance (ADA): ${ada}`); + console.log(`[wallet] change address (hex): ${address}`); + }, []); + + const disconnect = useCallback(() => { + setConnected(false); + setWalletName(null); + setBalanceAda(null); + setChangeAddress(null); + setNetworkId(null); + console.log("[wallet] disconnected"); + }, []); + + const value = useMemo( + () => ({ + connected, + walletName, + balanceAda, + changeAddress, + networkId, + connect, + disconnect, + }), + [connected, walletName, balanceAda, changeAddress, networkId, connect, disconnect], + ); + + return {children}; +} + +export function useWalletContext() { + const ctx = useContext(WalletContext); + if (!ctx) { + throw new Error("useWalletContext must be used inside WalletProvider"); + } + return ctx; +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/depositA.mjs b/lazer/cardano/lafhis/pyth-coin-stable-front/src/depositA.mjs new file mode 100644 index 00000000..d98bb321 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/depositA.mjs @@ -0,0 +1,308 @@ +/** + * testFlow.mjs + * + * End-to-end test of the Duelo de Traders transaction flow + * using always-true validators as placeholders. + * + * Flow: + * 1. DepositA โ€“ Player A creates a duel (mint NFT + send ADA to script) + * 2. DepositB โ€“ Player B joins (consume Waiting โ†’ create Active, Pyth prices) + * 3. Resolve โ€“ Backend resolves (consume Active โ†’ pay winner, mint victory token) + * + * All three use the same wallet (for testing). In production they'd be separate. + * + * โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + * Setup: + * + * 1. Add always_true.ak to your Aiken project, run `aiken build` + * 2. From plutus.json, grab the compiledCode for: + * always_true_spend.spend โ†’ spendScriptDouble + * always_true_mint.mint โ†’ mintScriptDouble + * 3. Put them in .env (see below) + * 4. Fund the wallet with preprod tADA + * 5. Run: node testFlow.mjs + * + * โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + * .env: + * + * PYTH_TOKEN=... + * BLOCKFROST_ID=... + * PYTH_POLICY_ID=... + * spendScriptDouble=... (from plutus.json โ†’ always_true_spend) + * mintScriptDouble=... (from plutus.json โ†’ always_true_mint) + */ + +import { + BlockfrostProvider, + MeshWallet, + MeshTxBuilder, + resolveScriptHash, + serializePlutusScript, + applyParamsToScript, + mConStr0, + mConStr1, + resolveSlotNo, +} from "@meshsdk/core"; +import { createHash } from "crypto"; +import { writeFileSync } from "fs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +import dotenv from "dotenv"; +dotenv.config(); + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const DUEL_STATE_FILE = resolve(__dirname, "../duel-state.json"); + + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// CONFIG +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +const required = (name) => { + const v = process.env[name]; + if (!v) { console.error(`Missing env var: ${name}`); process.exit(1); } + return v; +}; + +const BLOCKFROST_ID = required("BLOCKFROST_ID"); +const PYTH_POLICY_ID = required("PYTH_POLICY_ID"); +const BACKEND_PKH = required("BACKEND_PKH"); +const MNEMONIC = required("MNEMONIC").split(" "); + + +const FEED_A = 16; // ADA/USD. TODO: parameter +const BET_LOVELACE = 5_000_000; // 5 ADA. TODO: parameter + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// SCRIPT SETUP โ€” apply parameters to real validators +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +// Encode a hex string as a CBOR bytes param for applyParamsToScript("CBOR") +const cborBytesParam = (hex) => { + const len = hex.length / 2; + if (len < 24) return (0x40 | len).toString(16).padStart(2, "0") + hex; + if (len < 256) return "58" + len.toString(16).padStart(2, "0") + hex; + return "59" + (len >> 8).toString(16).padStart(2, "0") + (len & 0xff).toString(16).padStart(2, "0") + hex; +}; + +// Load compiledCode from plutus.json +const { readFileSync: _readFileSync } = await import("fs"); +const _plutus = JSON.parse(_readFileSync( + new URL("../../pyth-coin-stable-validators/plutus.json", import.meta.url), "utf8" +)); +const NFT_COMPILED_CODE = _plutus.validators.find((v) => v.title === "nft.nft_policy.mint").compiledCode; +const BET_COMPILED_CODE = _plutus.validators.find((v) => v.title === "validators.bet.spend").compiledCode; + +// nft_policy(backend_pkh) +const mintScriptCbor = applyParamsToScript(NFT_COMPILED_CODE, [cborBytesParam(BACKEND_PKH)], "CBOR"); +const mintPolicyId = resolveScriptHash(mintScriptCbor, "V3"); + +// bet(backend_pkh, nft_policy_id, pyth_id) +const spendScriptCbor = applyParamsToScript(BET_COMPILED_CODE, [ + cborBytesParam(BACKEND_PKH), + cborBytesParam(mintPolicyId), + cborBytesParam(PYTH_POLICY_ID), +], "CBOR"); +const spendScriptHash = resolveScriptHash(spendScriptCbor, "V3"); + +const scriptAddress = serializePlutusScript( + { code: spendScriptCbor, version: "V3" }, + undefined, + 0, + false, +).address; + +console.log("Spend script hash:", spendScriptHash); +console.log("Mint policy ID:", mintPolicyId); +console.log("Script address:", scriptAddress); +console.log(); + + + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// PLUTUS DATA HELPERS +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +const someD = (inner) => mConStr0([inner]); +const noneD = () => mConStr1([]); + +const playerD = ({ pkh, feedId, startPrice }) => + mConStr0([pkh, feedId, startPrice != null ? someD(startPrice) : noneD()]); + +const duelDatumD = ({ duelId, playerA, playerB, betLovelace, statusIdx, deadline }) => + mConStr0([ + duelId, + playerD(playerA), + playerB ? someD(playerD(playerB)) : noneD(), + betLovelace, + statusIdx === 0 ? mConStr0([]) : mConStr1([]), + deadline != null ? someD(deadline) : noneD(), + ]); + +// Aiken's TransactionId is a type alias for ByteArray (no constructor wrapper) +const outputRefD = (txHash, index) => mConStr0([txHash, index]); + +function computeDuelId(txHash, outputIndex) { + const txBuf = Buffer.from(txHash, "hex"); + // Aiken: bytearray.from_int_big_endian(output_index, 8) โ€” always 8 bytes + const idxBuf = Buffer.alloc(8); + idxBuf.writeBigUInt64BE(BigInt(outputIndex)); + return createHash("sha256").update(Buffer.concat([txBuf, idxBuf])).digest("hex"); +} + + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// WALLET SETUP +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +async function setupWallet(provider) { + + const wallet = new MeshWallet({ + networkId: 0, + fetcher: provider, + submitter: provider, + key: { type: "mnemonic", words: MNEMONIC }, + }); + + const address = (await wallet.getUsedAddresses())[0]; + const utxos = await wallet.getUtxos(); + console.log("Address:", address); + console.log("UTxOs:", utxos.length, "\n"); + + if (utxos.length === 0) { + console.log("No UTxOs. Fund this address with preprod tADA:"); + console.log(" https://docs.cardano.org/cardano-testnets/tools/faucet/"); + process.exit(0); + } + + return { wallet, address, utxos }; +} + +function sleep(ms) { + console.log(` Waiting ${ms / 1000}s...\n`); + return new Promise((r) => setTimeout(r, ms)); +} + +async function waitForTx(provider, txHash, maxAttempts = 30) { + for (let i = 0; i < maxAttempts; i++) { + try { + await provider.fetchTxInfo(txHash); + return true; + } catch { + await sleep(5_000); + } + } + throw new Error(`TX ${txHash} not confirmed after ${maxAttempts} attempts`); +} + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// STEP 1: DEPOSIT A +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +async function depositA(provider, wallet, address, utxos, playerPkh) { + console.log("โ•โ•โ• STEP 1: DepositA โ•โ•โ•\n"); + + const seed = utxos[0].input; + const duelId = computeDuelId(seed.txHash, seed.outputIndex); + console.log(" Seed UTxO:", `${seed.txHash}#${seed.outputIndex}`); + console.log(" Duel ID:", duelId); + + const datum = duelDatumD({ + duelId, + playerA: { pkh: playerPkh, feedId: FEED_A, startPrice: null }, + playerB: null, + betLovelace: BET_LOVELACE, + statusIdx: 0, + deadline: null, + }); + + console.log(" Datum sent to BET script:"); + console.log(` duel_id: ${duelId}`); + console.log(` player_a: pkh=${playerPkh} feed_id=${FEED_A} start_price=None`); + console.log(` player_b: None`); + console.log(` bet_lovelace:${BET_LOVELACE}`); + console.log(` status: Waiting (0)`); + console.log(` deadline: None`); + console.log(); + + const mintRedeemer = mConStr0([outputRefD(seed.txHash, seed.outputIndex)]); + + const nowSlot = resolveSlotNo("preprod", Date.now()); + + let tx = new MeshTxBuilder({ fetcher: provider, submitter: provider }); + tx = tx.invalidBefore(Number(nowSlot) - 600); + tx = tx.invalidHereafter(Number(nowSlot) + 600); + tx = tx.txInCollateral(utxos[1].input.txHash, utxos[1].input.outputIndex); + tx = tx.txIn(seed.txHash, seed.outputIndex); + tx = tx.mintPlutusScriptV3(); + tx = tx.mint("1", mintPolicyId, duelId); + tx = tx.mintingScript(mintScriptCbor); + tx = tx.mintRedeemerValue(mintRedeemer); + tx = tx.requiredSignerHash(BACKEND_PKH); + tx = tx.txOut(scriptAddress, [ + { unit: "lovelace", quantity: String(BET_LOVELACE) }, + { unit: mintPolicyId + duelId, quantity: "1" }, + ]); + tx = tx.txOutInlineDatumValue(datum); + tx = tx.changeAddress(address); + tx = tx.selectUtxosFrom(utxos); + + const unsigned = await tx.complete(); + const signed = await wallet.signTx(unsigned); + const txHash = await wallet.submitTx(signed); + + const state = { + txHash, + txIndex: 0, + duelId, + playerA_pkh: playerPkh, + betLovelace: BET_LOVELACE, + mintPolicyId, + scriptAddress, + }; + writeFileSync(DUEL_STATE_FILE, JSON.stringify(state, null, 2)); + + console.log(" TX submitted:", txHash); + console.log(" https://preprod.cardanoscan.io/transaction/" + txHash); + console.log(" Duel state saved to duel-state.json"); + console.log(); + return { txHash, duelId }; +} + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// MAIN โ€” RUN THE FULL FLOW +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +async function main() { + + console.log("โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—"); + console.log("โ•‘ Duelo de Traders โ€” End-to-End Test Flow โ•‘"); + console.log("โ•‘ Using always-true validators on preprod โ•‘"); + console.log("โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n"); + + const provider = new BlockfrostProvider(BLOCKFROST_ID); + const { wallet, address, utxos } = await setupWallet(provider); + + // Use a fake PKH for testing (28 bytes = 56 hex chars) + // In prod these come from the connected wallets + const playerA_pkh = "aa".repeat(28); +// + + // โ”€โ”€ Step 1: DepositA โ”€โ”€ + const { txHash: depositATxHash, duelId } = await depositA( + provider, wallet, address, utxos, playerA_pkh, + ); + + console.log(" Waiting for DepositA confirmation..."); + await waitForTx(provider, depositATxHash); + console.log(" DepositA confirmed!\n"); + + // Refresh UTxOs after DepositA + const utxos2 = await wallet.getUtxos(); + console.log("UTxOs after DepositA:", utxos2.length, "\n"); +} + +main().catch((err) => { + console.error("\nError:", err); + process.exit(1); +}); diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/depositB.mjs b/lazer/cardano/lafhis/pyth-coin-stable-front/src/depositB.mjs new file mode 100644 index 00000000..62d5c7f7 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/depositB.mjs @@ -0,0 +1,325 @@ +/** + * depositB.mjs + * + * Step 2 of the Duelo de Traders flow: Player B joins a waiting duel. + * + * This transaction: + * 1. Fetches verified Pyth prices (ADA/USD and BTC/USD) + * 2. Performs a zero-ADA withdrawal from the Pyth script to verify prices on-chain + * 3. Spends the DepositA UTxO (Waiting datum) from the bet validator + * 4. Produces a new UTxO at the bet script with an Active datum, recording start prices + * + * Required .env vars: + * PYTH_TOKEN โ€“ Pyth Lazer API token + * BLOCKFROST_ID โ€“ Blockfrost project ID (preprod) + * PYTH_POLICY_ID โ€“ PolicyId of the Pyth on-chain state NFT + * BACKEND_PKH โ€“ Payment key hash of the backend wallet + * MNEMONIC โ€“ Space-separated wallet mnemonic + * DEPOSIT_A_TX_HASH โ€“ TxHash of the DepositA UTxO to spend + * DEPOSIT_A_TX_INDEX โ€“ Output index of the DepositA UTxO (default: 0) + * DUEL_ID โ€“ The duel ID hex (from depositA output) + * PLAYER_A_PKH โ€“ Payment key hash of Player A + * PLAYER_B_PKH โ€“ Payment key hash of Player B (the joiner) + */ + +import { PythLazerClient } from "@pythnetwork/pyth-lazer-sdk"; +import { + BlockfrostProvider, + MeshWallet, + MeshTxBuilder, + resolveScriptHash, + serializePlutusScript, + applyParamsToScript, + mConStr0, + mConStr1, + resolveSlotNo, +} from "@meshsdk/core"; +import { bech32 } from "bech32"; +import dotenv from "dotenv"; +import { readFileSync, writeFileSync } from "fs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +dotenv.config(); + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const DUEL_STATE_FILE = resolve(__dirname, "../duel-state.json"); + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// CONFIG +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +const required = (name) => { + const v = process.env[name]; + if (!v) { console.error(`Missing env var: ${name}`); process.exit(1); } + return v; +}; + +const PYTH_TOKEN = required("PYTH_TOKEN"); +const BLOCKFROST_ID = required("BLOCKFROST_ID"); +const PYTH_POLICY_ID = required("PYTH_POLICY_ID"); +const BACKEND_PKH = required("BACKEND_PKH"); +const MNEMONIC = required("MNEMONIC").split(" "); +// const PLAYER_B_PKH = required("PLAYER_B_PKH"); +const playerB_pkh = "bb".repeat(28); // TODO: parameter. same as in depositA + +// State persisted by depositA +let duelState; +try { + duelState = JSON.parse(readFileSync(DUEL_STATE_FILE, "utf8")); +} catch { + console.error("duel-state.json not found โ€” run depositA first."); + process.exit(1); +} +const DEPOSIT_A_TX_HASH = duelState.txHash; +const DEPOSIT_A_TX_INDEX = duelState.txIndex ?? 0; +const DUEL_ID = duelState.duelId; +const PLAYER_A_PKH = duelState.playerA_pkh; + +const FEED_A = 16; // ADA/USD. TODO: parameter. +const FEED_B = 29; // BTC/USD TODO: parameter +const BET_LOVELACE = 5_000_000; // 5 ADA. TODO: parameter +const DUEL_DURATION_MS = 30_000; // 30 seconds for testing. TODO: change. + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// SCRIPT SETUP +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +const cborBytesParam = (hex) => { + const len = hex.length / 2; + if (len < 24) return (0x40 | len).toString(16).padStart(2, "0") + hex; + if (len < 256) return "58" + len.toString(16).padStart(2, "0") + hex; + return "59" + (len >> 8).toString(16).padStart(2, "0") + (len & 0xff).toString(16).padStart(2, "0") + hex; +}; + +const plutus = JSON.parse(readFileSync( + new URL("../../pyth-coin-stable-validators/plutus.json", import.meta.url), "utf8" +)); +const NFT_COMPILED_CODE = plutus.validators.find((v) => v.title === "nft.nft_policy.mint").compiledCode; +const BET_COMPILED_CODE = plutus.validators.find((v) => v.title === "validators.bet.spend").compiledCode; + +const mintScriptCbor = applyParamsToScript(NFT_COMPILED_CODE, [cborBytesParam(BACKEND_PKH)], "CBOR"); +const mintPolicyId = resolveScriptHash(mintScriptCbor, "V3"); + +const spendScriptCbor = applyParamsToScript(BET_COMPILED_CODE, [ + cborBytesParam(BACKEND_PKH), + cborBytesParam(mintPolicyId), + cborBytesParam(PYTH_POLICY_ID), +], "CBOR"); +const scriptAddress = serializePlutusScript( + { code: spendScriptCbor, version: "V3" }, + undefined, 0, false, +).address; + +console.log("Mint policy ID: ", mintPolicyId); +console.log("Script address: ", scriptAddress); +console.log(); + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// PYTH HELPERS +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +const PYTH_STATE_ASSET_NAME = Buffer.from("Pyth State", "utf-8").toString("hex"); + +function scriptHashToRewardAddress(hash, networkId = 0) { + const header = networkId === 0 ? 0xf0 : 0xf1; + const bytes = Buffer.concat([Buffer.from([header]), Buffer.from(hash, "hex")]); + return bech32.encode(networkId === 0 ? "stake_test" : "stake", bech32.toWords(bytes), 200); +} + +async function resolvePythState() { + const base = "https://cardano-preprod.blockfrost.io/api/v0"; + const headers = { project_id: BLOCKFROST_ID }; + const unit = PYTH_POLICY_ID + PYTH_STATE_ASSET_NAME; + + const addrRes = await fetch(`${base}/assets/${unit}/addresses`, { headers }); + if (!addrRes.ok) throw new Error(`Pyth state lookup: ${await addrRes.text()}`); + const [{ address }] = await addrRes.json(); + + const utxoRes = await fetch(`${base}/addresses/${address}/utxos/${unit}`, { headers }); + if (!utxoRes.ok) throw new Error(`Pyth UTxO lookup: ${await utxoRes.text()}`); + const stateUtxo = (await utxoRes.json())[0]; + + let datum; + if (stateUtxo.data_hash) { + const r = await fetch(`${base}/scripts/datum/${stateUtxo.data_hash}`, { headers }); + if (r.ok) datum = (await r.json()).json_value; + } + if (!datum) { + const r = await fetch(`${base}/txs/${stateUtxo.tx_hash}/utxos`, { headers }); + const d = await r.json(); + datum = d.outputs.find((o) => o.output_index === stateUtxo.output_index)?.inline_datum; + } + if (!datum) throw new Error("No Pyth state datum"); + + const fields = datum?.fields ?? datum?.constructor?.fields; + if (!fields || fields.length < 4) throw new Error("Bad datum shape"); + + const withdrawScriptHash = fields[3].bytes; + const scriptRes = await fetch(`${base}/scripts/${withdrawScriptHash}/cbor`, { headers }); + if (!scriptRes.ok) throw new Error(`Pyth script CBOR: ${await scriptRes.text()}`); + const scriptSize = (await scriptRes.json()).cbor.length / 2; + + return { txHash: stateUtxo.tx_hash, txIndex: stateUtxo.output_index, withdrawScriptHash, scriptSize }; +} + +async function fetchSignedPrices(feedIds) { + const client = await PythLazerClient.create({ token: PYTH_TOKEN, webSocketPoolConfig: {} }); + const resp = await client.getLatestPrice({ + priceFeedIds: feedIds, + properties: ["price", "exponent"], + channel: "fixed_rate@200ms", + formats: ["solana"], + jsonBinaryEncoding: "hex", + parsed: true, + }); + client.shutdown(); + if (!resp.solana?.data) throw new Error("No Pyth payload"); + return { + signedUpdate: Buffer.from(resp.solana.data, "hex"), + parsedPrices: (resp.parsed?.priceFeeds ?? []).map((f) => ({ + feedId: f.priceFeedId, price: Number(f.price), exponent: Number(f.exponent), + })), + }; +} + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// PLUTUS DATA HELPERS +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +const someD = (inner) => mConStr0([inner]); +const noneD = () => mConStr1([]); + +const playerD = ({ pkh, feedId, startPrice }) => + mConStr0([pkh, feedId, startPrice != null ? someD(startPrice) : noneD()]); + +const duelDatumD = ({ duelId, playerA, playerB, betLovelace, statusIdx, deadline }) => + mConStr0([ + duelId, + playerD(playerA), + playerB ? someD(playerD(playerB)) : noneD(), + betLovelace, + statusIdx === 0 ? mConStr0([]) : mConStr1([]), + deadline != null ? someD(deadline) : noneD(), + ]); + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// MAIN +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +async function main() { + console.log("โ•โ•โ• DepositB (Join) โ•โ•โ•\n"); + + // 1. Resolve Pyth state + console.log(" Resolving Pyth state..."); + const pythState = await resolvePythState(); + const pythRewardAddr = scriptHashToRewardAddress(pythState.withdrawScriptHash, 0); + console.log(` Pyth state: ${pythState.txHash}#${pythState.txIndex}`); + + // 2. Fetch starting prices + console.log(" Fetching starting prices..."); + const { signedUpdate, parsedPrices } = await fetchSignedPrices([FEED_A, FEED_B]); + + const priceA = parsedPrices.find((p) => p.feedId === FEED_A); + const priceB = parsedPrices.find((p) => p.feedId === FEED_B); + + // Store raw price integer โ€” matches what get_price_from_pyth returns on-chain + const scaledA = priceA.price; + const scaledB = priceB.price; + console.log(` ADA/USD: ${priceA.price} (exp=${priceA.exponent})`); + console.log(` BTC/USD: ${priceB.price} (exp=${priceB.exponent})`); + + const deadlinePosix = Date.now() + DUEL_DURATION_MS; + const totalPot = BET_LOVELACE * 2; + + // 3. Build new Active datum + const newDatum = duelDatumD({ + duelId: DUEL_ID, + playerA: { pkh: PLAYER_A_PKH, feedId: FEED_A, startPrice: scaledA }, + playerB: { pkh: playerB_pkh, feedId: FEED_B, startPrice: scaledB }, + betLovelace: BET_LOVELACE, + statusIdx: 1, // Active + deadline: deadlinePosix, + }); + + console.log("\n New datum (Active):"); + console.log(` duel_id: ${DUEL_ID}`); + console.log(` player_a: pkh=${PLAYER_A_PKH} feed_id=${FEED_A} start_price=${scaledA}`); + console.log(` player_b: pkh=${playerB_pkh} feed_id=${FEED_B} start_price=${scaledB}`); + console.log(` bet_lovelace:${BET_LOVELACE}`); + console.log(` status: Active (1)`); + console.log(` deadline: ${new Date(deadlinePosix).toISOString()}`); + console.log(); + + // Join redeemer: Join { player_pkh, feed_id } + const joinRedeemer = mConStr0([playerB_pkh, FEED_B]); + + // 4. Setup wallet + const provider = new BlockfrostProvider(BLOCKFROST_ID); + const wallet = new MeshWallet({ + networkId: 0, + fetcher: provider, + submitter: provider, + key: { type: "mnemonic", words: MNEMONIC }, + }); + + const address = (await wallet.getUsedAddresses())[0]; + const utxos = await wallet.getUtxos(); + console.log(` Wallet: ${address}`); + console.log(` UTxOs: ${utxos.length}\n`); + + if (utxos.length === 0) { + console.log("No UTxOs. Fund this address with preprod tADA."); + process.exit(0); + } + + // 5. Build transaction + const nowSlot = resolveSlotNo("preprod", Date.now()); + const tx = new MeshTxBuilder({ fetcher: provider, submitter: provider }); + + tx + .invalidBefore(Number(nowSlot) - 600) + .invalidHereafter(Number(nowSlot) + 600) + .txInCollateral(utxos[0].input.txHash, utxos[0].input.outputIndex) + .requiredSignerHash(BACKEND_PKH) + + // Pyth zero-withdrawal + .withdrawalPlutusScriptV3() + .withdrawal(pythRewardAddr, "0") + .withdrawalTxInReference(pythState.txHash, pythState.txIndex, pythState.scriptSize, pythState.withdrawScriptHash) + .withdrawalRedeemerValue([signedUpdate.toString("hex")]) + + // Spend the DepositA UTxO + .spendingPlutusScriptV3() + .txIn(DEPOSIT_A_TX_HASH, DEPOSIT_A_TX_INDEX) + .txInInlineDatumPresent() + .txInRedeemerValue(joinRedeemer) + .txInScript(spendScriptCbor) + + // Output: 2ร— bet + NFT โ†’ script with Active datum + .txOut(scriptAddress, [ + { unit: "lovelace", quantity: String(totalPot) }, + { unit: mintPolicyId + DUEL_ID, quantity: "1" }, + ]) + .txOutInlineDatumValue(newDatum) + + .changeAddress(address) + .selectUtxosFrom(utxos); + + console.log(" Building transaction..."); + const unsigned = await tx.complete(); + const signed = await wallet.signTx(unsigned); + const txHash = await wallet.submitTx(signed); + + const updatedState = { ...duelState, depositB_txHash: txHash, depositB_txIndex: 0, deadline: deadlinePosix, startPriceA: scaledA, startPriceB: scaledB }; + writeFileSync(DUEL_STATE_FILE, JSON.stringify(updatedState, null, 2)); + + console.log("\n TX submitted:", txHash); + console.log(" https://preprod.cardanoscan.io/transaction/" + txHash); + console.log(` Deadline: ${new Date(deadlinePosix).toISOString()}`); + console.log(" Duel state saved to duel-state.json"); +} + +main().catch((err) => { + console.error("\nError:", err); + process.exit(1); +}); diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/lib/onchain.ts b/lazer/cardano/lafhis/pyth-coin-stable-front/src/lib/onchain.ts new file mode 100644 index 00000000..7c255530 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/lib/onchain.ts @@ -0,0 +1,21 @@ +import type { GameDuration, GameRate } from "@/types/game"; + +export const DURATION_TO_MS: Record = { + "1m": 60_000, + "5m": 300_000, + "1h": 3_600_000, +}; + +const ONCHAIN_FEED_ID_BY_RATE: Partial> = { + "ADA/USD": 16, + "BTC/USD": 29, + "ETH/USD": 36, +}; + +export function getOnchainFeedId(rate: GameRate): number { + const feedId = ONCHAIN_FEED_ID_BY_RATE[rate]; + if (!feedId) { + throw new Error(`Missing on-chain feed id for ${rate}`); + } + return feedId; +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/_app.tsx b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/_app.tsx new file mode 100644 index 00000000..9e4818f1 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/_app.tsx @@ -0,0 +1,14 @@ +import "@/styles/globals.css"; +import "@meshsdk/react/styles.css"; +import type { AppProps } from "next/app"; +import Navbar from "@/components/Navbar"; +import { MeshProvider } from "@meshsdk/react"; + +export default function App({ Component, pageProps }: AppProps) { + return ( + + + + + ); +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/_document.tsx b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/_document.tsx new file mode 100644 index 00000000..91f7d669 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/_document.tsx @@ -0,0 +1,16 @@ +import { Html, Head, Main, NextScript } from "next/document"; + +export default function Document() { + return ( + + + + + + +
+ + + + ); +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/games/[id].ts b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/games/[id].ts new file mode 100644 index 00000000..8904bd4a --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/games/[id].ts @@ -0,0 +1,21 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { getSession } from "@/server/gameStore"; + +export default function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "GET") { + res.setHeader("Allow", "GET"); + return res.status(405).json({ error: "Method not allowed" }); + } + + const id = Array.isArray(req.query.id) ? req.query.id[0] : req.query.id; + if (!id) { + return res.status(400).json({ error: "Missing game id" }); + } + + const game = getSession(id); + if (!game) { + return res.status(404).json({ error: "Game not found" }); + } + + return res.status(200).json({ game }); +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/games/[id]/join.ts b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/games/[id]/join.ts new file mode 100644 index 00000000..f6977a99 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/games/[id]/join.ts @@ -0,0 +1,36 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { joinSession, validateRate } from "@/server/gameStore"; + +export default function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + res.setHeader("Allow", "POST"); + return res.status(405).json({ error: "Method not allowed" }); + } + + const id = Array.isArray(req.query.id) ? req.query.id[0] : req.query.id; + if (!id) { + return res.status(400).json({ error: "Missing game id" }); + } + + const { wallet, selectedRate } = req.body ?? {}; + if (!wallet || typeof wallet !== "string") { + return res.status(400).json({ error: "wallet is required" }); + } + const parsedRate = validateRate(selectedRate); + if (!parsedRate) { + return res.status(400).json({ error: "selectedRate is required" }); + } + + const result = joinSession(id, wallet, parsedRate); + if (result.error === "not_found") { + return res.status(404).json({ error: "Game not found" }); + } + if (result.error === "full") { + return res.status(409).json({ error: "Game already has two players" }); + } + if (result.error === "same_rate") { + return res.status(409).json({ error: "You must choose a different asset than player one" }); + } + + return res.status(200).json({ game: result.session }); +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/games/[id]/onchain.ts b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/games/[id]/onchain.ts new file mode 100644 index 00000000..9bff6b33 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/games/[id]/onchain.ts @@ -0,0 +1,21 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { updateSessionOnchain } from "@/server/gameStore"; + +export default function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + res.setHeader("Allow", "POST"); + return res.status(405).json({ error: "Method not allowed" }); + } + + const id = Array.isArray(req.query.id) ? req.query.id[0] : req.query.id; + if (!id) { + return res.status(400).json({ error: "Missing game id" }); + } + + const updated = updateSessionOnchain(id, req.body ?? {}); + if (!updated) { + return res.status(404).json({ error: "Game not found" }); + } + + return res.status(200).json({ game: updated }); +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/games/index.ts b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/games/index.ts new file mode 100644 index 00000000..9b5ea286 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/games/index.ts @@ -0,0 +1,23 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { createSession, validateGameConfig } from "@/server/gameStore"; + +export default function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + res.setHeader("Allow", "POST"); + return res.status(405).json({ error: "Method not allowed" }); + } + + const { config, creatorWallet } = req.body ?? {}; + const parsedConfig = validateGameConfig(config); + + if (!parsedConfig) { + return res.status(400).json({ error: "Invalid game config" }); + } + + if (!creatorWallet || typeof creatorWallet !== "string") { + return res.status(400).json({ error: "creatorWallet is required" }); + } + + const session = createSession(parsedConfig, creatorWallet); + return res.status(201).json({ game: session }); +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/onchain/deposit-a-config.ts b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/onchain/deposit-a-config.ts new file mode 100644 index 00000000..f9846df6 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/onchain/deposit-a-config.ts @@ -0,0 +1,49 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { readFileSync } from "node:fs"; +import path from "node:path"; + +type PlutusValidator = { + title: string; + compiledCode: string; +}; + +type PlutusJson = { + validators: PlutusValidator[]; +}; + +export default function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "GET") { + res.setHeader("Allow", "GET"); + return res.status(405).json({ error: "Method not allowed" }); + } + + const blockfrostId = process.env.BLOCKFROST_ID; + const pythPolicyId = process.env.PYTH_POLICY_ID; + const backendPkh = process.env.BACKEND_PKH; + + if (!blockfrostId || !pythPolicyId || !backendPkh) { + return res.status(500).json({ error: "Missing server env for on-chain config" }); + } + + try { + const plutusPath = path.resolve(process.cwd(), "../pyth-coin-stable-validators/plutus.json"); + const raw = readFileSync(plutusPath, "utf8"); + const plutus = JSON.parse(raw) as PlutusJson; + + if (!Array.isArray(plutus.validators)) { + return res.status(500).json({ error: "Invalid plutus.json format" }); + } + + return res.status(200).json({ + blockfrostId, + pythPolicyId, + backendPkh, + plutus: { + validators: plutus.validators, + }, + }); + } catch (error) { + console.error("Failed to load plutus.json", error); + return res.status(500).json({ error: "Could not read plutus.json" }); + } +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/onchain/deposit-a-submit.ts b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/onchain/deposit-a-submit.ts new file mode 100644 index 00000000..7fcad396 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/onchain/deposit-a-submit.ts @@ -0,0 +1,48 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { BlockfrostProvider, MeshWallet } from "@meshsdk/core"; + +type SubmitResponse = { txHash: string } | { error: string }; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse, +) { + if (req.method !== "POST") { + res.setHeader("Allow", "POST"); + return res.status(405).json({ error: "Method not allowed" }); + } + + const { partiallySignedTx } = req.body ?? {}; + if (!partiallySignedTx || typeof partiallySignedTx !== "string") { + return res.status(400).json({ error: "partiallySignedTx is required" }); + } + + const blockfrostId = process.env.BLOCKFROST_ID; + const mnemonic = process.env.MNEMONIC; + + if (!blockfrostId || !mnemonic) { + return res.status(500).json({ error: "Missing server env (BLOCKFROST_ID or MNEMONIC)" }); + } + + try { + const provider = new BlockfrostProvider(blockfrostId); + const backendWallet = new MeshWallet({ + networkId: 0, + fetcher: provider, + submitter: provider, + key: { type: "mnemonic", words: mnemonic.split(" ") }, + }); + + // Co-sign: backend adds its signature to the user's partial signature + const fullySigned = await backendWallet.signTx(partiallySignedTx, true); + + // Submit through Blockfrost + const txHash = await backendWallet.submitTx(fullySigned); + + return res.status(200).json({ txHash }); + } catch (err) { + console.error("[deposit-a-submit] error:", err); + const message = err instanceof Error ? err.message : "Submission failed"; + return res.status(500).json({ error: message }); + } +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/onchain/deposit-b-submit.ts b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/onchain/deposit-b-submit.ts new file mode 100644 index 00000000..2719abca --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/onchain/deposit-b-submit.ts @@ -0,0 +1,45 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { BlockfrostProvider, MeshWallet } from "@meshsdk/core"; + +type SubmitResponse = { txHash: string } | { error: string }; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse, +) { + if (req.method !== "POST") { + res.setHeader("Allow", "POST"); + return res.status(405).json({ error: "Method not allowed" }); + } + + const { partiallySignedTx } = req.body ?? {}; + if (!partiallySignedTx || typeof partiallySignedTx !== "string") { + return res.status(400).json({ error: "partiallySignedTx is required" }); + } + + const blockfrostId = process.env.BLOCKFROST_ID; + const mnemonic = process.env.MNEMONIC; + + if (!blockfrostId || !mnemonic) { + return res.status(500).json({ error: "Missing server env (BLOCKFROST_ID or MNEMONIC)" }); + } + + try { + const provider = new BlockfrostProvider(blockfrostId); + const backendWallet = new MeshWallet({ + networkId: 0, + fetcher: provider, + submitter: provider, + key: { type: "mnemonic", words: mnemonic.split(" ") }, + }); + + const fullySigned = await backendWallet.signTx(partiallySignedTx, true); + const txHash = await backendWallet.submitTx(fullySigned); + + return res.status(200).json({ txHash }); + } catch (err) { + console.error("[deposit-b-submit] error:", err); + const message = err instanceof Error ? err.message : "Submission failed"; + return res.status(500).json({ error: message }); + } +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/onchain/pyth-lazer-prices.ts b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/onchain/pyth-lazer-prices.ts new file mode 100644 index 00000000..17b8cfe1 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/onchain/pyth-lazer-prices.ts @@ -0,0 +1,66 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { PythLazerClient } from "@pythnetwork/pyth-lazer-sdk"; + +type PythLazerPricesResponse = + | { + signedUpdateHex: string; + parsedPrices: Array<{ feedId: number; price: number; exponent: number }>; + } + | { error: string }; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse, +) { + if (req.method !== "POST") { + res.setHeader("Allow", "POST"); + return res.status(405).json({ error: "Method not allowed" }); + } + + const { feedIds } = req.body ?? {}; + if (!Array.isArray(feedIds) || feedIds.length === 0) { + return res.status(400).json({ error: "feedIds must be a non-empty array of numbers" }); + } + + const pythToken = process.env.PYTH_TOKEN; + if (!pythToken) { + return res.status(500).json({ error: "Missing PYTH_TOKEN env var" }); + } + + let client: InstanceType | null = null; + try { + client = await PythLazerClient.create({ token: pythToken, webSocketPoolConfig: {} }); + + const resp = await client.getLatestPrice({ + priceFeedIds: feedIds as number[], + properties: ["price", "exponent"], + channel: "fixed_rate@200ms", + formats: ["solana"], + jsonBinaryEncoding: "hex", + parsed: true, + }); + + if (!resp.solana?.data) { + throw new Error("No Lazer signed update in response"); + } + + const parsedPrices = (resp.parsed?.priceFeeds ?? []).map( + (f: { priceFeedId: unknown; price: unknown; exponent: unknown }) => ({ + feedId: Number(f.priceFeedId), + price: Number(f.price), // SDK returns string โ€” must be Number() for Plutus integer encoding + exponent: Number(f.exponent), + }), + ); + + return res.status(200).json({ + signedUpdateHex: resp.solana.data as string, + parsedPrices, + }); + } catch (err) { + console.error("[pyth-lazer-prices] error:", err); + const message = err instanceof Error ? err.message : "Failed to fetch Pyth Lazer prices"; + return res.status(500).json({ error: message }); + } finally { + client?.shutdown(); + } +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/onchain/resolve.ts b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/onchain/resolve.ts new file mode 100644 index 00000000..f29c8c81 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/api/onchain/resolve.ts @@ -0,0 +1,386 @@ +/** + * POST /api/onchain/resolve + * + * Backend-only resolve step. Called after the duel deadline passes. + * Fetches final Pyth Lazer prices, determines winner, builds + signs + submits + * the resolve transaction. + * + * Body: { gameId: string } + * Returns: { txHash: string } | { error: string } + */ + +import type { NextApiRequest, NextApiResponse } from "next"; +import { + BlockfrostProvider, + MeshWallet, + MeshTxBuilder, + resolveScriptHash, + applyParamsToScript, + mConStr1, + resolveSlotNo, + ForgeScript, +} from "@meshsdk/core"; +import { PythLazerClient } from "@pythnetwork/pyth-lazer-sdk"; +import { bech32 } from "bech32"; +import { readFileSync } from "node:fs"; +import path from "node:path"; +import { getSession } from "@/server/gameStore"; + +type ResolveResponse = { txHash: string } | { error: string }; + +// โ”€โ”€โ”€ CBOR helpers โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +const cborBytesParam = (hex: string) => { + const len = hex.length / 2; + if (len < 24) return (0x40 | len).toString(16).padStart(2, "0") + hex; + if (len < 256) return "58" + len.toString(16).padStart(2, "0") + hex; + return ( + "59" + + (len >> 8).toString(16).padStart(2, "0") + + (len & 0xff).toString(16).padStart(2, "0") + + hex + ); +}; + +// Encode Resolve { timestamp } redeemer: Constr 1 [I n] โ†’ d87a 81 +// MeshJS has issues serialising large integers via mConStr1, so we build CBOR manually. +function cborConstr1Int(n: number): string { + const buf: number[] = [0xd8, 0x7a, 0x81]; // tag(122) array(1) + const big = BigInt(n); + const B = (x: number) => BigInt(x); + if (big <= B(0x17)) { + buf.push(Number(big)); + } else if (big <= B(0xff)) { + buf.push(0x18, Number(big)); + } else if (big <= B(0xffff)) { + buf.push(0x19, Number(big >> B(8)), Number(big & B(0xff))); + } else if (big <= B(0xffffffff)) { + buf.push( + 0x1a, + Number((big >> B(24)) & B(0xff)), + Number((big >> B(16)) & B(0xff)), + Number((big >> B(8)) & B(0xff)), + Number(big & B(0xff)), + ); + } else { + buf.push( + 0x1b, + Number((big >> B(56)) & B(0xff)), + Number((big >> B(48)) & B(0xff)), + Number((big >> B(40)) & B(0xff)), + Number((big >> B(32)) & B(0xff)), + Number((big >> B(24)) & B(0xff)), + Number((big >> B(16)) & B(0xff)), + Number((big >> B(8)) & B(0xff)), + Number(big & B(0xff)), + ); + } + return Buffer.from(buf).toString("hex"); +} + +// โ”€โ”€โ”€ Address helpers โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +function pkhToAddress(pkh: string, networkId = 0): string { + // Enterprise address (payment key only): header 0x60 on testnet, 0x61 on mainnet + const header = networkId === 0 ? 0x60 : 0x61; + const bytes = Buffer.concat([Buffer.from([header]), Buffer.from(pkh, "hex")]); + return bech32.encode(networkId === 0 ? "addr_test" : "addr", bech32.toWords(bytes), 200); +} + +function scriptHashToRewardAddress(hash: string, networkId = 0): string { + const header = networkId === 0 ? 0xf0 : 0xf1; + const bytes = Buffer.concat([Buffer.from([header]), Buffer.from(hash, "hex")]); + return bech32.encode(networkId === 0 ? "stake_test" : "stake", bech32.toWords(bytes), 200); +} + +function utf8ToHex(value: string): string { + return Buffer.from(value, "utf-8").toString("hex"); +} + +// โ”€โ”€โ”€ Pyth helpers โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +async function resolvePythState(blockfrostId: string, pythPolicyId: string) { + const base = "https://cardano-preprod.blockfrost.io/api/v0"; + const headers = { project_id: blockfrostId }; + const unit = pythPolicyId + utf8ToHex("Pyth State"); + + const addrRes = await fetch(`${base}/assets/${unit}/addresses`, { headers }); + if (!addrRes.ok) throw new Error(`Pyth state lookup: ${await addrRes.text()}`); + const [first] = (await addrRes.json()) as Array<{ address: string }>; + if (!first?.address) throw new Error("Pyth state address not found"); + + const utxoRes = await fetch(`${base}/addresses/${first.address}/utxos/${unit}`, { headers }); + if (!utxoRes.ok) throw new Error(`Pyth UTxO lookup: ${await utxoRes.text()}`); + const utxos = (await utxoRes.json()) as Array<{ + tx_hash: string; + output_index: number; + data_hash?: string; + }>; + const stateUtxo = utxos[0]; + if (!stateUtxo) throw new Error("Pyth state UTxO not found"); + + let datum: unknown; + if (stateUtxo.data_hash) { + const r = await fetch(`${base}/scripts/datum/${stateUtxo.data_hash}`, { headers }); + if (r.ok) datum = ((await r.json()) as { json_value?: unknown }).json_value; + } + if (!datum) { + const r = await fetch(`${base}/txs/${stateUtxo.tx_hash}/utxos`, { headers }); + const d = (await r.json()) as { + outputs?: Array<{ output_index: number; inline_datum?: unknown }>; + }; + datum = d.outputs?.find((o) => o.output_index === stateUtxo.output_index)?.inline_datum; + } + if (!datum) throw new Error("Pyth state datum not found"); + + const fields = ( + datum as { fields?: Array<{ bytes?: string }> } + ).fields ?? (datum as { constructor?: { fields?: Array<{ bytes?: string }> } }).constructor?.fields; + if (!fields || fields.length < 4 || !fields[3]?.bytes) throw new Error("Bad Pyth datum shape"); + + const withdrawScriptHash = fields[3].bytes; + const scriptRes = await fetch(`${base}/scripts/${withdrawScriptHash}/cbor`, { headers }); + if (!scriptRes.ok) throw new Error(`Pyth script CBOR: ${await scriptRes.text()}`); + const { cbor } = (await scriptRes.json()) as { cbor?: string }; + if (!cbor) throw new Error("Missing Pyth script CBOR"); + + return { + txHash: stateUtxo.tx_hash, + txIndex: stateUtxo.output_index, + withdrawScriptHash, + scriptSize: cbor.length / 2, + }; +} + +async function fetchSignedPrices(feedIds: number[], pythToken: string) { + const client = await PythLazerClient.create({ token: pythToken, webSocketPoolConfig: {} }); + try { + const resp = await client.getLatestPrice({ + priceFeedIds: feedIds, + properties: ["price", "exponent"], + channel: "fixed_rate@200ms", + formats: ["solana"], + jsonBinaryEncoding: "hex", + parsed: true, + }); + if (!resp.solana?.data) throw new Error("No Pyth Lazer signed update"); + return { + signedUpdateHex: resp.solana.data as string, + parsedPrices: (resp.parsed?.priceFeeds ?? []).map( + (f: { priceFeedId: number; price?: string | number; exponent?: string | number }) => ({ + feedId: Number(f.priceFeedId), + price: Number(f.price ?? 0), + exponent: Number(f.exponent ?? 0), + }), + ), + }; + } finally { + client.shutdown(); + } +} + +// โ”€โ”€โ”€ Handler โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse, +) { + if (req.method !== "POST") { + res.setHeader("Allow", "POST"); + return res.status(405).json({ error: "Method not allowed" }); + } + + const { gameId } = req.body ?? {}; + if (!gameId || typeof gameId !== "string") { + return res.status(400).json({ error: "gameId is required" }); + } + + const blockfrostId = process.env.BLOCKFROST_ID; + const mnemonic = process.env.MNEMONIC; + const pythToken = process.env.PYTH_TOKEN; + const backendPkh = process.env.BACKEND_PKH; + const pythPolicyId = process.env.PYTH_POLICY_ID; + + if (!blockfrostId || !mnemonic || !pythToken || !backendPkh || !pythPolicyId) { + return res.status(500).json({ error: "Missing server env vars" }); + } + + // Load game state + const game = getSession(gameId); + if (!game) return res.status(404).json({ error: "Game not found" }); + + const { + onchain: { + depositBTxHash, + duelId, + playerOnePkh, + playerTwoPkh, + playerOneFeedId, + playerTwoFeedId, + startPriceA, + startPriceB, + deadlinePosix, + }, + config: { betAda }, + } = game; + + if ( + !depositBTxHash || + !duelId || + !playerOnePkh || + !playerTwoPkh || + playerOneFeedId == null || + playerTwoFeedId == null || + startPriceA == null || + startPriceB == null || + deadlinePosix == null + ) { + return res.status(400).json({ error: "Game is missing on-chain data (depositB not complete?)" }); + } + + if (Date.now() < deadlinePosix) { + const remaining = Math.ceil((deadlinePosix - Date.now()) / 1000); + return res.status(400).json({ error: `Deadline not reached yet. ${remaining}s remaining.` }); + } + + try { + // Load plutus.json + const plutusPath = path.resolve(process.cwd(), "../pyth-coin-stable-validators/plutus.json"); + const plutus = JSON.parse(readFileSync(plutusPath, "utf8")) as { + validators: Array<{ title: string; compiledCode: string }>; + }; + const getCode = (title: string) => { + const code = plutus.validators.find((v) => v.title === title)?.compiledCode; + if (!code) throw new Error(`Missing compiled code: ${title}`); + return code; + }; + + // Derive scripts + const mintScriptCbor = applyParamsToScript( + getCode("nft.nft_policy.mint"), + [cborBytesParam(backendPkh)], + "CBOR", + ); + const mintPolicyId = resolveScriptHash(mintScriptCbor, "V3"); + const spendScriptCbor = applyParamsToScript( + getCode("validators.bet.spend"), + [cborBytesParam(backendPkh), cborBytesParam(mintPolicyId), cborBytesParam(pythPolicyId)], + "CBOR", + ); + + // Setup backend wallet + const provider = new BlockfrostProvider(blockfrostId); + const wallet = new MeshWallet({ + networkId: 0, + fetcher: provider, + submitter: provider, + key: { type: "mnemonic", words: mnemonic.split(" ") }, + }); + + const backendAddress = (await wallet.getUsedAddresses())[0]; + if (!backendAddress) throw new Error("Backend wallet has no addresses"); + const utxos = await wallet.getUtxos(); + if (!utxos.length) throw new Error("Backend wallet has no UTxOs"); + + // Resolve Pyth state and fetch final prices + const pythState = await resolvePythState(blockfrostId, pythPolicyId); + const pythRewardAddr = scriptHashToRewardAddress(pythState.withdrawScriptHash, 0); + + const { signedUpdateHex, parsedPrices } = await fetchSignedPrices( + [playerOneFeedId, playerTwoFeedId], + pythToken, + ); + const endA = parsedPrices.find((p) => p.feedId === playerOneFeedId)?.price; + const endB = parsedPrices.find((p) => p.feedId === playerTwoFeedId)?.price; + if (endA == null || endB == null) throw new Error("Missing final price data"); + + // Determine winner (same formula as the validator) + const changeA = Math.trunc(((endA - startPriceA) * 1_000_000) / startPriceA); + const changeB = Math.trunc(((endB - startPriceB) * 1_000_000) / startPriceB); + const isDraw = Math.abs(changeA - changeB) < 1; + + console.log(`[resolve] changeA=${changeA} changeB=${changeB} isDraw=${isDraw}`); + + const betLovelace = Math.round(betAda * 1_000_000); + const totalPot = betLovelace * 2; + + // Winner token โ€” simple ForgeScript locked to backend wallet + const forgingScript = ForgeScript.withOneSignature(backendAddress); + const winnerPolicyId = resolveScriptHash(forgingScript); + const WINNER_TOKEN_NAME = Buffer.from("horseshoe", "utf-8").toString("hex"); + + const resolveRedeemerCbor = cborConstr1Int(deadlinePosix); + const burnRedeemer = mConStr1([]); + const nowSlot = resolveSlotNo("preprod", Date.now()); + + // Find pure-ADA UTxO for collateral + const collateral = utxos.find( + (u) => u.output.amount.length === 1 && u.output.amount[0]?.unit === "lovelace", + ); + if (!collateral) throw new Error("Backend wallet has no pure-ADA UTxO for collateral"); + + const tx = new MeshTxBuilder({ fetcher: provider, submitter: provider }); + + tx + .invalidBefore(Number(nowSlot) - 600) + .invalidHereafter(Number(nowSlot) + 600) + .txInCollateral(collateral.input.txHash, collateral.input.outputIndex) + .requiredSignerHash(backendPkh) + + // Pyth zero-withdrawal + .withdrawalPlutusScriptV3() + .withdrawal(pythRewardAddr, "0") + .withdrawalTxInReference( + pythState.txHash, + pythState.txIndex, + String(pythState.scriptSize), + pythState.withdrawScriptHash, + ) + .withdrawalRedeemerValue([signedUpdateHex], "Mesh", { + mem: 10_000_000, + steps: 6_000_000_000, + }) + + // Spend Active UTxO + .spendingPlutusScriptV3() + .txIn(depositBTxHash, 0) + .txInInlineDatumPresent() + .txInRedeemerValue(resolveRedeemerCbor, "CBOR", { mem: 5_000_000, steps: 2_000_000_000 }) + .txInScript(spendScriptCbor) + + // Burn the authenticity NFT + .mintPlutusScriptV3() + .mint("-1", mintPolicyId, duelId) + .mintingScript(mintScriptCbor) + .mintRedeemerValue(burnRedeemer, "Mesh", { mem: 1_000_000, steps: 1_000_000_000 }); + + if (isDraw) { + tx + .txOut(pkhToAddress(playerOnePkh), [{ unit: "lovelace", quantity: String(betLovelace) }]) + .txOut(pkhToAddress(playerTwoPkh), [{ unit: "lovelace", quantity: String(betLovelace) }]); + } else { + const winnerPkh = changeA > changeB ? playerOnePkh : playerTwoPkh; + tx + .mint("1", winnerPolicyId, WINNER_TOKEN_NAME) + .mintingScript(forgingScript) + .txOut(pkhToAddress(winnerPkh), [ + { unit: "lovelace", quantity: String(totalPot) }, + { unit: winnerPolicyId + WINNER_TOKEN_NAME, quantity: "1" }, + ]); + } + + tx.changeAddress(backendAddress).selectUtxosFrom(utxos); + + console.log("[resolve] building transaction..."); + const unsigned = await tx.complete(); + const signed = await wallet.signTx(unsigned); + const txHash = await wallet.submitTx(signed); + + console.log(`[resolve] tx submitted: ${txHash}`); + return res.status(200).json({ txHash }); + } catch (err) { + console.error("[resolve] error:", err); + const message = err instanceof Error ? err.message : "Resolve failed"; + return res.status(500).json({ error: message }); + } +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/create-game.tsx b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/create-game.tsx new file mode 100644 index 00000000..3590b6eb --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/create-game.tsx @@ -0,0 +1,153 @@ +import Head from "next/head"; +import { useRouter } from "next/router"; +import { useState } from "react"; +import CreateGameConfigBar from "@/components/CreateGameConfigBar"; +import type { CreateGameConfigInput } from "@/components/CreateGameConfigBar"; +import RequireWallet from "@/components/RequireWallet"; +import { getOnchainFeedId } from "@/lib/onchain"; +import { depositA } from "@/transactions/tx"; +import { BlockfrostProvider, resolvePaymentKeyHash } from "@meshsdk/core"; +import { useWallet } from "@meshsdk/react"; +import { HermesClient } from "@pythnetwork/hermes-client"; + +type OnchainConfigResponse = { + blockfrostId?: string; + pythPolicyId?: string; + backendPkh?: string; + plutus?: { validators: Array<{ title: string; compiledCode: string }> }; + error?: string; +}; + +export default function CreateGamePage() { + const router = useRouter(); + const { address, wallet } = useWallet(); + const [creating, setCreating] = useState(false); + const [error, setError] = useState(null); + + async function resolveHermesFeedId(rate: CreateGameConfigInput["rate"]) { + const client = new HermesClient("https://hermes.pyth.network", {}); + const feeds = await client.getPriceFeeds({ assetType: "crypto" }); + const match = feeds.find((feed) => (feed.attributes.display_symbol ?? "").toUpperCase() === rate); + if (!match) { + throw new Error(`Missing Hermes feed id for ${rate}`); + } + return match.id; + } + + async function handleCreate(config: CreateGameConfigInput) { + if (!address) { + setError("Wallet address is still loading. Please wait and try again."); + return; + } + + setCreating(true); + setError(null); + + try { + const lovelace = Math.round(config.betAda * 1_000_000); + if (!Number.isFinite(lovelace) || lovelace <= 0) { + throw new Error("Invalid bet amount"); + } + + const response = await fetch("/api/games", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + config, + creatorWallet: address, + }), + }); + + const data = (await response.json()) as { game?: { id: string }; error?: string }; + if (!response.ok || !data.game?.id) { + throw new Error(data.error ?? "Could not create game"); + } + + const onchainConfigRes = await fetch("/api/onchain/deposit-a-config"); + const onchainConfig = (await onchainConfigRes.json()) as OnchainConfigResponse; + if (!onchainConfigRes.ok) { + throw new Error(onchainConfig.error ?? "Could not load on-chain config"); + } + if ( + !onchainConfig.blockfrostId || + !onchainConfig.pythPolicyId || + !onchainConfig.backendPkh || + !onchainConfig.plutus + ) { + throw new Error("Incomplete on-chain config"); + } + + const provider = new BlockfrostProvider(onchainConfig.blockfrostId); + const utxos = await wallet.getUtxos(); + console.log(utxos); + const depositResult = await depositA({ + provider, + wallet, + utxos, + playerOneAddress: address, + backendPkh: onchainConfig.backendPkh, + pythPolicyId: onchainConfig.pythPolicyId, + plutus: onchainConfig.plutus, + bet_lovelace: lovelace, + }); + console.log("[create-game] partial tx built, sending to backend to co-sign..."); + + // Backend co-signs (NFT mint requires backend_pkh) and submits + const submitRes = await fetch("/api/onchain/deposit-a-submit", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ partiallySignedTx: depositResult.partiallySignedTx }), + }); + const submitData = (await submitRes.json()) as { txHash?: string; error?: string }; + if (!submitRes.ok || !submitData.txHash) { + throw new Error(submitData.error ?? "Backend failed to submit transaction"); + } + + const txHash = submitData.txHash; + console.log(`[create-game] depositA tx: ${txHash}`); + console.log(`[create-game] explorer: https://preprod.cardanoscan.io/transaction/${txHash}`); + + const playerOnePkh = resolvePaymentKeyHash(address); + const playerOnePriceFeedId = await resolveHermesFeedId(config.rate); + const onchainRes = await fetch(`/api/games/${data.game.id}/onchain`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + duelId: depositResult.duelId, + depositATxHash: txHash, + depositATxIndex: 0, + playerOnePkh, + playerOnePriceFeedId, + playerOneFeedId: getOnchainFeedId(config.rate), + }), + }); + if (!onchainRes.ok) { + const onchainData = (await onchainRes.json()) as { error?: string }; + throw new Error(onchainData.error ?? "Could not persist on-chain game data"); + } + + await router.push(`/game/${data.game.id}?txHash=${txHash}`); + } catch (err) { + const message = err instanceof Error ? err.message : "Could not create game"; + setError(message); + } finally { + setCreating(false); + } + } + + return ( + <> + + Create Game + +
+ + + +
+ + ); +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/game/[id].tsx b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/game/[id].tsx new file mode 100644 index 00000000..17d209a8 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/game/[id].tsx @@ -0,0 +1,282 @@ +import Head from "next/head"; +import { useRouter } from "next/router"; +import { useEffect, useMemo, useState } from "react"; +import { useWallet } from "@meshsdk/react"; +import RequireWallet from "@/components/RequireWallet"; +import DuelPreview from "@/components/DuelPreview"; +import type { GameSession } from "@/types/game"; + +function shortWallet(wallet: string | null) { + if (!wallet) return "Open slot"; + if (wallet.length <= 14) return wallet; + return `${wallet.slice(0, 8)}...${wallet.slice(-6)}`; +} + +function normalizeWallet(wallet: string) { + return wallet.trim().toLowerCase(); +} + +export default function GameLobbyPage() { + const router = useRouter(); + const { address } = useWallet(); + const [game, setGame] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [origin, setOrigin] = useState(""); + const [resolving, setResolving] = useState(false); + const [resolveResult, setResolveResult] = useState<{ txHash?: string; error?: string } | null>(null); + const id = useMemo(() => { + const value = router.query.id; + return typeof value === "string" ? value : ""; + }, [router.query.id]); + + useEffect(() => { + if (typeof window !== "undefined") { + setOrigin(window.location.origin); + } + }, []); + + useEffect(() => { + if (!id) return; + + let active = true; + + async function loadGame() { + try { + const response = await fetch(`/api/games/${id}`); + const data = (await response.json()) as { game?: GameSession; error?: string }; + + if (!response.ok || !data.game) { + throw new Error(data.error ?? "Could not load game"); + } + + if (!active) return; + setGame(data.game); + setError(null); + } catch (err) { + if (!active) return; + const message = err instanceof Error ? err.message : "Could not load game"; + setError(message); + } finally { + if (active) setLoading(false); + } + } + + void loadGame(); + const timer = setInterval(() => void loadGame(), 3000); + + return () => { + active = false; + clearInterval(timer); + }; + }, [id]); + + const shareLink = game ? `${origin}/game/${game.id}` : ""; + const normalizedAddress = address ? normalizeWallet(address) : ""; + const isPlayerOne = !!game && normalizedAddress === game.playerOneWallet; + const isPlayerTwo = !!game && normalizedAddress === game.playerTwoWallet; + const isParticipant = isPlayerOne || isPlayerTwo; + const canJoin = !!game && !isParticipant && game.playerTwoWallet === null; + + async function copyText(text: string) { + if (!text) return; + await navigator.clipboard.writeText(text); + } + + async function handleResolve() { + if (!id) return; + setResolving(true); + setResolveResult(null); + try { + const res = await fetch("/api/onchain/resolve", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ gameId: id }), + }); + const data = (await res.json()) as { txHash?: string; error?: string }; + setResolveResult(data); + } catch (err) { + setResolveResult({ error: err instanceof Error ? err.message : "Resolve failed" }); + } finally { + setResolving(false); + } + } + + return ( + <> + + Game Lobby + +
+ +
+
+
+

Game Lobby {id ? `#${id}` : ""}

+ {id && ( + + )} +
+ +
+ + {loading &&

Loading game...

} + {error &&

{error}

} + + {game && ( + <> +
+
+

+ Players +

+

Player 1: {shortWallet(game.playerOneWallet)}

+

Player 2: {shortWallet(game.playerTwoWallet)}

+
+ +
+

+ Game Config +

+

Player 1 asset: {game.config.rate}

+

Player 2 asset: {game.playerTwoRate ?? "Pending"}

+

Bet: {game.config.betAda} ADA

+

Duration: {game.config.duration}

+
+
+ + {isPlayerOne && ( +
+

+ Invite Your Opponent +

+
+ + +
+

{shareLink}

+
+ )} + +
+

+ Live Race +

+ + {game.status !== "ready" && ( +

Waiting for opponent to join before the race startsโ€ฆ

+ )} +
+ + {/* Resolve section โ€” shown when deadline has passed and game is active */} + {game.status === "ready" && + game.onchain.deadlinePosix != null && + Date.now() >= game.onchain.deadlinePosix && ( +
+

+ Duel Ended โ€” Claim Result +

+ {resolveResult?.txHash ? ( +

+ Resolved!{" "} + + View on explorer + +

+ ) : ( + <> + {resolveResult?.error && ( +

{resolveResult.error}

+ )} + + + )} +
+ )} + +
+ {game.status === "ready" ? ( +

Both players are in. The game is ready to start.

+ ) : canJoin ? ( +
+

This game has one player. Go to Join Game to choose your asset and join.

+ +
+ ) : isParticipant ? ( +

Waiting for the second player to join...

+ ) : ( +

This game is full. You can create or join another game.

+ )} +
+ + )} +
+
+
+ + ); +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/index.tsx b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/index.tsx new file mode 100644 index 00000000..2b0579b7 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/index.tsx @@ -0,0 +1,180 @@ +import Head from "next/head"; +import Image from "next/image"; +import { useWallet } from "@meshsdk/react"; +import PriceTicker from "@/components/PriceTicker"; +import DuelPreview from "@/components/DuelPreview"; + +const steps = [ + { + title: "1. CONNECT WALLET", + text: "Your identity is your Cardano wallet (CIP-30). No username or password needed.", + }, + { + title: "2. CHALLENGE LINK", + text: "Choose an asset and stake amount (10, 25, or 50 ADA). Your rival picks a different asset.", + }, + { + title: "3. RACE WINDOW: 60s", + text: "Both players deposit, the duel starts, and the UI shows live ticks.", + }, + { + title: "4. ON-CHAIN RESOLVE", + text: "Highest percentage change wins. The pot settles automatically and verifiably.", + }, +]; + +export default function Home() { + useWallet(); + + return ( + <> + + CoinStable | Web3 Race Arena + + + +
+
+
+
+
+

+ WEB3 RACE ARENA +

+

+ CoinStable + Powered by Pyth +

+
+ CoinStable +
+ +

+ Two players, two assets, one ADA pot, and a time window. + The winner is determined by percentage change using Pyth signed prices. +

+ +
+
+
+

+ Live Duel Track +

+
+ ADA horse + VS + Pyth horse +
+
+ +
+ Player A + ADA/USD + + ADA horse + +
+ +
+ Player B + BTC/USD + + Pyth horse + +
+ +

+ The winner is determined by % change. +

+
+ +
+

+ How It Works +

+ +
+
+
+
+ +
+
+
+

+ Powered by Pyth Network +

+

+ Live Market Feeds +

+

+ Real-time crypto prices sourced directly from Pyth oracle โ€” the same feeds used to settle every duel on-chain. +

+
+
+ +
+ +
+

GAME FLOW

+
+ {steps.map((step) => ( +
+

+ {step.title} +

+

{step.text}

+
+ ))} +
+
+ +
+
+

VERIFIABLE BY DESIGN

+

+ We use Pyth to settle wagers with signed and verifiable prices. + That makes duel outcomes reliable and transparent on Cardano. +

+
+
+
+ + ); +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/join-game.tsx b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/join-game.tsx new file mode 100644 index 00000000..f7175283 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/pages/join-game.tsx @@ -0,0 +1,289 @@ +import Head from "next/head"; +import { useRouter } from "next/router"; +import { useEffect, useMemo, useState } from "react"; +import { BlockfrostProvider, resolvePaymentKeyHash } from "@meshsdk/core"; +import { useWallet } from "@meshsdk/react"; +import JoinGameConfigBar, { type JoinGameInput } from "@/components/JoinGameConfigBar"; +import RequireWallet from "@/components/RequireWallet"; +import { DURATION_TO_MS, getOnchainFeedId } from "@/lib/onchain"; +import { depositB } from "@/transactions/tx"; +import type { GameSession } from "@/types/game"; +import { HermesClient } from "@pythnetwork/hermes-client"; + +type OnchainConfigResponse = { + blockfrostId?: string; + pythPolicyId?: string; + backendPkh?: string; + plutus?: { validators: Array<{ title: string; compiledCode: string }> }; + error?: string; +}; + +function parseGameId(input: string) { + const value = input.trim(); + if (!value) return ""; + + if (value.includes("/game/")) { + const match = value.match(/\/game\/([^/?#]+)/i); + return match?.[1] ?? ""; + } + + return value; +} + +export default function JoinGamePage() { + const router = useRouter(); + const { address, wallet } = useWallet(); + const [joining, setJoining] = useState(false); + const [error, setError] = useState(null); + const [gameInput, setGameInput] = useState(""); + const [previewLoading, setPreviewLoading] = useState(false); + const [previewError, setPreviewError] = useState(null); + const [preview, setPreview] = useState<{ + opponentRate: GameSession["config"]["rate"]; + betAda: number; + gameId: string; + } | null>(null); + const initialGameInput = useMemo(() => { + const q = router.query.gameId; + return typeof q === "string" ? q : ""; + }, [router.query.gameId]); + + useEffect(() => { + if (initialGameInput) { + setGameInput(initialGameInput); + } + }, [initialGameInput]); + + useEffect(() => { + const gameId = parseGameId(gameInput); + if (!gameId) { + setPreview(null); + setPreviewError(null); + setPreviewLoading(false); + return; + } + + let active = true; + setPreviewLoading(true); + setPreviewError(null); + + const timer = setTimeout(() => { + void (async () => { + try { + const gameRes = await fetch(`/api/games/${gameId}`); + const gameData = (await gameRes.json()) as { game?: GameSession; error?: string }; + if (!gameRes.ok || !gameData.game) { + throw new Error(gameData.error ?? "Game not found"); + } + + if (!active) return; + setPreview({ + opponentRate: gameData.game.config.rate, + betAda: gameData.game.config.betAda, + gameId: gameData.game.id, + }); + } catch (err) { + if (!active) return; + setPreview(null); + const message = err instanceof Error ? err.message : "Could not load game preview"; + setPreviewError(message); + } finally { + if (active) setPreviewLoading(false); + } + })(); + }, 350); + + return () => { + active = false; + clearTimeout(timer); + }; + }, [gameInput]); + + async function resolveHermesFeedId(rate: GameSession["config"]["rate"]) { + const client = new HermesClient("https://hermes.pyth.network", {}); + const feeds = await client.getPriceFeeds({ assetType: "crypto" }); + const match = feeds.find((feed) => (feed.attributes.display_symbol ?? "").toUpperCase() === rate); + if (!match) { + throw new Error(`Missing Hermes feed id for ${rate}`); + } + return match.id; + } + + async function handleJoin({ selectedRate, gameInput }: JoinGameInput) { + if (!address) { + setError("Wallet address is still loading. Please wait and try again."); + return; + } + + const gameId = parseGameId(gameInput); + if (!gameId) { + setError("Enter a valid game ID or invite link."); + return; + } + + setJoining(true); + setError(null); + + try { + const gameRes = await fetch(`/api/games/${gameId}`); + const gameData = (await gameRes.json()) as { game?: GameSession; error?: string }; + if (!gameRes.ok || !gameData.game) { + throw new Error(gameData.error ?? "Game not found"); + } + + if (gameData.game.config.rate === selectedRate) { + throw new Error("You must pick a different asset than your opponent."); + } + + if ( + !gameData.game.onchain.duelId || + !gameData.game.onchain.depositATxHash || + gameData.game.onchain.depositATxIndex == null || + !gameData.game.onchain.playerOnePkh + ) { + throw new Error("Game is missing deposit A on-chain data"); + } + + const onchainConfigRes = await fetch("/api/onchain/deposit-a-config"); + const onchainConfig = (await onchainConfigRes.json()) as OnchainConfigResponse; + if (!onchainConfigRes.ok) { + throw new Error(onchainConfig.error ?? "Could not load on-chain config"); + } + if ( + !onchainConfig.blockfrostId || + !onchainConfig.pythPolicyId || + !onchainConfig.backendPkh || + !onchainConfig.plutus + ) { + throw new Error("Incomplete on-chain config"); + } + + const playerTwoPkh = resolvePaymentKeyHash(address); + const playerTwoPriceFeedId = await resolveHermesFeedId(selectedRate); + + const feedA = gameData.game.onchain.playerOneFeedId ?? getOnchainFeedId(gameData.game.config.rate); + const feedB = getOnchainFeedId(selectedRate); + + // Fetch Pyth Lazer signed prices from the backend (needs server-side PYTH_TOKEN) + const lazerRes = await fetch("/api/onchain/pyth-lazer-prices", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ feedIds: [feedA, feedB] }), + }); + const lazerData = (await lazerRes.json()) as { + signedUpdateHex?: string; + parsedPrices?: Array<{ feedId: number; price: number; exponent: number }>; + error?: string; + }; + if (!lazerRes.ok || !lazerData.signedUpdateHex || !lazerData.parsedPrices) { + throw new Error(lazerData.error ?? "Could not fetch Pyth Lazer prices"); + } + const priceA = lazerData.parsedPrices.find((p) => p.feedId === feedA); + const priceB = lazerData.parsedPrices.find((p) => p.feedId === feedB); + if (!priceA || !priceB) throw new Error("Missing price data for one or both feeds"); + + const provider = new BlockfrostProvider(onchainConfig.blockfrostId); + const utxos = await wallet.getUtxos(); + const depositResult = await depositB({ + provider, + wallet, + utxos, + playerTwoAddress: address, + playerOnePkh: gameData.game.onchain.playerOnePkh, + playerTwoPkh, + depositATxHash: gameData.game.onchain.depositATxHash, + depositATxIndex: gameData.game.onchain.depositATxIndex, + duelId: gameData.game.onchain.duelId, + backendPkh: onchainConfig.backendPkh, + pythPolicyId: onchainConfig.pythPolicyId, + blockfrostId: onchainConfig.blockfrostId, + signedUpdateHex: lazerData.signedUpdateHex, + startPriceA: Number(priceA.price), + startPriceB: Number(priceB.price), + plutus: onchainConfig.plutus, + feedA, + feedB, + bet_lovelace: Math.round(gameData.game.config.betAda * 1_000_000), + duelDuration: DURATION_TO_MS[gameData.game.config.duration], + }); + + const submitRes = await fetch("/api/onchain/deposit-b-submit", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ partiallySignedTx: depositResult.partiallySignedTx }), + }); + const submitData = (await submitRes.json()) as { txHash?: string; error?: string }; + if (!submitRes.ok || !submitData.txHash) { + throw new Error(submitData.error ?? "Backend failed to submit deposit B"); + } + + const persistRes = await fetch(`/api/games/${gameId}/onchain`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + depositBTxHash: submitData.txHash, + playerTwoPkh, + playerTwoFeedId: getOnchainFeedId(selectedRate), + playerTwoPriceFeedId, + startPriceA: depositResult.startPriceA, + startPriceB: depositResult.startPriceB, + deadlinePosix: depositResult.deadlinePosix, + }), + }); + if (!persistRes.ok) { + const persistData = (await persistRes.json()) as { error?: string }; + throw new Error(persistData.error ?? "Could not persist deposit B data"); + } + + const joinRes = await fetch(`/api/games/${gameId}/join`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + wallet: address, + selectedRate, + }), + }); + const joinData = (await joinRes.json()) as { game?: GameSession; error?: string }; + if (!joinRes.ok || !joinData.game) { + throw new Error(joinData.error ?? "Could not join game"); + } + + console.log(`[join-game] depositB tx: ${submitData.txHash}`); + console.log(`[join-game] explorer: https://preprod.cardanoscan.io/transaction/${submitData.txHash}`); + + await router.push(`/game/${gameId}?txHash=${submitData.txHash}`); + } catch (err) { + const message = err instanceof Error ? err.message : "Could not join game"; + setError(message); + } finally { + setJoining(false); + } + } + + return ( + <> + + Join Game + +
+ + + +
+ + ); +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/resolve.mjs b/lazer/cardano/lafhis/pyth-coin-stable-front/src/resolve.mjs new file mode 100644 index 00000000..80d63de3 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/resolve.mjs @@ -0,0 +1,356 @@ +/** + * resolve.mjs + * + * Step 3 of the Duelo de Traders flow: Backend resolves the duel post-deadline. + * + * This transaction: + * 1. Fetches verified Pyth final prices (ADA/USD and BTC/USD) + * 2. Performs a zero-ADA withdrawal from the Pyth script to verify prices on-chain + * 3. Spends the Active UTxO from the bet validator + * 4. Burns the authenticity NFT + * 5. Pays the winner the full pot (or refunds both players on draw) + * + * Required .env vars: + * PYTH_TOKEN โ€“ Pyth Lazer API token + * BLOCKFROST_ID โ€“ Blockfrost project ID (preprod) + * PYTH_POLICY_ID โ€“ PolicyId of the Pyth on-chain state NFT + * BACKEND_PKH โ€“ Payment key hash of the backend wallet + * MNEMONIC โ€“ Space-separated wallet mnemonic + * + * State is read from duel-state.json (written by depositB). + */ + +import { PythLazerClient } from "@pythnetwork/pyth-lazer-sdk"; +import { + BlockfrostProvider, + MeshWallet, + MeshTxBuilder, + resolveScriptHash, + applyParamsToScript, + mConStr0, + mConStr1, + resolveSlotNo, +} from "@meshsdk/core"; +import { bech32 } from "bech32"; +import dotenv from "dotenv"; +import { readFileSync } from "fs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +dotenv.config(); + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const DUEL_STATE_FILE = resolve(__dirname, "../duel-state.json"); + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// CONFIG +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +const required = (name) => { + const v = process.env[name]; + if (!v) { console.error(`Missing env var: ${name}`); process.exit(1); } + return v; +}; + +const PYTH_TOKEN = required("PYTH_TOKEN"); +const BLOCKFROST_ID = required("BLOCKFROST_ID"); +const PYTH_POLICY_ID = required("PYTH_POLICY_ID"); +const BACKEND_PKH = required("BACKEND_PKH"); +const MNEMONIC = required("MNEMONIC").split(" "); + +// State persisted by depositB +let duelState; +try { + duelState = JSON.parse(readFileSync(DUEL_STATE_FILE, "utf8")); +} catch { + console.error("duel-state.json not found โ€” run depositA and depositB first."); + process.exit(1); +} + +if (!duelState.depositB_txHash) { + console.error("depositB_txHash not found in duel-state.json โ€” run depositB first."); + process.exit(1); +} + +const ACTIVE_TX_HASH = duelState.depositB_txHash; +const ACTIVE_TX_INDEX = duelState.depositB_txIndex ?? 0; +const DUEL_ID = duelState.duelId; +const PLAYER_A_PKH = duelState.playerA_pkh; +const DEADLINE = duelState.deadline; +const BET_LOVELACE = duelState.betLovelace; +// For testing, player B is hardcoded. In prod, read from duel-state. +const PLAYER_B_PKH = "bb".repeat(28); + +const FEED_A = 16; // ADA/USD +const FEED_B = 29; // BTC/USD + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// SCRIPT SETUP +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +const cborBytesParam = (hex) => { + const len = hex.length / 2; + if (len < 24) return (0x40 | len).toString(16).padStart(2, "0") + hex; + if (len < 256) return "58" + len.toString(16).padStart(2, "0") + hex; + return "59" + (len >> 8).toString(16).padStart(2, "0") + (len & 0xff).toString(16).padStart(2, "0") + hex; +}; + +const plutus = JSON.parse(readFileSync( + new URL("../../pyth-coin-stable-validators/plutus.json", import.meta.url), "utf8" +)); +const NFT_COMPILED_CODE = plutus.validators.find((v) => v.title === "nft.nft_policy.mint").compiledCode; +const BET_COMPILED_CODE = plutus.validators.find((v) => v.title === "validators.bet.spend").compiledCode; +const WINNER_COMPILED_CODE = plutus.validators.find((v) => v.title === "winner_token.winner_token.mint").compiledCode; + +const mintScriptCbor = applyParamsToScript(NFT_COMPILED_CODE, [cborBytesParam(BACKEND_PKH)], "CBOR"); +const mintPolicyId = resolveScriptHash(mintScriptCbor, "V3"); + +const spendScriptCbor = applyParamsToScript(BET_COMPILED_CODE, [ + cborBytesParam(BACKEND_PKH), + cborBytesParam(mintPolicyId), + cborBytesParam(PYTH_POLICY_ID), +], "CBOR"); + +const winnerScriptCbor = applyParamsToScript(WINNER_COMPILED_CODE, [cborBytesParam(BACKEND_PKH)], "CBOR"); +const winnerPolicyId = resolveScriptHash(winnerScriptCbor, "V3"); +const WINNER_TOKEN_NAME = "686f727365736f6f65"; // "horseshoe" UTF-8 + +console.log("Mint policy ID: ", mintPolicyId); +console.log("Winner policy ID: ", winnerPolicyId); +console.log(); + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// HELPERS +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +const PYTH_STATE_ASSET_NAME = Buffer.from("Pyth State", "utf-8").toString("hex"); + +function scriptHashToRewardAddress(hash, networkId = 0) { + const header = networkId === 0 ? 0xf0 : 0xf1; + const bytes = Buffer.concat([Buffer.from([header]), Buffer.from(hash, "hex")]); + return bech32.encode(networkId === 0 ? "stake_test" : "stake", bech32.toWords(bytes), 200); +} + +function pkhToAddress(pkh) { + const bytes = Buffer.concat([Buffer.from([0x60]), Buffer.from(pkh, "hex")]); + return bech32.encode("addr_test", bech32.toWords(bytes), 200); +} + +async function resolvePythState() { + const base = "https://cardano-preprod.blockfrost.io/api/v0"; + const headers = { project_id: BLOCKFROST_ID }; + const unit = PYTH_POLICY_ID + PYTH_STATE_ASSET_NAME; + + const addrRes = await fetch(`${base}/assets/${unit}/addresses`, { headers }); + if (!addrRes.ok) throw new Error(`Pyth state lookup: ${await addrRes.text()}`); + const [{ address }] = await addrRes.json(); + + const utxoRes = await fetch(`${base}/addresses/${address}/utxos/${unit}`, { headers }); + if (!utxoRes.ok) throw new Error(`Pyth UTxO lookup: ${await utxoRes.text()}`); + const stateUtxo = (await utxoRes.json())[0]; + + let datum; + if (stateUtxo.data_hash) { + const r = await fetch(`${base}/scripts/datum/${stateUtxo.data_hash}`, { headers }); + if (r.ok) datum = (await r.json()).json_value; + } + if (!datum) { + const r = await fetch(`${base}/txs/${stateUtxo.tx_hash}/utxos`, { headers }); + const d = await r.json(); + datum = d.outputs.find((o) => o.output_index === stateUtxo.output_index)?.inline_datum; + } + if (!datum) throw new Error("No Pyth state datum"); + + const fields = datum?.fields ?? datum?.constructor?.fields; + if (!fields || fields.length < 4) throw new Error("Bad datum shape"); + + const withdrawScriptHash = fields[3].bytes; + const scriptRes = await fetch(`${base}/scripts/${withdrawScriptHash}/cbor`, { headers }); + if (!scriptRes.ok) throw new Error(`Pyth script CBOR: ${await scriptRes.text()}`); + const scriptSize = (await scriptRes.json()).cbor.length / 2; + + return { txHash: stateUtxo.tx_hash, txIndex: stateUtxo.output_index, withdrawScriptHash, scriptSize }; +} + +async function fetchSignedPrices(feedIds) { + const client = await PythLazerClient.create({ token: PYTH_TOKEN, webSocketPoolConfig: {} }); + const resp = await client.getLatestPrice({ + priceFeedIds: feedIds, + properties: ["price", "exponent"], + channel: "fixed_rate@200ms", + formats: ["solana"], + jsonBinaryEncoding: "hex", + parsed: true, + }); + client.shutdown(); + if (!resp.solana?.data) throw new Error("No Pyth payload"); + return { + signedUpdate: Buffer.from(resp.solana.data, "hex"), + parsedPrices: (resp.parsed?.priceFeeds ?? []).map((f) => ({ + feedId: f.priceFeedId, price: Number(f.price), exponent: Number(f.exponent), + })), + }; +} + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// MAIN +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +async function main() { + console.log("โ•โ•โ• Resolve โ•โ•โ•\n"); + + // Check deadline + const now = Date.now(); + if (now < DEADLINE) { + const remaining = Math.ceil((DEADLINE - now) / 1000); + console.log(` Deadline not reached yet. ${remaining}s remaining.`); + console.log(` Deadline: ${new Date(DEADLINE).toISOString()}`); + process.exit(0); + } + + // 1. Resolve Pyth state + console.log(" Resolving Pyth state..."); + const pythState = await resolvePythState(); + const pythRewardAddr = scriptHashToRewardAddress(pythState.withdrawScriptHash, 0); + console.log(` Pyth state: ${pythState.txHash}#${pythState.txIndex}`); + + // 2. Fetch final prices + console.log(" Fetching final prices..."); + const { signedUpdate, parsedPrices } = await fetchSignedPrices([FEED_A, FEED_B]); + + const finalA = parsedPrices.find((p) => p.feedId === FEED_A); + const finalB = parsedPrices.find((p) => p.feedId === FEED_B); + const endA = finalA.price; + const endB = finalB.price; + + // Read start prices from duel-state (set during depositB) + const startA = duelState.startPriceA; + const startB = duelState.startPriceB; + + console.log(` ADA/USD: start=${startA} โ†’ end=${endA}`); + console.log(` BTC/USD: start=${startB} โ†’ end=${endB}`); + + // Determine winner (same formula as validator) + const changeA = Math.trunc(((endA - startA) * 1_000_000) / startA); + const changeB = Math.trunc(((endB - startB) * 1_000_000) / startB); + const isDraw = Math.abs(changeA - changeB) < 100; + + console.log(` Change A: ${changeA} (${(changeA / 10_000).toFixed(2)}%)`); + console.log(` Change B: ${changeB} (${(changeB / 10_000).toFixed(2)}%)`); + console.log(` Result: ${isDraw ? "DRAW" : "WINNER = " + (changeA > changeB ? "Player A" : "Player B")}`); + console.log(); + + // 3. Setup wallet + const provider = new BlockfrostProvider(BLOCKFROST_ID); + const wallet = new MeshWallet({ + networkId: 0, + fetcher: provider, + submitter: provider, + key: { type: "mnemonic", words: MNEMONIC }, + }); + + const address = (await wallet.getUsedAddresses())[0]; + const utxos = await wallet.getUtxos(); + console.log(` Wallet: ${address}`); + console.log(` UTxOs: ${utxos.length}\n`); + + if (utxos.length === 0) { + console.log("No UTxOs. Fund this address with preprod tADA."); + process.exit(0); + } + + console.log(` Winner policy ID: ${winnerPolicyId}\n`); + + // 4. Build transaction + const totalPot = BET_LOVELACE * 2; + + // Encode Resolve { timestamp } as CBOR hex manually. + // mConStr1([largeInt]) has a known MeshJS serialisation issue with big integers. + // Constr 1 [I n] => d87a 81 + function cborConstr1Int(n) { + const buf = [0xd8, 0x7a, 0x81]; // tag(122) array(1) + const big = BigInt(n); + if (big <= 0x17n) { buf.push(Number(big)); } + else if (big <= 0xffn) { buf.push(0x18, Number(big)); } + else if (big <= 0xffffn){ buf.push(0x19, Number(big >> 8n), Number(big & 0xffn)); } + else if (big <= 0xffffffffn) { + buf.push(0x1a, + Number((big >> 24n) & 0xffn), Number((big >> 16n) & 0xffn), + Number((big >> 8n) & 0xffn), Number(big & 0xffn)); + } else { + buf.push(0x1b, + Number((big >> 56n) & 0xffn), Number((big >> 48n) & 0xffn), + Number((big >> 40n) & 0xffn), Number((big >> 32n) & 0xffn), + Number((big >> 24n) & 0xffn), Number((big >> 16n) & 0xffn), + Number((big >> 8n) & 0xffn), Number(big & 0xffn)); + } + return Buffer.from(buf).toString("hex"); + } + + const resolveRedeemerCbor = cborConstr1Int(DEADLINE); + const burnRedeemer = mConStr1([]); // Burn redeemer for nft_policy โ€” empty, no issue + const nowSlot = resolveSlotNo("preprod", Date.now()); + + const tx = new MeshTxBuilder({ fetcher: provider, submitter: provider }); + + tx + .invalidBefore(Number(nowSlot) - 600) + .invalidHereafter(Number(nowSlot) + 600) + .txInCollateral(utxos[0].input.txHash, utxos[0].input.outputIndex) + .requiredSignerHash(BACKEND_PKH) + + // Pyth zero-withdrawal + .withdrawalPlutusScriptV3() + .withdrawal(pythRewardAddr, "0") + .withdrawalTxInReference(pythState.txHash, pythState.txIndex, pythState.scriptSize, pythState.withdrawScriptHash) + .withdrawalRedeemerValue([signedUpdate.toString("hex")], "Mesh", { mem: 10_000_000, steps: 6_000_000_000 }) + + // Spend Active UTxO + .spendingPlutusScriptV3() + .txIn(ACTIVE_TX_HASH, ACTIVE_TX_INDEX) + .txInInlineDatumPresent() + .txInRedeemerValue(resolveRedeemerCbor, "CBOR", { mem: 5_000_000, steps: 2_000_000_000 }) + .txInScript(spendScriptCbor) + + // Burn the authenticity NFT + .mintPlutusScriptV3() + .mint("-1", mintPolicyId, DUEL_ID) + .mintingScript(mintScriptCbor) + .mintRedeemerValue(burnRedeemer, "Mesh", { mem: 1_000_000, steps: 1_000_000_000 }); + + if (isDraw) { + tx + .txOut(pkhToAddress(PLAYER_A_PKH), [{ unit: "lovelace", quantity: String(BET_LOVELACE) }]) + .txOut(pkhToAddress(PLAYER_B_PKH), [{ unit: "lovelace", quantity: String(BET_LOVELACE) }]); + } else { + const winnerPkh = changeA > changeB ? PLAYER_A_PKH : PLAYER_B_PKH; + + // Mint 1 winner trophy token (winner_token Plutus validator) + tx + .mintPlutusScriptV3() + .mint("1", winnerPolicyId, WINNER_TOKEN_NAME) + .mintingScript(winnerScriptCbor) + .mintRedeemerValue(mConStr0([]), "Mesh", { mem: 500_000, steps: 500_000_000 }); + + tx.txOut(pkhToAddress(winnerPkh), [ + { unit: "lovelace", quantity: String(totalPot) }, + { unit: winnerPolicyId + WINNER_TOKEN_NAME, quantity: "1" }, + ]); + } + + tx + .changeAddress(address) + .selectUtxosFrom(utxos); + + console.log(" Building transaction..."); + const unsigned = await tx.complete(); + const signed = await wallet.signTx(unsigned); + const txHash = await wallet.submitTx(signed); + + console.log("\n TX submitted:", txHash); + console.log(" https://preprod.cardanoscan.io/transaction/" + txHash); +} + +main().catch((err) => { + console.error("\nError:", err); + process.exit(1); +}); diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/server/gameStore.ts b/lazer/cardano/lafhis/pyth-coin-stable-front/src/server/gameStore.ts new file mode 100644 index 00000000..b52bcb24 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/server/gameStore.ts @@ -0,0 +1,126 @@ +import type { GameConfig, GameSession } from "@/types/game"; + +const RATE_SET = new Set(["ADA/USD", "BTC/USD", "ETH/USD", "BNB/USD"]); +const DURATION_SET = new Set(["1m", "5m", "1h"]); +const sessions = new Map(); + +function normalizeWallet(wallet: string) { + return wallet.trim().toLowerCase(); +} + +function buildId() { + return Math.random().toString(36).slice(2, 10).toUpperCase(); +} + +export function validateGameConfig(input: unknown): GameConfig | null { + if (!input || typeof input !== "object") return null; + + const cfg = input as Record; + const rate = String(cfg.rate ?? ""); + const duration = String(cfg.duration ?? ""); + const betAda = Number(cfg.betAda); + + if (!RATE_SET.has(rate)) return null; + if (!DURATION_SET.has(duration)) return null; + if (!Number.isFinite(betAda) || betAda <= 0) return null; + + return { + rate: rate as GameConfig["rate"], + duration: duration as GameConfig["duration"], + betAda, + }; +} + +export function createSession(config: GameConfig, creatorWallet: string) { + const wallet = normalizeWallet(creatorWallet); + const now = new Date().toISOString(); + let id = buildId(); + while (sessions.has(id)) id = buildId(); + + const session: GameSession = { + id, + createdAt: now, + updatedAt: now, + status: "waiting_for_player", + config, + playerOneWallet: wallet, + playerTwoWallet: null, + playerTwoRate: null, + onchain: { + duelId: null, + depositATxHash: null, + depositATxIndex: null, + depositBTxHash: null, + playerOnePkh: null, + playerTwoPkh: null, + playerOneFeedId: null, + playerTwoFeedId: null, + playerOnePriceFeedId: null, + playerTwoPriceFeedId: null, + startPriceA: null, + startPriceB: null, + deadlinePosix: null, + }, + }; + + sessions.set(id, session); + return session; +} + +export function getSession(id: string) { + return sessions.get(id.toUpperCase()) ?? null; +} + +export function updateSessionOnchain( + id: string, + patch: Partial, +) { + const session = getSession(id); + if (!session) return null; + + const updated: GameSession = { + ...session, + updatedAt: new Date().toISOString(), + onchain: { + ...session.onchain, + ...patch, + }, + }; + + sessions.set(updated.id, updated); + return updated; +} + +export function validateRate(input: unknown): GameConfig["rate"] | null { + const rate = String(input ?? ""); + if (!RATE_SET.has(rate)) return null; + return rate as GameConfig["rate"]; +} + +export function joinSession(id: string, wallet: string, selectedRate: GameConfig["rate"]) { + const session = getSession(id); + if (!session) return { error: "not_found" as const, session: null }; + + const normalizedWallet = normalizeWallet(wallet); + if (normalizedWallet === session.playerOneWallet || normalizedWallet === session.playerTwoWallet) { + return { error: null, session }; + } + + if (session.playerTwoWallet) { + return { error: "full" as const, session }; + } + if (selectedRate === session.config.rate) { + return { error: "same_rate" as const, session }; + } + + const updated: GameSession = { + ...session, + playerTwoWallet: normalizedWallet, + playerTwoRate: selectedRate, + status: "ready", + updatedAt: new Date().toISOString(), + }; + + sessions.set(updated.id, updated); + return { error: null, session: updated }; +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/styles/globals.css b/lazer/cardano/lafhis/pyth-coin-stable-front/src/styles/globals.css new file mode 100644 index 00000000..609ff86f --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/styles/globals.css @@ -0,0 +1,331 @@ +@import url("https://fonts.googleapis.com/css2?family=Press+Start+2P&family=IBM+Plex+Mono:wght@400;600;700&display=swap"); + +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --bg-1: #07091a; + --bg-2: #0c1033; + --panel: #0f1540; + --accent: #7c3aed; + --accent-2: #06b6d4; + --line: #a78bfa; + --line-soft: rgba(167, 139, 250, 0.15); + --text: #e8eeff; +} + +html, +body, +#__next { + min-height: 100%; +} + +body { + margin: 0; + font-family: "IBM Plex Mono", monospace; + color: var(--text); + background: + radial-gradient(ellipse at 14% 10%, rgba(124, 58, 237, 0.2), transparent 38%), + radial-gradient(ellipse at 86% 80%, rgba(6, 182, 212, 0.13), transparent 38%), + linear-gradient(160deg, var(--bg-1) 0%, var(--bg-2) 60%, #060818 100%); +} + +h1, +h2, +h3 { + font-family: "Press Start 2P", monospace; + letter-spacing: 0.03em; +} + +.landing-root { + position: relative; + overflow: hidden; +} + +.landing-root::before { + content: ""; + position: absolute; + inset: 0; + pointer-events: none; + opacity: 0.14; + background-image: + linear-gradient(var(--line-soft) 1px, transparent 1px), + linear-gradient(90deg, var(--line-soft) 1px, transparent 1px); + background-size: 32px 32px; +} + +.top-nav { + backdrop-filter: blur(12px); +} + +.nav-logo-mark { + display: inline-flex; + flex-direction: column; + align-items: center; + line-height: 1.1; + gap: 2px; +} + +.nav-logo-top { + font-family: "Press Start 2P", monospace; + font-size: 7px; + letter-spacing: 0.28em; + color: #a78bfa; +} + +.nav-logo-bottom { + font-family: "Press Start 2P", monospace; + font-size: 13px; + letter-spacing: 0.1em; + background: linear-gradient(90deg, #a78bfa 0%, #22d3ee 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.nav-chip { + border: 1px solid rgba(167, 139, 250, 0.28); + border-radius: 8px; + padding: 9px 11px; + font-family: "Press Start 2P", monospace; + font-size: 10px; + line-height: 1.2; + color: #c4b5fd; + background: linear-gradient(180deg, rgba(124, 58, 237, 0.12), rgba(124, 58, 237, 0.03)); + text-decoration: none; + transition: 160ms ease; +} + +.nav-chip:hover { + border-color: rgba(167, 139, 250, 0.7); + color: #e8eeff; + transform: translateY(-1px); + box-shadow: 0 0 12px rgba(124, 58, 237, 0.3); +} + +.wallet-nav-control button[aria-haspopup="dialog"], +.wallet-nav-control button[aria-haspopup="menu"] { + border: 1px solid rgba(167, 139, 250, 0.28); + border-radius: 8px; + padding: 9px 11px; + height: auto; + font-family: "Press Start 2P", monospace; + font-size: 10px; + line-height: 1.2; + color: #c4b5fd; + background: linear-gradient(180deg, rgba(124, 58, 237, 0.12), rgba(124, 58, 237, 0.03)); + box-shadow: none; + transition: 160ms ease; +} + +.wallet-nav-control button[aria-haspopup="dialog"] { + border-color: rgba(167, 139, 250, 0.5); + color: #e8eeff; + background: linear-gradient(180deg, rgba(124, 58, 237, 0.28), rgba(124, 58, 237, 0.1)); + box-shadow: 0 0 14px rgba(124, 58, 237, 0.24); +} + +.wallet-nav-control button[aria-haspopup="dialog"]:hover, +.wallet-nav-control button[aria-haspopup="menu"]:hover { + border-color: rgba(167, 139, 250, 0.8); + color: #f0f4ff; + transform: translateY(-1px); +} + +.wallet-nav-control button[aria-haspopup="dialog"]:hover { + box-shadow: 0 0 20px rgba(124, 58, 237, 0.4); +} + +.wallet-gate { + margin: 0 auto; + max-width: 720px; + border: 1px solid rgba(167, 139, 250, 0.28); + border-radius: 20px; + background: rgba(7, 9, 26, 0.82); + padding: 44px 24px; + text-align: center; +} + +.wallet-gate-title { + margin: 0; + font-size: clamp(1.1rem, 3vw, 1.7rem); + color: #e8eeff; +} + +.wallet-gate-text { + margin: 16px auto 26px; + max-width: 520px; + color: rgba(196, 181, 253, 0.9); + font-size: 0.92rem; +} + +.wallet-gate-control { + display: flex; + justify-content: center; +} + +.wallet-gate-control button[aria-haspopup="dialog"], +.wallet-gate-control button[aria-haspopup="menu"] { + border: 1px solid rgba(167, 139, 250, 0.55); + border-radius: 12px; + padding: 14px 20px; + height: auto; + font-family: "Press Start 2P", monospace; + font-size: 12px; + line-height: 1.25; + color: #e8eeff; + background: linear-gradient(180deg, rgba(124, 58, 237, 0.35), rgba(124, 58, 237, 0.12)); + box-shadow: 0 0 20px rgba(124, 58, 237, 0.3); + transition: 160ms ease; +} + +.wallet-gate-control button[aria-haspopup="dialog"]:hover, +.wallet-gate-control button[aria-haspopup="menu"]:hover { + border-color: rgba(167, 139, 250, 0.85); + color: #f0f4ff; + transform: translateY(-1px); + box-shadow: 0 0 28px rgba(124, 58, 237, 0.5); +} + +.bet-input-no-spinner::-webkit-outer-spin-button, +.bet-input-no-spinner::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +.bet-input-no-spinner[type="number"] { + -moz-appearance: textfield; + appearance: textfield; +} + +.wallet-cta { + border: 1px solid rgba(167, 139, 250, 0.6); + border-radius: 10px; + padding: 10px 12px; + font-family: "Press Start 2P", monospace; + font-size: 10px; + line-height: 1.2; + color: #f0f4ff; + background: linear-gradient(135deg, rgba(124, 58, 237, 0.5), rgba(6, 182, 212, 0.28)); + box-shadow: 0 0 18px rgba(124, 58, 237, 0.28); + cursor: pointer; + transition: 160ms ease; +} + +.wallet-cta:hover { + transform: translateY(-1px); + box-shadow: 0 0 24px rgba(124, 58, 237, 0.46); +} + +.race-track { + background: + linear-gradient(180deg, rgba(124, 58, 237, 0.07), rgba(6, 182, 212, 0.03)), + linear-gradient(140deg, #0a0d22, var(--panel)); +} + +.track-lane { + position: relative; + display: grid; + grid-template-columns: auto auto 1fr; + align-items: center; + gap: 10px; + border: 1px solid rgba(167, 139, 250, 0.2); + border-radius: 10px; + padding: 10px 12px; + margin-bottom: 10px; + overflow: hidden; + background: linear-gradient(90deg, rgba(124, 58, 237, 0.1), rgba(6, 182, 212, 0.04)); +} + +.track-lane::after { + content: ""; + position: absolute; + left: 0; + right: 0; + bottom: 0; + border-bottom: 2px dashed rgba(167, 139, 250, 0.22); +} + +.lane-tag { + font-size: 0.66rem; + text-transform: uppercase; + letter-spacing: 0.08em; + color: #a78bfa; + font-weight: 700; +} + +.lane-asset { + font-size: 0.72rem; + color: #e8eeff; + font-weight: 700; +} + +.pixel-duel { + display: inline-flex; + align-items: center; + gap: 10px; +} + +.duel-img { + width: 44px; + height: 44px; + object-fit: contain; + image-rendering: pixelated; + filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.7)); +} + +.pixel-vs { + font-family: "Press Start 2P", monospace; + font-size: 10px; + background: linear-gradient(90deg, #a78bfa, #22d3ee); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.runner { + justify-self: end; + display: inline-flex; + align-items: center; + animation: run-lane 2.7s steps(2, end) infinite alternate; +} + +.runner.delayed { + animation-delay: 0.5s; +} + +.lane-horse { + width: 52px; + height: 52px; + object-fit: contain; + image-rendering: pixelated; + filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.7)); +} + +.ticker-track { + animation: ticker-scroll 90s linear infinite; + width: max-content; +} + +.ticker-track:hover { + animation-play-state: paused; +} + +@keyframes ticker-scroll { + from { + transform: translateX(0); + } + to { + transform: translateX(-50%); + } +} + +@keyframes run-lane { + from { + transform: translateX(-40px); + } + to { + transform: translateX(0); + } +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/testFlow.mjs b/lazer/cardano/lafhis/pyth-coin-stable-front/src/testFlow.mjs new file mode 100644 index 00000000..8951db60 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/testFlow.mjs @@ -0,0 +1,607 @@ +/** + * testFlow.mjs + * + * End-to-end test of the Duelo de Traders transaction flow + * using always-true validators as placeholders. + * + * Flow: + * 1. DepositA โ€“ Player A creates a duel (mint NFT + send ADA to script) + * 2. DepositB โ€“ Player B joins (consume Waiting โ†’ create Active, Pyth prices) + * 3. Resolve โ€“ Backend resolves (consume Active โ†’ pay winner, mint victory token) + * + * All three use the same wallet (for testing). In production they'd be separate. + * + * โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + * Setup: + * + * 1. Add always_true.ak to your Aiken project, run `aiken build` + * 2. From plutus.json, grab the compiledCode for: + * always_true_spend.spend โ†’ spendScriptDouble + * always_true_mint.mint โ†’ mintScriptDouble + * 3. Put them in .env (see below) + * 4. Fund the wallet with preprod tADA + * 5. Run: node testFlow.mjs + * + * โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + * .env: + * + * PYTH_TOKEN=... + * BLOCKFROST_ID=... + * PYTH_POLICY_ID=... + * spendScriptDouble=... (from plutus.json โ†’ always_true_spend) + * mintScriptDouble=... (from plutus.json โ†’ always_true_mint) + */ + +import { PythLazerClient } from "@pythnetwork/pyth-lazer-sdk"; +import { + BlockfrostProvider, + MeshWallet, + MeshTxBuilder, + resolveScriptHash, + serializePlutusScript, + applyParamsToScript, + mConStr0, + mConStr1, + resolveSlotNo, + resolvePaymentKeyHash, +} from "@meshsdk/core"; +import { bech32 } from "bech32"; +import { createHash } from "crypto"; +import dotenv from "dotenv"; +import { readFileSync, writeFileSync, existsSync } from "fs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +dotenv.config(); + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const WALLET_FILE = resolve(__dirname, "wallet.json"); + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// CONFIG +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +const required = (name) => { + const v = process.env[name]; + if (!v) { console.error(`Missing env var: ${name}`); process.exit(1); } + return v; +}; + +const PYTH_TOKEN = required("PYTH_TOKEN"); +const BLOCKFROST_ID = required("BLOCKFROST_ID"); +const PYTH_POLICY_ID = required("PYTH_POLICY_ID"); +const BACKEND_PKH = required("BACKEND_PKH"); +const MNEMONIC = required("MNEMONIC").split(" "); + + +const FEED_A = 16; // ADA/USD +const FEED_B = 29; // BTC/USD +const BET_LOVELACE = 5_000_000; // 5 ADA + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// SCRIPT SETUP โ€” apply parameters to real validators +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +// Encode a hex string as a CBOR bytes param for applyParamsToScript("CBOR") +const cborBytesParam = (hex) => { + const len = hex.length / 2; + if (len < 24) return (0x40 | len).toString(16).padStart(2, "0") + hex; + if (len < 256) return "58" + len.toString(16).padStart(2, "0") + hex; + return "59" + (len >> 8).toString(16).padStart(2, "0") + (len & 0xff).toString(16).padStart(2, "0") + hex; +}; + +// Load compiledCode from plutus.json +const { readFileSync: _readFileSync } = await import("fs"); +const _plutus = JSON.parse(_readFileSync( + new URL("../../pyth-coin-stable-validators/plutus.json", import.meta.url), "utf8" +)); +const NFT_COMPILED_CODE = _plutus.validators.find((v) => v.title === "nft.nft_policy.mint").compiledCode; +const BET_COMPILED_CODE = _plutus.validators.find((v) => v.title === "validators.bet.spend").compiledCode; + +// nft_policy(backend_pkh) +const mintScriptCbor = applyParamsToScript(NFT_COMPILED_CODE, [cborBytesParam(BACKEND_PKH)], "CBOR"); +const mintPolicyId = resolveScriptHash(mintScriptCbor, "V3"); + +// bet(backend_pkh, nft_policy_id, pyth_id) +const spendScriptCbor = applyParamsToScript(BET_COMPILED_CODE, [ + cborBytesParam(BACKEND_PKH), + cborBytesParam(mintPolicyId), + cborBytesParam(PYTH_POLICY_ID), +], "CBOR"); +const spendScriptHash = resolveScriptHash(spendScriptCbor, "V3"); + +const scriptAddress = serializePlutusScript( + { code: spendScriptCbor, version: "V3" }, + undefined, + 0, + false, +).address; + +console.log("Spend script hash:", spendScriptHash); +console.log("Mint policy ID:", mintPolicyId); +console.log("Script address:", scriptAddress); +console.log(); + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// PYTH HELPERS +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +const PYTH_STATE_ASSET_NAME = Buffer.from("Pyth State", "utf-8").toString("hex"); + +function scriptHashToRewardAddress(hash, networkId = 0) { + const header = networkId === 0 ? 0xf0 : 0xf1; + const bytes = Buffer.concat([Buffer.from([header]), Buffer.from(hash, "hex")]); + return bech32.encode(networkId === 0 ? "stake_test" : "stake", bech32.toWords(bytes), 200); +} + +async function resolvePythState() { + const base = "https://cardano-preprod.blockfrost.io/api/v0"; + const headers = { project_id: BLOCKFROST_ID }; + const unit = PYTH_POLICY_ID + PYTH_STATE_ASSET_NAME; + + const addrRes = await fetch(`${base}/assets/${unit}/addresses`, { headers }); + if (!addrRes.ok) throw new Error(`Pyth state lookup: ${await addrRes.text()}`); + const [{ address }] = await addrRes.json(); + + const utxoRes = await fetch(`${base}/addresses/${address}/utxos/${unit}`, { headers }); + if (!utxoRes.ok) throw new Error(`Pyth UTxO lookup: ${await utxoRes.text()}`); + const stateUtxo = (await utxoRes.json())[0]; + + let datum; + if (stateUtxo.data_hash) { + const r = await fetch(`${base}/scripts/datum/${stateUtxo.data_hash}`, { headers }); + if (r.ok) datum = (await r.json()).json_value; + } + if (!datum) { + const r = await fetch(`${base}/txs/${stateUtxo.tx_hash}/utxos`, { headers }); + const d = await r.json(); + datum = d.outputs.find((o) => o.output_index === stateUtxo.output_index)?.inline_datum; + } + if (!datum) throw new Error("No Pyth state datum"); + + const fields = datum?.fields ?? datum?.constructor?.fields; + if (!fields || fields.length < 4) throw new Error("Bad datum shape"); + + const withdrawScriptHash = fields[3].bytes; + const scriptRes = await fetch(`${base}/scripts/${withdrawScriptHash}/cbor`, { headers }); + if (!scriptRes.ok) throw new Error(`Pyth script CBOR: ${await scriptRes.text()}`); + const scriptSize = (await scriptRes.json()).cbor.length / 2; + + return { + txHash: stateUtxo.tx_hash, + txIndex: stateUtxo.output_index, + withdrawScriptHash, + scriptSize, + }; +} + +async function fetchSignedPrices(feedIds) { + const client = await PythLazerClient.create({ token: PYTH_TOKEN, webSocketPoolConfig: {} }); + const resp = await client.getLatestPrice({ + priceFeedIds: feedIds, + properties: ["price", "exponent"], + channel: "fixed_rate@200ms", + formats: ["solana"], + jsonBinaryEncoding: "hex", + parsed: true, + }); + client.shutdown(); + if (!resp.solana?.data) throw new Error("No Pyth payload"); + return { + signedUpdate: Buffer.from(resp.solana.data, "hex"), + parsedPrices: (resp.parsed?.priceFeeds ?? []).map((f) => ({ + feedId: f.priceFeedId, price: f.price, exponent: f.exponent, + })), + }; +} + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// PLUTUS DATA HELPERS +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +const someD = (inner) => mConStr0([inner]); +const noneD = () => mConStr1([]); + +const playerD = ({ pkh, feedId, startPrice }) => + mConStr0([pkh, feedId, startPrice != null ? someD(startPrice) : noneD()]); + +const duelDatumD = ({ duelId, playerA, playerB, betLovelace, statusIdx, deadline }) => + mConStr0([ + duelId, + playerD(playerA), + playerB ? someD(playerD(playerB)) : noneD(), + betLovelace, + statusIdx === 0 ? mConStr0([]) : mConStr1([]), + deadline != null ? someD(deadline) : noneD(), + ]); + +// Aiken's TransactionId is a type alias for ByteArray (no constructor wrapper) +const outputRefD = (txHash, index) => mConStr0([txHash, index]); + +function computeDuelId(txHash, outputIndex) { + const txBuf = Buffer.from(txHash, "hex"); + // Aiken: bytearray.from_int_big_endian(output_index, 8) โ€” always 8 bytes + const idxBuf = Buffer.alloc(8); + idxBuf.writeBigUInt64BE(BigInt(outputIndex)); + return createHash("sha256").update(Buffer.concat([txBuf, idxBuf])).digest("hex"); +} + +function pkhToAddress(pkh) { + const bytes = Buffer.concat([Buffer.from([0x60]), Buffer.from(pkh, "hex")]); + return bech32.encode("addr_test", bech32.toWords(bytes), 200); +} + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// WALLET SETUP +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +async function setupWallet(provider) { + + const wallet = new MeshWallet({ + networkId: 0, + fetcher: provider, + submitter: provider, + key: { type: "mnemonic", words: MNEMONIC }, + }); + + const address = (await wallet.getUsedAddresses())[0]; + const utxos = await wallet.getUtxos(); + console.log("Address:", address); + console.log("UTxOs:", utxos.length, "\n"); + + if (utxos.length === 0) { + console.log("No UTxOs. Fund this address with preprod tADA:"); + console.log(" https://docs.cardano.org/cardano-testnets/tools/faucet/"); + process.exit(0); + } + + return { wallet, address, utxos }; +} + +function sleep(ms) { + console.log(` Waiting ${ms / 1000}s...\n`); + return new Promise((r) => setTimeout(r, ms)); +} + +async function waitForTx(provider, txHash, maxAttempts = 30) { + for (let i = 0; i < maxAttempts; i++) { + try { + await provider.fetchTxInfo(txHash); + return true; + } catch { + await sleep(5_000); + } + } + throw new Error(`TX ${txHash} not confirmed after ${maxAttempts} attempts`); +} + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// STEP 1: DEPOSIT A +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +async function depositA(provider, wallet, address, utxos, playerPkh) { + console.log("โ•โ•โ• STEP 1: DepositA โ•โ•โ•\n"); + + const seed = utxos[0].input; + const duelId = computeDuelId(seed.txHash, seed.outputIndex); + console.log(" Seed UTxO:", `${seed.txHash}#${seed.outputIndex}`); + console.log(" Duel ID:", duelId); + + const datum = duelDatumD({ + duelId, + playerA: { pkh: playerPkh, feedId: FEED_A, startPrice: null }, + playerB: null, + betLovelace: BET_LOVELACE, + statusIdx: 0, + deadline: null, + }); + + const mintRedeemer = mConStr0([outputRefD(seed.txHash, seed.outputIndex)]); + + const nowSlot = resolveSlotNo("preprod", Date.now()); + + let tx = new MeshTxBuilder({ fetcher: provider, submitter: provider }); + + console.log(" nowSlot:", nowSlot); + tx = tx.invalidBefore(Number(nowSlot) - 60); + console.log(" โœ“ invalidBefore"); + tx = tx.invalidHereafter(Number(nowSlot) + 60); + console.log(" โœ“ invalidHereafter"); + tx = tx.txInCollateral(utxos[1].input.txHash, utxos[1].input.outputIndex); + console.log(" โœ“ txInCollateral"); + tx = tx.txIn(seed.txHash, seed.outputIndex); + console.log(" โœ“ txIn"); + tx = tx.mintPlutusScriptV3(); + console.log(" โœ“ mintPlutusScriptV3"); + tx = tx.mint("1", mintPolicyId, duelId); + console.log(" โœ“ mint", mintPolicyId, duelId); + tx = tx.mintingScript(mintScriptDouble); + console.log(" โœ“ mintingScript"); + tx = tx.mintRedeemerValue(mintRedeemer); + console.log(" โœ“ mintRedeemerValue", JSON.stringify(mintRedeemer)); + tx = tx.txOut(scriptAddress, [ + { unit: "lovelace", quantity: String(BET_LOVELACE) }, + { unit: mintPolicyId + duelId, quantity: "1" }, + ]); console.log(" โœ“ txOut"); + tx = tx.txOutInlineDatumValue(datum); + console.log(" โœ“ txOutInlineDatumValue", JSON.stringify(datum)); + tx = tx.changeAddress(address); + console.log(" โœ“ changeAddress"); + tx = tx.selectUtxosFrom(utxos); + console.log(" โœ“ selectUtxosFrom"); + + const unsigned = await tx.complete(); + const signed = await wallet.signTx(unsigned); + const txHash = await wallet.submitTx(signed); + + console.log(" TX submitted:", txHash); + console.log(" https://preprod.cardanoscan.io/transaction/" + txHash); + console.log(); + return { txHash, duelId }; +} + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// STEP 2: DEPOSIT B (JOIN) +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +async function depositB(provider, wallet, address, utxos, playerPkh, depositATxHash, depositATxIndex, duelId, playerA_pkh) { + console.log("โ•โ•โ• STEP 2: DepositB (Join) โ•โ•โ•\n"); + + // Pyth setup + console.log(" Resolving Pyth state..."); + const pythState = await resolvePythState(); + const pythRewardAddr = scriptHashToRewardAddress(pythState.withdrawScriptHash, 0); + console.log(" Pyth state:", `${pythState.txHash}#${pythState.txIndex}`); + + // Fetch starting prices + console.log(" Fetching starting prices..."); + const { signedUpdate, parsedPrices } = await fetchSignedPrices([FEED_A, FEED_B]); + + const priceA = parsedPrices.find((p) => p.feedId === FEED_A); + const priceB = parsedPrices.find((p) => p.feedId === FEED_B); + const scaledA = Math.trunc(priceA.price * Math.pow(10, priceA.exponent)); + const scaledB = Math.trunc(priceB.price * Math.pow(10, priceB.exponent)); + console.log(` ADA/USD: raw=${priceA.price} exp=${priceA.exponent} โ†’ ${scaledA}`); + console.log(` BTC/USD: raw=${priceB.price} exp=${priceB.exponent} โ†’ ${scaledB}`); + + const deadlinePosix = Date.now() + 60_000; // 1 minute duel + const totalPot = BET_LOVELACE * 2; + + const newDatum = duelDatumD({ + duelId, + playerA: { pkh: playerA_pkh, feedId: FEED_A, startPrice: scaledA }, + playerB: { pkh: playerPkh, feedId: FEED_B, startPrice: scaledB }, + betLovelace: BET_LOVELACE, + statusIdx: 1, // Active + deadline: deadlinePosix, + }); + + const joinRedeemer = mConStr0([playerPkh, FEED_B]); + const nowSlot = resolveSlotNo("preprod", Date.now()); + + const tx = new MeshTxBuilder({ fetcher: provider, submitter: provider }); + + tx + .invalidBefore(Number(nowSlot) - 60) + .invalidHereafter(Number(nowSlot) + 60) + + .txInCollateral(utxos[0].input.txHash, utxos[0].input.outputIndex) + + // Pyth zero-withdrawal (state UTxO is both the reference input and the script source) + .withdrawalPlutusScriptV3() + .withdrawal(pythRewardAddr, "0") + .withdrawalTxInReference(pythState.txHash, pythState.txIndex, pythState.scriptSize, pythState.withdrawScriptHash) + .withdrawalRedeemerValue(mConStr0([signedUpdate.toString("hex")])) + + // Consume DepositA UTxO + .spendingPlutusScriptV3() + .txIn(depositATxHash, depositATxIndex) + .txInInlineDatumPresent() + .txInRedeemerValue(joinRedeemer) + .txInScript(spendScriptDouble) + + // Output: 2ร— bet + NFT โ†’ script with ActiveDatum + .txOut(scriptAddress, [ + { unit: "lovelace", quantity: String(totalPot) }, + { unit: mintPolicyId + duelId, quantity: "1" }, + ]) + .txOutInlineDatumValue(newDatum) + + .changeAddress(address) + .selectUtxosFrom(utxos); + + const unsigned = await tx.complete(); + const signed = await wallet.signTx(unsigned); + const txHash = await wallet.submitTx(signed); + + console.log(" TX submitted:", txHash); + console.log(" https://preprod.cardanoscan.io/transaction/" + txHash); + console.log(" Deadline:", new Date(deadlinePosix).toISOString()); + console.log(); + + return { txHash, scaledA, scaledB, deadlinePosix }; +} + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// STEP 3: RESOLVE +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +async function resolveStep(provider, wallet, address, utxos, activeTxHash, activeTxIndex, duelId, playerA_pkh, playerB_pkh, startA, startB, deadline) { + console.log("โ•โ•โ• STEP 3: Resolve โ•โ•โ•\n"); + + // Pyth setup + console.log(" Resolving Pyth state..."); + const pythState = await resolvePythState(); + const pythRewardAddr = scriptHashToRewardAddress(pythState.withdrawScriptHash, 0); + + // Fetch final prices + console.log(" Fetching final prices..."); + const { signedUpdate, parsedPrices } = await fetchSignedPrices([FEED_A, FEED_B]); + + const finalA = parsedPrices.find((p) => p.feedId === FEED_A); + const finalB = parsedPrices.find((p) => p.feedId === FEED_B); + const endA = Math.trunc(finalA.price * Math.pow(10, finalA.exponent)); + const endB = Math.trunc(finalB.price * Math.pow(10, finalB.exponent)); + + console.log(` ADA/USD: start=${startA} โ†’ end=${endA}`); + console.log(` BTC/USD: start=${startB} โ†’ end=${endB}`); + + // Determine winner (same formula as validator) + const changeA = Math.trunc(((endA - startA) * 1_000_000) / startA); + const changeB = Math.trunc(((endB - startB) * 1_000_000) / startB); + const isDraw = Math.abs(changeA - changeB) < 10_000; + + let winnerPkh = null; + if (!isDraw) { + winnerPkh = changeA > changeB ? playerA_pkh : playerB_pkh; + } + + console.log(` Change A: ${changeA} (${(changeA / 10_000).toFixed(2)}%)`); + console.log(` Change B: ${changeB} (${(changeB / 10_000).toFixed(2)}%)`); + console.log(` Result: ${isDraw ? "DRAW" : "WINNER = " + (changeA > changeB ? "Player A" : "Player B")}`); + + const totalPot = BET_LOVELACE * 2; + const resolveRedeemer = mConStr1([deadline]); + const nowSlot = resolveSlotNo("preprod", Date.now()); + + const tx = new MeshTxBuilder({ fetcher: provider, submitter: provider }); + + tx + .invalidBefore(Number(nowSlot) - 60) + .invalidHereafter(Number(nowSlot) + 60) + + .txInCollateral(utxos[0].input.txHash, utxos[0].input.outputIndex) + + // Pyth zero-withdrawal (state UTxO is both the reference input and the script source) + .withdrawalPlutusScriptV3() + .withdrawal(pythRewardAddr, "0") + .withdrawalTxInReference(pythState.txHash, pythState.txIndex, pythState.scriptSize, pythState.withdrawScriptHash) + .withdrawalRedeemerValue(mConStr0([signedUpdate.toString("hex")])) + + // Consume active duel UTxO + .spendingPlutusScriptV3() + .txIn(activeTxHash, activeTxIndex) + .txInInlineDatumPresent() + .txInRedeemerValue(resolveRedeemer) + .txInScript(spendScriptDouble); + + if (isDraw) { + const addrA = pkhToAddress(playerA_pkh); + const addrB = pkhToAddress(playerB_pkh); + tx + .txOut(addrA, [{ unit: "lovelace", quantity: String(BET_LOVELACE) }]) + .txOut(addrB, [{ unit: "lovelace", quantity: String(BET_LOVELACE) }]); + } else { + const winnerAddr = pkhToAddress(winnerPkh); + + // Mint victory token + tx + .mintPlutusScriptV3() + .mint("1", mintPolicyId, VICTORY_TOKEN_NAME) + .mintingScript(mintScriptDouble) + .mintRedeemerValue(mConStr0([])); + + tx.txOut(winnerAddr, [ + { unit: "lovelace", quantity: String(totalPot) }, + { unit: mintPolicyId + VICTORY_TOKEN_NAME, quantity: "1" }, + ]); + } + + tx + .changeAddress(address) + .selectUtxosFrom(utxos); + + const unsigned = await tx.complete(); + const signed = await wallet.signTx(unsigned); + const txHash = await wallet.submitTx(signed); + + console.log(" TX submitted:", txHash); + console.log(" https://preprod.cardanoscan.io/transaction/" + txHash); + console.log(); + + return { txHash, isDraw, winnerPkh }; +} + +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +// MAIN โ€” RUN THE FULL FLOW +// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +async function main() { + + console.log("โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—"); + console.log("โ•‘ Duelo de Traders โ€” End-to-End Test Flow โ•‘"); + console.log("โ•‘ Using always-true validators on preprod โ•‘"); + console.log("โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n"); + + const provider = new BlockfrostProvider(BLOCKFROST_ID); + const { wallet, address, utxos } = await setupWallet(provider); + + // Use a fake PKH for testing (28 bytes = 56 hex chars) + // In prod these come from the connected wallets + const playerA_pkh = "aa".repeat(28); + const playerB_pkh = "bb".repeat(28); + + // โ”€โ”€ Step 1: DepositA โ”€โ”€ + const { txHash: depositATxHash, duelId } = await depositA( + provider, wallet, address, utxos, playerA_pkh, + ); + + console.log(" Waiting for DepositA confirmation..."); + await waitForTx(provider, depositATxHash); + console.log(" DepositA confirmed!\n"); + + // Refresh UTxOs after DepositA + const utxos2 = await wallet.getUtxos(); + + // The script UTxO is at output index 0 of the DepositA TX + // (txOut is the first output we added to the builder) + const depositATxIndex = 0; + + // โ”€โ”€ Step 2: DepositB โ”€โ”€ + const { txHash: depositBTxHash, scaledA, scaledB, deadlinePosix } = await depositB( + provider, wallet, address, utxos2, playerB_pkh, + depositATxHash, depositATxIndex, duelId, playerA_pkh, + ); + + console.log(" Waiting for DepositB confirmation..."); + await waitForTx(provider, depositBTxHash); + console.log(" DepositB confirmed!\n"); + + // โ”€โ”€ Wait for the duel to finish โ”€โ”€ + const waitMs = Math.max(0, deadlinePosix - Date.now()) + 5_000; // + 5s buffer + console.log(` Duel in progress! Waiting ${Math.ceil(waitMs / 1000)}s for deadline...\n`); + await sleep(waitMs); + + // Refresh UTxOs + const utxos3 = await wallet.getUtxos(); + const activeTxIndex = 0; + + // โ”€โ”€ Step 3: Resolve โ”€โ”€ + const { txHash: resolveTxHash, isDraw, winnerPkh } = await resolveStep( + provider, wallet, address, utxos3, + depositBTxHash, activeTxIndex, duelId, + playerA_pkh, playerB_pkh, scaledA, scaledB, deadlinePosix, + ); + + console.log(" Waiting for Resolve confirmation..."); + await waitForTx(provider, resolveTxHash); + console.log(" Resolve confirmed!\n"); + + // โ”€โ”€ Summary โ”€โ”€ + console.log("โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—"); + console.log("โ•‘ DUEL COMPLETE โ•‘"); + console.log("โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ"); + console.log(`โ•‘ Duel ID: ${duelId.substring(0, 40)}...`); + console.log(`โ•‘ DepositA: ${depositATxHash.substring(0, 40)}...`); + console.log(`โ•‘ DepositB: ${depositBTxHash.substring(0, 40)}...`); + console.log(`โ•‘ Resolve: ${resolveTxHash.substring(0, 40)}...`); + console.log(`โ•‘ Result: ${isDraw ? "DRAW" : "WINNER"}`); + if (!isDraw) { + console.log(`โ•‘ Winner: ${winnerPkh === playerA_pkh ? "Player A" : "Player B"}`); + } + console.log("โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•"); +} + +main().catch((err) => { + console.error("\nError:", err); + process.exit(1); +}); diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/transactions/tx.tsx b/lazer/cardano/lafhis/pyth-coin-stable-front/src/transactions/tx.tsx new file mode 100644 index 00000000..1852664b --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/transactions/tx.tsx @@ -0,0 +1,519 @@ +/** + * tx.tsx โ€“ client-side Cardano transaction builders. + * + * depositA: Player A creates a duel (partial sign โ†’ backend co-signs + submits) + * depositB: Player B joins a duel (partial sign โ†’ backend co-signs + submits) + * + * Both require backend co-signature because the NFT mint policy checks backend_pkh. + * + * Resolve is fully backend-side (see /api/onchain/resolve.ts). + */ + +import { + MeshTxBuilder, + applyParamsToScript, + mConStr0, + mConStr1, + resolvePaymentKeyHash, + resolveScriptHash, + resolveSlotNo, + serializePlutusScript, +} from "@meshsdk/core"; +import { bech32 } from "bech32"; + +// โ”€โ”€โ”€ Types โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +type TxInputRef = { txHash: string; outputIndex: number }; + +type UtxoLike = { + input: TxInputRef; + output: { amount: Array<{ unit: string; quantity: string }> }; +}; + +type ProviderLike = { + fetchTxInfo?: (txHash: string) => Promise; +}; + +type WalletLike = { + signTx: (unsignedTx: string, partialSign?: boolean) => Promise; + submitTx: (signedTx: string) => Promise; +}; + +type PlutusValidator = { title: string; compiledCode: string }; +type PlutusJson = { validators: PlutusValidator[] }; + +// โ”€โ”€โ”€ Exported param / result types โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +export type DepositAParams = { + provider: ProviderLike; + wallet: WalletLike; + utxos: UtxoLike[]; + playerOneAddress: string; + playerPkh?: string; + backendPkh: string; + pythPolicyId: string; + plutus: PlutusJson; + feedA?: number; + bet_lovelace: number; + network?: "preprod" | "preview" | "mainnet"; + networkId?: 0 | 1; +}; + +export type DepositAResult = { + partiallySignedTx: string; + duelId: string; + scriptAddress: string; + spendScriptHash: string; + mintPolicyId: string; +}; + +export type DepositBParams = { + provider: ProviderLike; + wallet: WalletLike; + utxos: UtxoLike[]; + playerTwoAddress: string; + playerTwoPkh?: string; + playerOnePkh: string; + depositATxHash: string; + depositATxIndex: number; + duelId: string; + backendPkh: string; + pythPolicyId: string; + blockfrostId: string; + signedUpdateHex: string; // from /api/onchain/pyth-lazer-prices + startPriceA: number; // raw Lazer price integer for feed A + startPriceB: number; // raw Lazer price integer for feed B + plutus: PlutusJson; + feedA: number; + feedB: number; + bet_lovelace: number; + duelDuration: number; + network?: "preprod" | "preview" | "mainnet"; + networkId?: 0 | 1; +}; + +export type DepositBResult = { + partiallySignedTx: string; + deadlinePosix: number; + startPriceA: number; + startPriceB: number; + scriptAddress: string; + spendScriptHash: string; + mintPolicyId: string; +}; + +// โ”€โ”€โ”€ CBOR / script helpers โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +// Encode a hex string as a single CBOR byte-string (used for applyParamsToScript only). +const cborBytesParam = (hex: string) => { + const len = hex.length / 2; + if (len < 24) return (0x40 | len).toString(16).padStart(2, "0") + hex; + if (len < 256) return "58" + len.toString(16).padStart(2, "0") + hex; + return ( + "59" + + (len >> 8).toString(16).padStart(2, "0") + + (len & 0xff).toString(16).padStart(2, "0") + + hex + ); +}; + +// โ”€โ”€โ”€ Plutus data helpers โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +const someD = (inner: unknown) => mConStr0([inner as never]); +const noneD = () => mConStr1([]); + +const playerD = ({ + pkh, + feedId, + startPrice, +}: { + pkh: string; + feedId: number; + startPrice: number | null; +}) => mConStr0([pkh, feedId, startPrice != null ? someD(startPrice) : noneD()]); + +const duelDatumD = ({ + duelId, + playerA, + playerB, + betLovelace, + statusIdx = 0, + deadline = null, +}: { + duelId: string; + playerA: { pkh: string; feedId: number; startPrice: number | null }; + playerB?: { pkh: string; feedId: number; startPrice: number | null } | null; + betLovelace: number; + statusIdx?: number; + deadline?: number | null; +}) => + mConStr0([ + duelId, + playerD(playerA), + playerB ? someD(playerD(playerB)) : noneD(), + betLovelace, + statusIdx === 0 ? mConStr0([]) : mConStr1([]), + deadline != null ? someD(deadline) : noneD(), + ]); + +const outputRefD = (txHash: string, index: number) => mConStr0([txHash, index]); + +// โ”€โ”€โ”€ Utility โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +function hexToBytes(hex: string): Uint8Array { + const bytes = new Uint8Array(hex.length / 2); + for (let i = 0; i < hex.length; i += 2) { + bytes[i / 2] = Number.parseInt(hex.slice(i, i + 2), 16); + } + return bytes; +} + +function bytesToHex(bytes: Uint8Array): string { + return Array.from(bytes) + .map((b) => b.toString(16).padStart(2, "0")) + .join(""); +} + +function u64beBytes(value: number): Uint8Array { + const view = new DataView(new ArrayBuffer(8)); + view.setBigUint64(0, BigInt(value)); + return new Uint8Array(view.buffer); +} + +async function sha256Hex(bytes: Uint8Array): Promise { + const buf = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer; + const digest = await crypto.subtle.digest("SHA-256", buf); + return bytesToHex(new Uint8Array(digest)); +} + +async function computeDuelId(txHash: string, outputIndex: number): Promise { + const txHashBytes = hexToBytes(txHash); + const indexBytes = u64beBytes(outputIndex); + const combined = new Uint8Array(txHashBytes.length + indexBytes.length); + combined.set(txHashBytes, 0); + combined.set(indexBytes, txHashBytes.length); + return sha256Hex(combined); +} + +function getCompiledCode(plutus: PlutusJson, title: string): string { + const code = plutus.validators.find((v) => v.title === title)?.compiledCode; + if (!code) throw new Error(`Missing compiled code for: ${title}`); + return code; +} + +function deriveBetScripts({ + backendPkh, + pythPolicyId, + plutus, + networkId, +}: { + backendPkh: string; + pythPolicyId: string; + plutus: PlutusJson; + networkId: 0 | 1; +}) { + const mintScriptCbor = applyParamsToScript( + getCompiledCode(plutus, "nft.nft_policy.mint"), + [cborBytesParam(backendPkh)], + "CBOR", + ); + const mintPolicyId = resolveScriptHash(mintScriptCbor, "V3"); + + const spendScriptCbor = applyParamsToScript( + getCompiledCode(plutus, "validators.bet.spend"), + [ + cborBytesParam(backendPkh), + cborBytesParam(mintPolicyId), + cborBytesParam(pythPolicyId), + ], + "CBOR", + ); + const spendScriptHash = resolveScriptHash(spendScriptCbor, "V3"); + const scriptAddress = serializePlutusScript( + { code: spendScriptCbor, version: "V3" }, + undefined, + networkId, + false, + ).address; + + return { mintScriptCbor, mintPolicyId, spendScriptCbor, spendScriptHash, scriptAddress }; +} + +// Find a collateral UTxO that contains only lovelace (Cardano requirement). +function findPureAdaUtxo(utxos: UtxoLike[]): TxInputRef { + const found = utxos.find( + (u) => + u.output.amount.length === 1 && u.output.amount[0]?.unit === "lovelace", + ); + if (!found) + throw new Error( + "No pure-ADA UTxO for collateral. Send a small ADA-only UTxO to your wallet.", + ); + return found.input; +} + +function scriptHashToRewardAddress(hash: string, networkId = 0): string { + const header = networkId === 0 ? 0xf0 : 0xf1; + const bytes = new Uint8Array(1 + hash.length / 2); + bytes[0] = header; + bytes.set(hexToBytes(hash), 1); + return bech32.encode( + networkId === 0 ? "stake_test" : "stake", + bech32.toWords(bytes), + 200, + ); +} + +function utf8ToHex(value: string): string { + return Array.from(new TextEncoder().encode(value)) + .map((b) => b.toString(16).padStart(2, "0")) + .join(""); +} + +function getBlockfrostBaseUrl(network: "preprod" | "preview" | "mainnet"): string { + if (network === "mainnet") return "https://cardano-mainnet.blockfrost.io/api/v0"; + if (network === "preview") return "https://cardano-preview.blockfrost.io/api/v0"; + return "https://cardano-preprod.blockfrost.io/api/v0"; +} + +async function resolvePythState({ + blockfrostId, + pythPolicyId, + network, +}: { + blockfrostId: string; + pythPolicyId: string; + network: "preprod" | "preview" | "mainnet"; +}) { + const base = getBlockfrostBaseUrl(network); + const headers = { project_id: blockfrostId }; + const unit = pythPolicyId + utf8ToHex("Pyth State"); + + const addrRes = await fetch(`${base}/assets/${unit}/addresses`, { headers }); + if (!addrRes.ok) throw new Error(`Pyth state lookup failed: ${await addrRes.text()}`); + const addresses = (await addrRes.json()) as Array<{ address: string }>; + if (!addresses[0]?.address) throw new Error("Pyth state address not found"); + + const utxoRes = await fetch( + `${base}/addresses/${addresses[0].address}/utxos/${unit}`, + { headers }, + ); + if (!utxoRes.ok) throw new Error(`Pyth UTxO lookup failed: ${await utxoRes.text()}`); + const utxos = (await utxoRes.json()) as Array<{ + tx_hash: string; + output_index: number; + data_hash?: string; + }>; + const stateUtxo = utxos[0]; + if (!stateUtxo) throw new Error("Pyth state UTxO not found"); + + let datum: unknown; + if (stateUtxo.data_hash) { + const r = await fetch(`${base}/scripts/datum/${stateUtxo.data_hash}`, { headers }); + if (r.ok) datum = ((await r.json()) as { json_value?: unknown }).json_value; + } + if (!datum) { + const r = await fetch(`${base}/txs/${stateUtxo.tx_hash}/utxos`, { headers }); + if (!r.ok) throw new Error(`Pyth tx lookup failed: ${await r.text()}`); + const payload = (await r.json()) as { + outputs?: Array<{ output_index: number; inline_datum?: unknown }>; + }; + datum = payload.outputs?.find((o) => o.output_index === stateUtxo.output_index)?.inline_datum; + } + if (!datum || typeof datum !== "object") throw new Error("Pyth datum not found"); + + const fields = ( + datum as { + fields?: Array<{ bytes?: string }>; + constructor?: { fields?: Array<{ bytes?: string }> }; + } + ).fields ?? (datum as { constructor?: { fields?: Array<{ bytes?: string }> } }).constructor?.fields; + + if (!fields || fields.length < 4 || !fields[3]?.bytes) { + throw new Error("Unexpected Pyth datum shape"); + } + + const withdrawScriptHash = fields[3].bytes; + const scriptRes = await fetch(`${base}/scripts/${withdrawScriptHash}/cbor`, { headers }); + if (!scriptRes.ok) throw new Error(`Pyth script CBOR lookup failed: ${await scriptRes.text()}`); + const scriptPayload = (await scriptRes.json()) as { cbor?: string }; + if (!scriptPayload.cbor) throw new Error("Missing Pyth script CBOR"); + + return { + txHash: stateUtxo.tx_hash, + txIndex: stateUtxo.output_index, + withdrawScriptHash, + scriptSize: scriptPayload.cbor.length / 2, + }; +} + +// โ”€โ”€โ”€ depositA โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +export async function depositA({ + provider, + wallet, + utxos, + playerOneAddress, + playerPkh, + backendPkh, + pythPolicyId, + plutus, + feedA = 16, + bet_lovelace, + network = "preprod", + networkId = 0, +}: DepositAParams): Promise { + if (!utxos.length) throw new Error("No UTxOs available in wallet"); + if (!Number.isFinite(bet_lovelace) || bet_lovelace <= 0) + throw new Error("bet_lovelace must be a positive number"); + + const playerOnePkh = + playerPkh?.trim() || resolvePaymentKeyHash(playerOneAddress); + + const { mintScriptCbor, mintPolicyId, spendScriptHash, scriptAddress } = + deriveBetScripts({ backendPkh, pythPolicyId, plutus, networkId }); + + const seed = utxos[0].input; + const collateral = findPureAdaUtxo(utxos); + const duelId = await computeDuelId(seed.txHash, seed.outputIndex); + + const datum = duelDatumD({ + duelId, + playerA: { pkh: playerOnePkh, feedId: feedA, startPrice: null }, + betLovelace: bet_lovelace, + }); + + const mintRedeemer = mConStr0([outputRefD(seed.txHash, seed.outputIndex)]); + const nowSlot = resolveSlotNo(network, Date.now()); + + let tx = new MeshTxBuilder({ fetcher: provider as never, submitter: provider as never }); + tx = tx.invalidBefore(Number(nowSlot) - 600); + tx = tx.invalidHereafter(Number(nowSlot) + 600); + tx = tx.txInCollateral(collateral.txHash, collateral.outputIndex); + tx = tx.txIn(seed.txHash, seed.outputIndex); + tx = tx.mintPlutusScriptV3(); + tx = tx.mint("1", mintPolicyId, duelId); + tx = tx.mintingScript(mintScriptCbor); + tx = tx.mintRedeemerValue(mintRedeemer); + tx = tx.requiredSignerHash(backendPkh); + tx = tx.txOut(scriptAddress, [ + { unit: "lovelace", quantity: String(bet_lovelace) }, + { unit: mintPolicyId + duelId, quantity: "1" }, + ]); + tx = tx.txOutInlineDatumValue(datum); + tx = tx.changeAddress(playerOneAddress); + tx = tx.selectUtxosFrom(utxos as never); + + console.log("[depositA] building tx..."); + const unsigned = await tx.complete(); + console.log("[depositA] requesting wallet partial signature..."); + const partiallySignedTx = await wallet.signTx(unsigned, true); + console.log("[depositA] partial signature ok"); + + return { partiallySignedTx, duelId, scriptAddress, spendScriptHash, mintPolicyId }; +} + +// โ”€โ”€โ”€ depositB โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +export async function depositB({ + provider, + wallet, + utxos, + playerTwoAddress, + playerTwoPkh, + playerOnePkh, + depositATxHash, + depositATxIndex, + duelId, + backendPkh, + pythPolicyId, + blockfrostId, + signedUpdateHex, + startPriceA, + startPriceB, + plutus, + feedA, + feedB, + bet_lovelace, + duelDuration, + network = "preprod", + networkId = 0, +}: DepositBParams): Promise { + if (!utxos.length) throw new Error("No UTxOs available in wallet"); + + const playerB_pkh = playerTwoPkh?.trim() || resolvePaymentKeyHash(playerTwoAddress); + + const { mintPolicyId, spendScriptCbor, spendScriptHash, scriptAddress } = + deriveBetScripts({ backendPkh, pythPolicyId, plutus, networkId }); + + const pythState = await resolvePythState({ blockfrostId, pythPolicyId, network }); + const pythRewardAddress = scriptHashToRewardAddress(pythState.withdrawScriptHash, networkId); + + const deadlinePosix = Date.now() + duelDuration; + const totalPot = bet_lovelace * 2; + + const newDatum = duelDatumD({ + duelId, + playerA: { pkh: playerOnePkh, feedId: feedA, startPrice: startPriceA }, + playerB: { pkh: playerB_pkh, feedId: feedB, startPrice: startPriceB }, + betLovelace: bet_lovelace, + statusIdx: 1, + deadline: deadlinePosix, + }); + + const joinRedeemer = mConStr0([playerB_pkh, feedB]); + const collateral = findPureAdaUtxo(utxos); + const nowSlot = resolveSlotNo(network, Date.now()); + + const tx = new MeshTxBuilder({ fetcher: provider as never, submitter: provider as never }); + + tx + .invalidBefore(Number(nowSlot) - 600) + .invalidHereafter(Number(nowSlot) + 600) + .txInCollateral(collateral.txHash, collateral.outputIndex) + .requiredSignerHash(backendPkh) + + // Pyth zero-withdrawal: redeemer is a plain JS array โ†’ MeshJS handles chunking + .withdrawalPlutusScriptV3() + .withdrawal(pythRewardAddress, "0") + .withdrawalTxInReference( + pythState.txHash, + pythState.txIndex, + String(pythState.scriptSize), + pythState.withdrawScriptHash, + ) + .withdrawalRedeemerValue([signedUpdateHex]) + + // Spend the DepositA UTxO (Waiting โ†’ Active) + .spendingPlutusScriptV3() + .txIn(depositATxHash, depositATxIndex) + .txInInlineDatumPresent() + .txInRedeemerValue(joinRedeemer) + .txInScript(spendScriptCbor) + + // Output: 2ร— bet + NFT at script with Active datum + .txOut(scriptAddress, [ + { unit: "lovelace", quantity: String(totalPot) }, + { unit: mintPolicyId + duelId, quantity: "1" }, + ]) + .txOutInlineDatumValue(newDatum) + + .changeAddress(playerTwoAddress) + .selectUtxosFrom(utxos as never); + + console.log("[depositB] building tx..."); + const unsigned = await tx.complete(); + console.log("[depositB] requesting wallet partial signature..."); + const partiallySignedTx = await wallet.signTx(unsigned, true); + console.log("[depositB] partial signature ok"); + + return { + partiallySignedTx, + deadlinePosix, + startPriceA, + startPriceB, + scriptAddress, + spendScriptHash, + mintPolicyId, + }; +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/src/types/game.ts b/lazer/cardano/lafhis/pyth-coin-stable-front/src/types/game.ts new file mode 100644 index 00000000..823a3558 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/src/types/game.ts @@ -0,0 +1,35 @@ +export type GameDuration = "1m" | "5m" | "1h"; +export type GameRate = "ADA/USD" | "BTC/USD" | "ETH/USD" | "BNB/USD"; +export type GameStatus = "waiting_for_player" | "ready"; + +export type GameConfig = { + rate: GameRate; + betAda: number; + duration: GameDuration; +}; + +export type GameSession = { + id: string; + createdAt: string; + updatedAt: string; + status: GameStatus; + config: GameConfig; + playerOneWallet: string; + playerTwoWallet: string | null; + playerTwoRate: GameRate | null; + onchain: { + duelId: string | null; + depositATxHash: string | null; + depositATxIndex: number | null; + depositBTxHash: string | null; + playerOnePkh: string | null; + playerTwoPkh: string | null; + playerOneFeedId: number | null; + playerTwoFeedId: number | null; + playerOnePriceFeedId: string | null; + playerTwoPriceFeedId: string | null; + startPriceA: number | null; + startPriceB: number | null; + deadlinePosix: number | null; + }; +}; diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/tailwind.config.ts b/lazer/cardano/lafhis/pyth-coin-stable-front/tailwind.config.ts new file mode 100644 index 00000000..109807be --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/tailwind.config.ts @@ -0,0 +1,18 @@ +import type { Config } from "tailwindcss"; + +export default { + content: [ + "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", + "./src/components/**/*.{js,ts,jsx,tsx,mdx}", + "./src/app/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: { + colors: { + background: "var(--background)", + foreground: "var(--foreground)", + }, + }, + }, + plugins: [], +} satisfies Config; diff --git a/lazer/cardano/lafhis/pyth-coin-stable-front/tsconfig.json b/lazer/cardano/lafhis/pyth-coin-stable-front/tsconfig.json new file mode 100644 index 00000000..4334725b --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-front/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "paths": { + "@/*": [ + "./src/*" + ] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable-validators/.github/workflows/continuous-integration.yml b/lazer/cardano/lafhis/pyth-coin-stable-validators/.github/workflows/continuous-integration.yml new file mode 100644 index 00000000..8af80c86 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-validators/.github/workflows/continuous-integration.yml @@ -0,0 +1,18 @@ +name: Continuous Integration + +on: + push: + branches: ["main"] + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: aiken-lang/setup-aiken@v1 + with: + version: v1.1.21 + - run: aiken fmt --check + - run: aiken check -D + - run: aiken build diff --git a/lazer/cardano/lafhis/pyth-coin-stable-validators/.gitignore b/lazer/cardano/lafhis/pyth-coin-stable-validators/.gitignore new file mode 100644 index 00000000..ff7811b1 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-validators/.gitignore @@ -0,0 +1,6 @@ +# Aiken compilation artifacts +artifacts/ +# Aiken's project working directory +build/ +# Aiken's default documentation export +docs/ diff --git a/lazer/cardano/lafhis/pyth-coin-stable-validators/README.md b/lazer/cardano/lafhis/pyth-coin-stable-validators/README.md new file mode 100644 index 00000000..44f46113 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-validators/README.md @@ -0,0 +1,65 @@ +# pyth_coin_stable + +Write validators in the `validators` folder, and supporting functions in the `lib` folder using `.ak` as a file extension. + +```aiken +validator my_first_validator { + spend(_datum: Option, _redeemer: Data, _output_reference: Data, _context: Data) { + True + } +} +``` + +## Building + +```sh +aiken build +``` + +## Configuring + +**aiken.toml** +```toml +[config.default] +network_id = 41 +``` + +Or, alternatively, write conditional environment modules under `env`. + +## Testing + +You can write tests in any module using the `test` keyword. For example: + +```aiken +use config + +test foo() { + config.network_id + 1 == 42 +} +``` + +To run all tests, simply do: + +```sh +aiken check +``` + +To run only tests matching the string `foo`, do: + +```sh +aiken check -m foo +``` + +## Documentation + +If you're writing a library, you might want to generate an HTML documentation for it. + +Use: + +```sh +aiken docs +``` + +## Resources + +Find more on the [Aiken's user manual](https://aiken-lang.org). diff --git a/lazer/cardano/lafhis/pyth-coin-stable-validators/aiken.lock b/lazer/cardano/lafhis/pyth-coin-stable-validators/aiken.lock new file mode 100644 index 00000000..a28e1619 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-validators/aiken.lock @@ -0,0 +1,27 @@ +# This file was generated by Aiken +# You typically do not need to edit this file + +[[requirements]] +name = "aiken-lang/stdlib" +version = "v3.0.0" +source = "github" + +[[requirements]] +name = "pyth-network/pyth-lazer-cardano" +version = "main" +source = "github" + +[[packages]] +name = "aiken-lang/stdlib" +version = "v3.0.0" +requirements = [] +source = "github" + +[[packages]] +name = "pyth-network/pyth-lazer-cardano" +version = "main" +requirements = [] +source = "github" + +[etags] +"pyth-network/pyth-lazer-cardano@main" = [{ secs_since_epoch = 1774200520, nanos_since_epoch = 180493000 }, "a46dacd97a22eb07feeaf966d48c3116c8249ddc836705656e3135cea285bcfc"] diff --git a/lazer/cardano/lafhis/pyth-coin-stable-validators/aiken.toml b/lazer/cardano/lafhis/pyth-coin-stable-validators/aiken.toml new file mode 100644 index 00000000..c17bb412 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-validators/aiken.toml @@ -0,0 +1,23 @@ +name = "matiwaisman/pyth_coin_stable" +version = "0.0.0" +compiler = "v1.1.21" +plutus = "v3" +license = "Apache-2.0" +description = "Aiken contracts for project 'matiwaisman/pyth_coin_stable'" + +[repository] +user = "matiwaisman" +project = "pyth_coin_stable" +platform = "github" + +[[dependencies]] +name = "aiken-lang/stdlib" +version = "v3.0.0" +source = "github" + +[[dependencies]] +name = "pyth-network/pyth-lazer-cardano" +version = "main" +source = "github" + +[config] diff --git a/lazer/cardano/lafhis/pyth-coin-stable-validators/plutus.json b/lazer/cardano/lafhis/pyth-coin-stable-validators/plutus.json new file mode 100644 index 00000000..ffd8872f --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-validators/plutus.json @@ -0,0 +1,340 @@ +{ + "preamble": { + "title": "matiwaisman/pyth_coin_stable", + "description": "Aiken contracts for project 'matiwaisman/pyth_coin_stable'", + "version": "0.0.0", + "plutusVersion": "v3", + "compiler": { + "name": "Aiken", + "version": "v1.1.21+42babe5" + }, + "license": "Apache-2.0" + }, + "validators": [ + { + "title": "nft.nft_policy.mint", + "redeemer": { + "title": "redeemer", + "schema": { + "$ref": "#/definitions/nft~1NftRedeemer" + } + }, + "parameters": [ + { + "title": "backend_pkh", + "schema": { + "$ref": "#/definitions/aiken~1crypto~1VerificationKeyHash" + } + } + ], + "compiledCode": "590273010100229800aba2aba1aba0aab9faab9eaab9dab9a9bae0024888888896600264653001300900198049805000cdc3a400130090024888966002600460126ea800e2646644b300130050018992cc004c048006264b30013007300e375400313232332259800980b801c0222c80a0dd6980a0009bae30140023014001300f3754003164034602200316403c601a6ea801e2b30013370e9001000c566002601a6ea801e00516403916402c80584cc8966002600a60186ea801e26464b300132330010013758602660206ea801c896600200314a115980099baf301430113754602800200914a31330020023015001403c80922b3001332259800800c00a2b300130150018992cc004cdc79bae3011001004899b87375a60240029001452820203014001801202440482940cc00cdd5980218079baa006005899198008009bac3013301430143014301430143014301430143010375400e44b30010018a508acc004cdc79bae301400100e8a51899801001180a800a01e404914a0806a294100d191b92337146eb8c048006600294690084dd698091809800af24601c6ea8004c040c034dd5003c4c8cc004004c8cc004004cc00cdd5980218079baa0060052259800800c52f5c113301230103013001330020023014001404444b30010018a518acc004cdc39bad301200148006266004004602600314a0806901020162300f3010301030103010001223232330010010042259800800c00e2646644b30013372200e00515980099b8f0070028800c01901144cc014014c05c0110111bae3010001375660220026026002808852f5bded8c060146ea8014dd7180698051baa0038a504020300900130043754013149a26cac8011", + "hash": "86012e333b43f036681ef064a5b8dd5dd22f1725fff33db57648aee6" + }, + { + "title": "nft.nft_policy.else", + "redeemer": { + "schema": {} + }, + "parameters": [ + { + "title": "backend_pkh", + "schema": { + "$ref": "#/definitions/aiken~1crypto~1VerificationKeyHash" + } + } + ], + "compiledCode": "590273010100229800aba2aba1aba0aab9faab9eaab9dab9a9bae0024888888896600264653001300900198049805000cdc3a400130090024888966002600460126ea800e2646644b300130050018992cc004c048006264b30013007300e375400313232332259800980b801c0222c80a0dd6980a0009bae30140023014001300f3754003164034602200316403c601a6ea801e2b30013370e9001000c566002601a6ea801e00516403916402c80584cc8966002600a60186ea801e26464b300132330010013758602660206ea801c896600200314a115980099baf301430113754602800200914a31330020023015001403c80922b3001332259800800c00a2b300130150018992cc004cdc79bae3011001004899b87375a60240029001452820203014001801202440482940cc00cdd5980218079baa006005899198008009bac3013301430143014301430143014301430143010375400e44b30010018a508acc004cdc79bae301400100e8a51899801001180a800a01e404914a0806a294100d191b92337146eb8c048006600294690084dd698091809800af24601c6ea8004c040c034dd5003c4c8cc004004c8cc004004cc00cdd5980218079baa0060052259800800c52f5c113301230103013001330020023014001404444b30010018a518acc004cdc39bad301200148006266004004602600314a0806901020162300f3010301030103010001223232330010010042259800800c00e2646644b30013372200e00515980099b8f0070028800c01901144cc014014c05c0110111bae3010001375660220026026002808852f5bded8c060146ea8014dd7180698051baa0038a504020300900130043754013149a26cac8011", + "hash": "86012e333b43f036681ef064a5b8dd5dd22f1725fff33db57648aee6" + }, + { + "title": "validators.bet.spend", + "datum": { + "title": "datum", + "schema": { + "$ref": "#/definitions/validators~1DuelDatum" + } + }, + "redeemer": { + "title": "redeemer", + "schema": { + "$ref": "#/definitions/validators~1DuelRedeemer" + } + }, + "parameters": [ + { + "title": "backend_pkh", + "schema": { + "$ref": "#/definitions/aiken~1crypto~1VerificationKeyHash" + } + }, + { + "title": "nft_policy_id", + "schema": { + "$ref": "#/definitions/cardano~1assets~1PolicyId" + } + }, + { + "title": "pyth_id", + "schema": { + "$ref": "#/definitions/cardano~1assets~1PolicyId" + } + } + ], + "compiledCode": "59207901010022229800aba4aba2aba1aba0aab9faab9eaab9dab9a9bae0049bae0039bae0024888888888896600264653001300b00198059806000cdc3a4005300b0024888966002600460166ea800e33001300c3754007370e90004dc3a4009300b375400891111991192cc004c018012264646644b3001301b003802c590181bad3018001375c6030004603000260266ea802e2b30013009004899192cc004c06400a0071640586eb4c05c004c04cdd5005c566002600a00915980098099baa00b800c59014459011202240442b300130083011375400314a119800980a98091baa001911919800800801912cc00400629422b3001300330190018a51899801001180d000a028405d23016301700191119199119801001000912cc00400600713233225980099b910070028acc004cdc78038014400600c80ca26600a00a603e00880c8dd7180c0009bad3019001301b001406464646600200200c44b3001001801c4c8cc896600266e4402400a2b30013371e0120051001803203489980280298100022034375c60320026eacc068004c07000501a0a5eb7bdb180520009180b180b980b980b980b800a44444b300159800998021bac301a301737540184b30013375e603660306ea80040222601d30013756600860306ea8c010c060dd5000c0526eb8c06cc060dd500320068a5040591300a98009bab3001301737540190139bae301a3017375400a8012294101546600253001001a44100a44100400d374a9000488c8cc004004dd6180e980f180f180f180f180f180f180f180f180d1baa0032259800800c528456600266e3cdd7180f000801c528c4cc008008c07c00501920389180d980e180e000c8c06cc070c070c070006602c6ea803e6e25200491192cc004cdc7a44100375c603a603c0031301d0018b20303002001911919800800801911980180098010014dc024003375e98103d87a80009180d980e180e180e180e180e000cdc4a4001370290002444444444444453001223375e6054604e6ea8c0a8c09cdd50011807998149ba90014bd70489660026034604c6ea800a2646464b3001302e002899192cc004c07c0062b3001302c37540050068b205a8acc004c08800626464b3001303200280445902f1bad3030001302c3754005159800980f000c56600260586ea800a00d1640b51640a8815102a18151baa001302d0038b205632598009815000c566002601a605200316898101814800a0508b2056375460580026058002604e6ea800a2c812a444b30013371000290004520008acc004c06c0062900144c966002603866e1800920048cc0040126002007337060049002200889800cc004012600200733706601200490022008409c6e08009026204c911919800800801912cc004006298103d87a80008992cc006600260120034a14a281422003133003003302e00240a06006605800281524601c660506ea0004cc0a13010101004bd70244444664464b3001302001189919912cc004cdd7980d18181baa01e4c103d87980008acc006600266e3c008dd7181998181baa301c3030375403d4a14a281722b3001300f30163030375403d1598009980b812816c56600330013370e0026eb4c070c0c0dd5180e18181baa01ea50a5140b9132332259800981318191baa0028992cc004c09cc0ccdd5000c660026eb4c0dcc0d0dd5001cdd6981b981a1baa00199199119198008009bac301e3038375405a44b30010018a6103d87a80008992cc006600260320034a14a281c22003133003003303e00240e06464b3001302d303a3754003132598009817981d9baa00189919191919194c004c1140066eb8c11401a608a009375a608a007304500248888966002609600d133012304a00a1332259800981e000c4c966002609c003133015304d0010038b20963049375400b159800981f800c56600260926ea801600516412916411c82384cc8966002607800315980098249baa00380145904a4566002607e00315980098249baa00380145904a4566002607600315980098249baa00380145904a459047208e411c26602600a2b30013371e6eb8c128c11cdd5006008c566002607b300137566066608e6ea803a08701140c91302f33049374e66092018660926ea0c0c0dd5981998239baa00e4bd7025eb822980103d87a8000411514c103d87a80004114608c6ea8004c118dd5001c590480c114004c110004c10c004c108004c104004c0f0dd5000c5903a181f181d9baa0018a6103d87a800040e4604060746ea8004c0f000503a112cc004c0a8c0d8dd500144c8ca60026eb4c0f0006607a003375c60780049112cc004c10000a266010607e00400d1640f4303c001303737540051640d46eb8c0e0c0d4dd501191192cc004c0a800626464b3001303d00280245903a1bad303b001303737540071598009816800c566002606e6ea800e0051640e11640d481a8c0d4dd50012444b3001302d3036375400314a1132325980099b87375a6078607a00466e08dd6980f181c9baa027480122b3001301830233039375400315980099baf301f30393754604a60726ea8004c084cc0ecdd4002a5eb822646644b3001302f303b3754005132598009818181e1baa001899912cc004cdc42400000515980099b8f375c6084607e6ea80040462b30013370e6eb4c0acc0fcdd500080844cdd79812981f9baa001302733041375001497ae08a5040f514a081ea294103d1bad3040303d37540066080607a6ea800600481d8c0fcc10000e00281d0c0f40045281981d980b981c9baa0013303b301f3039375400297ae08a5040dd14a081ba2941037181d8009bac303a3037375400281a900240c8606c606e00700140c460680022940cc0ca60020570259bad301c30303754603860606ea8079004198194c0040ae04b001401097ae08a5040b914a08172294102e4528205c8a5040b86eb8c0c4004dd69818981900098169baa0258992cc004c09004a2b3001300d3018302e37540391598009980a811815c56600264b30013025302e375400314a11337126eb4c0c8c0bcdd50009bad3032302f375404e8168c030c0b8dd500e44c966002604a605c6ea80062942264646644b300130263032375400513232598009814181a1baa001899192cc004c0a8c0d8dd5000c4c9660026056606e6ea8006265300133001375a607860726ea8020dd6981e181c9baa003998009bad303c3039375400a6eb4c0f0c0e4dd50014cdc11bad301e3039375404e90022444b30013371064b3001301a0018800c4c06400503b19b810030024828270062b3001330293758604460786ea80c4966002660300026eb8c100c0f4dd51814981e9baa02b8980818131bab3029303d375400314a081da2660526eb0c088c0f0dd501892cc004cc060004dd71820181e9baa00e8980818131bab3029303d375400314a081da294103a44c8cc0a8dd61811981e9baa0322598009980c80080144cdc480198139bab302a303e375400314a081e16600266e2000800e26eb8c0fcc0f0dd51814181e1baa02a89bae303f303c375401a81d103a088cdc199b8233702002004904044bd0014019036181d181d8014015035181c800981c801400d033181b800981b801c005031181a0008a5033032301630303754603860606ea8078cc0c8c058c0c0dd5000998194c0040ae04b375a603860606ea8c070c0c0dd500f2008330329800815c0966eb4c070c0c0dd5000a0084bd70181918179baa00140b46028605c6ea8072294102c452820588a5040b115980099baf3018302e3754038980103d87980008acc004c034c050c0b8dd500e4566002b300133015023375c6062605c6ea8c068c0b8dd500e4528c4cc05408c0ad02c4566002660366eb0c050c0b8dd501192cc004cc028004dd7181918179baa301b302f375403b13002301837566036605e6ea8006294102d44cdc3cc004dd5980c18171baa0238154dd7181898171baa01c40649000c52820588a5040b114a08162294102c205837126eb4c048c0b4dd500da056222330073259800981198179baa0018992cc004c090c0c0dd5000c4c8cc04c0048966002005132330010010042259800800c52f5c113303898009b8c480126e0120039b89480226e3120009b8c480226e0120074888888cc88cc0808c8d6600266e3cdd71821800a4410475d3c793008cc004888c8cc00cdd698238009bae3047304800130030019b89480426e3120109b804803e600e90082444446600a464660926ea0cde5250375c6094002660926094609600297ae05980098029b8d0018998241ba930020013304837526600860066e340040052f5c11641104646600e4660946ea0cdc7000a4000660946ea4cc008c0a0dc6800800a5eb808cc0208cc12cdd419b8e00148000cc12cdd49980198149b8d0010014bd7011191919827181a198271ba80073304e375000a6609c609e00297ae03304e304f30500014bd7018008012cc004c09c00a2653001001a5eb820068008889660026080003123233051374e002660a26ea40092f5c065300100180252f5c080088896600200510018cc00400e60aa005330533054002001400c8292246530010059982898290008024c0bc00e6eb8c148c14c0050054c004c8cc144dd419bca4a06eb8c148004cc144c148c14c0052f5c0b30013016371a00313305037526022002660a06ea4cc050c04cdc6800800a5eb822c826244660a4004660a46ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c16400a607c660b060b2010660b098103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a80004bd702002222598008014400633001003982e0014c8c966002609a00313230433305d305e0013305d30433305d305e305b375400697ae0305f305f001305a37540071598009828000c4c8c8c110cc178c17c008cc178c17c004cc178c110cc178c17cc170dd500225eb80c180c180004c17c004c168dd5001c5660026098003132323230453305f30600033305f30600023305f30600013305f30453305f3060305d375400a97ae0306130610013060001305f001305a37540071598009805000c4c8c8c8c8c118cc180c184010cc180c18400ccc180c184008cc180c184004cc180c118cc180c184c178dd500325eb80c188c188004c184004c180004c17c004c168dd5001c5660026012003132323232323047330613062005330613062004330613062003330613062002330613062001330613047330613062305f375400e97ae030633063001306200130610013060001305f001305a375400715980099b874802800626464646464646090660c460c600c660c460c600a660c460c6008660c460c6006660c460c6004660c460c6002660c46090660c460c660c06ea80212f5c060c860c800260c600260c400260c200260c000260be00260b46ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c124cc18cc19001ccc18cc190018cc18cc190014cc18cc190010cc18cc19000ccc18cc190008cc18cc190004cc18cc124cc18cc190c184dd5004a5eb80c194c194004c190004c18c004c188004c184004c180004c17c004c168dd5001c56600266e1d200e00189919191919191919182519832183280419832183280399832183280319832183280299832183280219832183280199832183280119832183280099832182519832183298311baa00a4bd7018331833000983280098320009831800983100098308009830000982f800982d1baa0038acc004cdc3a40200031323232323232323232304b33065306600933065306600833065306600733065306600633065306600533065306600433065306600333065306600233065306600133065304b3306530663063375401697ae0306730670013066001306500130640013063001306200130610013060001305f001305a375400715980099b87480480062646464646464646464646098660cc60ce014660cc60ce012660cc60ce010660cc60ce00e660cc60ce00c660cc60ce00a660cc60ce008660cc60ce006660cc60ce004660cc60ce002660cc6098660cc60ce60c86ea80312f5c060d060d000260ce00260cc00260ca00260c800260c600260c400260c200260c000260be00260b46ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c134cc19cc1a002ccc19cc1a0028cc19cc1a0024cc19cc1a0020cc19cc1a001ccc19cc1a0018cc19cc1a0014cc19cc1a0010cc19cc1a000ccc19cc1a0008cc19cc1a0004cc19cc134cc19cc1a0c194dd5006a5eb80c1a4c1a4004c1a0004c19c004c198004c194004c190004c18c004c188004c184004c180004c17c004c168dd5001c56600266e1d20160018991919191919191919191919182719834183480619834183480599834183480519834183480499834183480419834183480399834183480319834183480299834183480219834183480199834183480119834183480099834182719834183498331baa00e4bd70183518350009834800983400098338009833000983280098320009831800983100098308009830000982f800982d1baa00389919191919191919191919191827198341834806198341834805998341834805198341834804998341834804198341834803998341834803198341834802998341834802198341834801998341834801198341834800998341834983500099834182719834183498331baa00e4bd7025eb80c1a4004c1a0004c19c004c198004c194004c190004c18c004c188004c184004c180004c17c004c168dd5001a0b0416082c105820b0416082c105820b0416082c1058182c1baa001305b002400c82c8dd7182c182c800991acc004c0c800a2653001001a5eb82006800888966002609600312323305c374e002660b86ea40092f5c065300100180252f5c080088896600200510018cc00400e60c00053305e305f002001400c82ea246530010059982e182e8008024c0e800e6eb8c174c1780050051802800a0ac8b20a6375c60b060b2006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241591598009800a408113370490400219801801980a80144cdc124101010100406600600666e00009203f415882b0dc4000c888c8cc16cc00cdd6982e0009982d982e182e800a5eb80c00c006660ae6ea0cdc7000a4000660ae6ea4cc03cc0d4dc6800800a5eb81222323298009198029191982f9ba833794940dd718300009982f98301830800a5eb816600260366e340062660bc6ea4c060004cc178dd49980d180c9b8d0010014bd7045905a1191801acc004c140006298103d87a8000898229982f9ba80014bd7020b630030019bad305d003911191acc006600260a26eb4c18400694294505c44cc02000c8c014c11ccc184dd4000a5eb822601e600898103d87a800041706eb8c184c188004cc17cdd419b8e00148000cc17cdd49980b981e9b8d0010014bd7024446b30013050002898019182319830000a5eb822b3001305300289801919ba548008cc1800052f5c1159800982780144c00c8cdd2a4008660c000297ae08acc004c03400a26600e464660c26ea0cde5250375c60c4002660c260c460c600297ae05980098209b8d0018998301ba9302200133060375266050604e6e340040052f5c1164170466e95200633060375000297ae08acc004c03000a26600e464660c26ea0cde5250375c60c4002660c260c460c600297ae05980098209b8d0018998301ba9302200133060375266050604e6e340040052f5c1164170466e952008330603750b3001337100029040400244006266e04004c0192020417097ae08acc004cdc3a40140051300323374a900519830000a5eb822b30013370e900600144cc0048cdd2a4018660c000297ae0232330613750600c6eb4c188004cc184c188c18c0052f5c064660c26ea0cde5250375c60c4002660c260c460c600297ae059800980e9b8d0018998301ba9301a0013306037526603860366e340040052f5c116417115980099b874803800a266002466e95200e330600014bd70119198309ba833794940dd718310009983098311831800a5eb8166002603a6e340062660c06ea4c068004cc180dd49980e180d9b8d0010014bd7045905c456600266e1d2010002899800919ba548040cc1800052f5c0464660c26ea0cde5250375c60c4002660c260c460c600297ae059800980e9b8d0018998301ba9301a0013306037526603860366e340040052f5c116417115980099b874804800a246464660c466e9520123306230630014bd701983118319832000a5eb80c004008cc0208c8cc188dd419bca4a06eb8c18c004cc188c18cc1900052f5c0b30013042371a00313306137526046002660c26ea4cc0a4c0a0dc6800800a5eb822c82e896600260a400314c103d87980008acc004c154006298103d87a80008acc004c144006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20ba417482e905d20ba8acc004cdc3a40280051300323374a900a19830000a5eb822b30013370e900b00144c00c8cdd2a402c660c000297ae08acc004cdc3a403000513300123374a900c19830000a5eb808c8cc184dd419bca4a06eb8c188004cc184c188c18c0052f5c0b3001301d371a00313306037526034002660c06ea4cc070c06cdc6800800a5eb822c82e22c82d905b20b6416c82d905b20b6416c82d905b20b6416c82d8dd718301830803096600266e2000520808080808080808080028800c4cdc08009801241000282c0c00c00c6eb4c158004c8cc154dd419b8e00148000cc154dd49980698199b8d0010014bd701bae3055305600420968b20903718900122c81f0dd718219822000acc004c01cdc6800c4cc104dd49801000998209ba9330053004371a00200297ae08b207a375c6048607c6ea8cc0808c8d6600266e3cdd71821800a44104b9011a8200891919191919191991198259818998259826003998259ba90013304b304c0024bd70198259826182680125eb80d660026048003125980099b89002371a00313304a37526601e004002660946ea66002005337026e3400400a002b8c25eb822c82322c8228dd7182518258011bae304a004375a609200264660906ea0cde5250375c6092002660906092609400297ae05980098141b8d0018998239ba930090013304737526601e601c6e340040052f5c116410c6eb8c11cc120004d6600294624b30013371290201b8d0018998231ba93300b48100004cc118dd4cc005204099b80371a002901fc0057184bd704590424590411bae30463047001300100259800a51892cc004cdc4a4100026e340062660886ea4cc0252080010013304437533001482000666e00dc6800a40ff0015c612f5c11641011640fd1640f86eb8c10cc11000566002600e6e340062660826ea4c008004cc104dd49980298021b8d0010014bd7045903d1bae3041009300348010c00d200819801001181d000a06e8991801181c8019bae303700240d46eb0c0d0c0c4dd5000c5902f19199119801001000912cc004006298103d87a80008992cc004cdd78021819800c4c070cc0d8c0d00052f5c1133003003303800240c8606c00281a0dd5981a181a981a981a981a981a981a981a981a981a98189baa0043374a90021981919ba548008cc0c8c054c0c0dd5181998181baa0014bd7025eb822c8170c8cc004004dd6180e18181baa0032259800800c530103d87a80008992cc006600260220034a14a281822003133003003303600240c064b3001332259800801452844ca600264b30013029303537540031375a606c60726eacc0e4c0d8dd5000c5200040d06070003375e6070607200337560069112cc0040062b30013002006899802801a400114a081b2264b30013375e607000298010140008acc004cc018010dd6981c981e1bab3039001898019ba6303d0028a5040dd1598009980300224001130030078a5040dc81b8c0ec0050390ca600200337566042606a6ea8c084c0d4dd5002488cc0e4008cc0e4dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0dc0066eacc0e000660780069112cc004cdc8a441000038acc004cdc7a4410000389980298119981e9ba60024bd70000c4cc015300103d87a800000640e519800803c006446600e0046607e66ec0dd48029ba6004001401c81c8607400481c22942294229410391ba633034337606ea4018dd31981a19bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002605060626ea8c0d4c0c8dd5181a98191baa301e3032375400313259800981298191baa0018992cc004c09cc0ccdd5000c4c8c8c8c8cc8966002607c007132598009817181d1baa0018991919194c004dd69821000cdd718210024dd69821001cdd7182100124444b300130470058998121bab304600e225980080144cc09803089660020051302f330490144bd7044c8c8cc07cc1200084c00cc134010dd7182400098250012090899191980e98238010980198258021bae304500130480024119164110304200130410013040001303b37540031640e4607a00d1640ec6eb8c0ec004dd5981d801181d800981d000981c800981a1baa0018b20643036303337540031640c4603060646ea8c078c0c8dd5000c590304530103d87a800040c0606800281908cc020dd6180b18181baa00125980099b87375a606860626ea800400e2646644b3001302730333754005132598009814181a1baa0018992cc004c0a4c0d4dd5000c4c8cc8966002605e60706ea800a2980103d87a8000898109981d9ba832337086eb4c0f4004dd6981e981f000981c9baa332230233303d375066e08dd6981f0011bad303e0013303d375066e08dd6981f181f8011bad303e303f0014bd70181c9baa301000130393754607860726ea80092f5c081b8c8cc8966002b3001302d002899b8900448002294103845300103d87a80008acc004cdc424000009130223303c30223303c37506601e004008660786ea0cc03c0040112f5c097ae08acc004cdc400224001130223303c30223303c37506601e002602c008660786ea0cc03c008c0580112f5c097ae08a610ad8799fd8799f0101ffff0040e081c10381bad303b001375a60766078002606e6ea8c0392014375a6074606e6ea800cdd6981c981b1baa001801a06830383039004801206630373034375400500140c8606a002298103d87a800033033301d3031375400266066601e60626ea80052f5c114c0103d87a800040bc44b3001301f302b3754005132323259800981980144cc024c0c800c4cc0240040122c8180c0c4004c0c4004c0b0dd500145902a1801801914a080a88080c04c010c04cc05001114a080506016002600c6ea803229344d9590041", + "hash": "062f7dfb8896f75a6dfcccddf028d4e8bf2ef52a5a73c04b4170707b" + }, + { + "title": "validators.bet.else", + "redeemer": { + "schema": {} + }, + "parameters": [ + { + "title": "backend_pkh", + "schema": { + "$ref": "#/definitions/aiken~1crypto~1VerificationKeyHash" + } + }, + { + "title": "nft_policy_id", + "schema": { + "$ref": "#/definitions/cardano~1assets~1PolicyId" + } + }, + { + "title": "pyth_id", + "schema": { + "$ref": "#/definitions/cardano~1assets~1PolicyId" + } + } + ], + "compiledCode": "59207901010022229800aba4aba2aba1aba0aab9faab9eaab9dab9a9bae0049bae0039bae0024888888888896600264653001300b00198059806000cdc3a4005300b0024888966002600460166ea800e33001300c3754007370e90004dc3a4009300b375400891111991192cc004c018012264646644b3001301b003802c590181bad3018001375c6030004603000260266ea802e2b30013009004899192cc004c06400a0071640586eb4c05c004c04cdd5005c566002600a00915980098099baa00b800c59014459011202240442b300130083011375400314a119800980a98091baa001911919800800801912cc00400629422b3001300330190018a51899801001180d000a028405d23016301700191119199119801001000912cc00400600713233225980099b910070028acc004cdc78038014400600c80ca26600a00a603e00880c8dd7180c0009bad3019001301b001406464646600200200c44b3001001801c4c8cc896600266e4402400a2b30013371e0120051001803203489980280298100022034375c60320026eacc068004c07000501a0a5eb7bdb180520009180b180b980b980b980b800a44444b300159800998021bac301a301737540184b30013375e603660306ea80040222601d30013756600860306ea8c010c060dd5000c0526eb8c06cc060dd500320068a5040591300a98009bab3001301737540190139bae301a3017375400a8012294101546600253001001a44100a44100400d374a9000488c8cc004004dd6180e980f180f180f180f180f180f180f180f180d1baa0032259800800c528456600266e3cdd7180f000801c528c4cc008008c07c00501920389180d980e180e000c8c06cc070c070c070006602c6ea803e6e25200491192cc004cdc7a44100375c603a603c0031301d0018b20303002001911919800800801911980180098010014dc024003375e98103d87a80009180d980e180e180e180e180e000cdc4a4001370290002444444444444453001223375e6054604e6ea8c0a8c09cdd50011807998149ba90014bd70489660026034604c6ea800a2646464b3001302e002899192cc004c07c0062b3001302c37540050068b205a8acc004c08800626464b3001303200280445902f1bad3030001302c3754005159800980f000c56600260586ea800a00d1640b51640a8815102a18151baa001302d0038b205632598009815000c566002601a605200316898101814800a0508b2056375460580026058002604e6ea800a2c812a444b30013371000290004520008acc004c06c0062900144c966002603866e1800920048cc0040126002007337060049002200889800cc004012600200733706601200490022008409c6e08009026204c911919800800801912cc004006298103d87a80008992cc006600260120034a14a281422003133003003302e00240a06006605800281524601c660506ea0004cc0a13010101004bd70244444664464b3001302001189919912cc004cdd7980d18181baa01e4c103d87980008acc006600266e3c008dd7181998181baa301c3030375403d4a14a281722b3001300f30163030375403d1598009980b812816c56600330013370e0026eb4c070c0c0dd5180e18181baa01ea50a5140b9132332259800981318191baa0028992cc004c09cc0ccdd5000c660026eb4c0dcc0d0dd5001cdd6981b981a1baa00199199119198008009bac301e3038375405a44b30010018a6103d87a80008992cc006600260320034a14a281c22003133003003303e00240e06464b3001302d303a3754003132598009817981d9baa00189919191919194c004c1140066eb8c11401a608a009375a608a007304500248888966002609600d133012304a00a1332259800981e000c4c966002609c003133015304d0010038b20963049375400b159800981f800c56600260926ea801600516412916411c82384cc8966002607800315980098249baa00380145904a4566002607e00315980098249baa00380145904a4566002607600315980098249baa00380145904a459047208e411c26602600a2b30013371e6eb8c128c11cdd5006008c566002607b300137566066608e6ea803a08701140c91302f33049374e66092018660926ea0c0c0dd5981998239baa00e4bd7025eb822980103d87a8000411514c103d87a80004114608c6ea8004c118dd5001c590480c114004c110004c10c004c108004c104004c0f0dd5000c5903a181f181d9baa0018a6103d87a800040e4604060746ea8004c0f000503a112cc004c0a8c0d8dd500144c8ca60026eb4c0f0006607a003375c60780049112cc004c10000a266010607e00400d1640f4303c001303737540051640d46eb8c0e0c0d4dd501191192cc004c0a800626464b3001303d00280245903a1bad303b001303737540071598009816800c566002606e6ea800e0051640e11640d481a8c0d4dd50012444b3001302d3036375400314a1132325980099b87375a6078607a00466e08dd6980f181c9baa027480122b3001301830233039375400315980099baf301f30393754604a60726ea8004c084cc0ecdd4002a5eb822646644b3001302f303b3754005132598009818181e1baa001899912cc004cdc42400000515980099b8f375c6084607e6ea80040462b30013370e6eb4c0acc0fcdd500080844cdd79812981f9baa001302733041375001497ae08a5040f514a081ea294103d1bad3040303d37540066080607a6ea800600481d8c0fcc10000e00281d0c0f40045281981d980b981c9baa0013303b301f3039375400297ae08a5040dd14a081ba2941037181d8009bac303a3037375400281a900240c8606c606e00700140c460680022940cc0ca60020570259bad301c30303754603860606ea8079004198194c0040ae04b001401097ae08a5040b914a08172294102e4528205c8a5040b86eb8c0c4004dd69818981900098169baa0258992cc004c09004a2b3001300d3018302e37540391598009980a811815c56600264b30013025302e375400314a11337126eb4c0c8c0bcdd50009bad3032302f375404e8168c030c0b8dd500e44c966002604a605c6ea80062942264646644b300130263032375400513232598009814181a1baa001899192cc004c0a8c0d8dd5000c4c9660026056606e6ea8006265300133001375a607860726ea8020dd6981e181c9baa003998009bad303c3039375400a6eb4c0f0c0e4dd50014cdc11bad301e3039375404e90022444b30013371064b3001301a0018800c4c06400503b19b810030024828270062b3001330293758604460786ea80c4966002660300026eb8c100c0f4dd51814981e9baa02b8980818131bab3029303d375400314a081da2660526eb0c088c0f0dd501892cc004cc060004dd71820181e9baa00e8980818131bab3029303d375400314a081da294103a44c8cc0a8dd61811981e9baa0322598009980c80080144cdc480198139bab302a303e375400314a081e16600266e2000800e26eb8c0fcc0f0dd51814181e1baa02a89bae303f303c375401a81d103a088cdc199b8233702002004904044bd0014019036181d181d8014015035181c800981c801400d033181b800981b801c005031181a0008a5033032301630303754603860606ea8078cc0c8c058c0c0dd5000998194c0040ae04b375a603860606ea8c070c0c0dd500f2008330329800815c0966eb4c070c0c0dd5000a0084bd70181918179baa00140b46028605c6ea8072294102c452820588a5040b115980099baf3018302e3754038980103d87980008acc004c034c050c0b8dd500e4566002b300133015023375c6062605c6ea8c068c0b8dd500e4528c4cc05408c0ad02c4566002660366eb0c050c0b8dd501192cc004cc028004dd7181918179baa301b302f375403b13002301837566036605e6ea8006294102d44cdc3cc004dd5980c18171baa0238154dd7181898171baa01c40649000c52820588a5040b114a08162294102c205837126eb4c048c0b4dd500da056222330073259800981198179baa0018992cc004c090c0c0dd5000c4c8cc04c0048966002005132330010010042259800800c52f5c113303898009b8c480126e0120039b89480226e3120009b8c480226e0120074888888cc88cc0808c8d6600266e3cdd71821800a4410475d3c793008cc004888c8cc00cdd698238009bae3047304800130030019b89480426e3120109b804803e600e90082444446600a464660926ea0cde5250375c6094002660926094609600297ae05980098029b8d0018998241ba930020013304837526600860066e340040052f5c11641104646600e4660946ea0cdc7000a4000660946ea4cc008c0a0dc6800800a5eb808cc0208cc12cdd419b8e00148000cc12cdd49980198149b8d0010014bd7011191919827181a198271ba80073304e375000a6609c609e00297ae03304e304f30500014bd7018008012cc004c09c00a2653001001a5eb820068008889660026080003123233051374e002660a26ea40092f5c065300100180252f5c080088896600200510018cc00400e60aa005330533054002001400c8292246530010059982898290008024c0bc00e6eb8c148c14c0050054c004c8cc144dd419bca4a06eb8c148004cc144c148c14c0052f5c0b30013016371a00313305037526022002660a06ea4cc050c04cdc6800800a5eb822c826244660a4004660a46ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c16400a607c660b060b2010660b098103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a8000330584c103d87a80004bd702002222598008014400633001003982e0014c8c966002609a00313230433305d305e0013305d30433305d305e305b375400697ae0305f305f001305a37540071598009828000c4c8c8c110cc178c17c008cc178c17c004cc178c110cc178c17cc170dd500225eb80c180c180004c17c004c168dd5001c5660026098003132323230453305f30600033305f30600023305f30600013305f30453305f3060305d375400a97ae0306130610013060001305f001305a37540071598009805000c4c8c8c8c8c118cc180c184010cc180c18400ccc180c184008cc180c184004cc180c118cc180c184c178dd500325eb80c188c188004c184004c180004c17c004c168dd5001c5660026012003132323232323047330613062005330613062004330613062003330613062002330613062001330613047330613062305f375400e97ae030633063001306200130610013060001305f001305a375400715980099b874802800626464646464646090660c460c600c660c460c600a660c460c6008660c460c6006660c460c6004660c460c6002660c46090660c460c660c06ea80212f5c060c860c800260c600260c400260c200260c000260be00260b46ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c124cc18cc19001ccc18cc190018cc18cc190014cc18cc190010cc18cc19000ccc18cc190008cc18cc190004cc18cc124cc18cc190c184dd5004a5eb80c194c194004c190004c18c004c188004c184004c180004c17c004c168dd5001c56600266e1d200e00189919191919191919182519832183280419832183280399832183280319832183280299832183280219832183280199832183280119832183280099832182519832183298311baa00a4bd7018331833000983280098320009831800983100098308009830000982f800982d1baa0038acc004cdc3a40200031323232323232323232304b33065306600933065306600833065306600733065306600633065306600533065306600433065306600333065306600233065306600133065304b3306530663063375401697ae0306730670013066001306500130640013063001306200130610013060001305f001305a375400715980099b87480480062646464646464646464646098660cc60ce014660cc60ce012660cc60ce010660cc60ce00e660cc60ce00c660cc60ce00a660cc60ce008660cc60ce006660cc60ce004660cc60ce002660cc6098660cc60ce60c86ea80312f5c060d060d000260ce00260cc00260ca00260c800260c600260c400260c200260c000260be00260b46ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c134cc19cc1a002ccc19cc1a0028cc19cc1a0024cc19cc1a0020cc19cc1a001ccc19cc1a0018cc19cc1a0014cc19cc1a0010cc19cc1a000ccc19cc1a0008cc19cc1a0004cc19cc134cc19cc1a0c194dd5006a5eb80c1a4c1a4004c1a0004c19c004c198004c194004c190004c18c004c188004c184004c180004c17c004c168dd5001c56600266e1d20160018991919191919191919191919182719834183480619834183480599834183480519834183480499834183480419834183480399834183480319834183480299834183480219834183480199834183480119834183480099834182719834183498331baa00e4bd70183518350009834800983400098338009833000983280098320009831800983100098308009830000982f800982d1baa00389919191919191919191919191827198341834806198341834805998341834805198341834804998341834804198341834803998341834803198341834802998341834802198341834801998341834801198341834800998341834983500099834182719834183498331baa00e4bd7025eb80c1a4004c1a0004c19c004c198004c194004c190004c18c004c188004c184004c180004c17c004c168dd5001a0b0416082c105820b0416082c105820b0416082c1058182c1baa001305b002400c82c8dd7182c182c800991acc004c0c800a2653001001a5eb82006800888966002609600312323305c374e002660b86ea40092f5c065300100180252f5c080088896600200510018cc00400e60c00053305e305f002001400c82ea246530010059982e182e8008024c0e800e6eb8c174c1780050051802800a0ac8b20a6375c60b060b2006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241591598009800a408113370490400219801801980a80144cdc124101010100406600600666e00009203f415882b0dc4000c888c8cc16cc00cdd6982e0009982d982e182e800a5eb80c00c006660ae6ea0cdc7000a4000660ae6ea4cc03cc0d4dc6800800a5eb81222323298009198029191982f9ba833794940dd718300009982f98301830800a5eb816600260366e340062660bc6ea4c060004cc178dd49980d180c9b8d0010014bd7045905a1191801acc004c140006298103d87a8000898229982f9ba80014bd7020b630030019bad305d003911191acc006600260a26eb4c18400694294505c44cc02000c8c014c11ccc184dd4000a5eb822601e600898103d87a800041706eb8c184c188004cc17cdd419b8e00148000cc17cdd49980b981e9b8d0010014bd7024446b30013050002898019182319830000a5eb822b3001305300289801919ba548008cc1800052f5c1159800982780144c00c8cdd2a4008660c000297ae08acc004c03400a26600e464660c26ea0cde5250375c60c4002660c260c460c600297ae05980098209b8d0018998301ba9302200133060375266050604e6e340040052f5c1164170466e95200633060375000297ae08acc004c03000a26600e464660c26ea0cde5250375c60c4002660c260c460c600297ae05980098209b8d0018998301ba9302200133060375266050604e6e340040052f5c1164170466e952008330603750b3001337100029040400244006266e04004c0192020417097ae08acc004cdc3a40140051300323374a900519830000a5eb822b30013370e900600144cc0048cdd2a4018660c000297ae0232330613750600c6eb4c188004cc184c188c18c0052f5c064660c26ea0cde5250375c60c4002660c260c460c600297ae059800980e9b8d0018998301ba9301a0013306037526603860366e340040052f5c116417115980099b874803800a266002466e95200e330600014bd70119198309ba833794940dd718310009983098311831800a5eb8166002603a6e340062660c06ea4c068004cc180dd49980e180d9b8d0010014bd7045905c456600266e1d2010002899800919ba548040cc1800052f5c0464660c26ea0cde5250375c60c4002660c260c460c600297ae059800980e9b8d0018998301ba9301a0013306037526603860366e340040052f5c116417115980099b874804800a246464660c466e9520123306230630014bd701983118319832000a5eb80c004008cc0208c8cc188dd419bca4a06eb8c18c004cc188c18cc1900052f5c0b30013042371a00313306137526046002660c26ea4cc0a4c0a0dc6800800a5eb822c82e896600260a400314c103d87980008acc004c154006298103d87a80008acc004c144006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20ba417482e905d20ba8acc004cdc3a40280051300323374a900a19830000a5eb822b30013370e900b00144c00c8cdd2a402c660c000297ae08acc004cdc3a403000513300123374a900c19830000a5eb808c8cc184dd419bca4a06eb8c188004cc184c188c18c0052f5c0b3001301d371a00313306037526034002660c06ea4cc070c06cdc6800800a5eb822c82e22c82d905b20b6416c82d905b20b6416c82d905b20b6416c82d8dd718301830803096600266e2000520808080808080808080028800c4cdc08009801241000282c0c00c00c6eb4c158004c8cc154dd419b8e00148000cc154dd49980698199b8d0010014bd701bae3055305600420968b20903718900122c81f0dd718219822000acc004c01cdc6800c4cc104dd49801000998209ba9330053004371a00200297ae08b207a375c6048607c6ea8cc0808c8d6600266e3cdd71821800a44104b9011a8200891919191919191991198259818998259826003998259ba90013304b304c0024bd70198259826182680125eb80d660026048003125980099b89002371a00313304a37526601e004002660946ea66002005337026e3400400a002b8c25eb822c82322c8228dd7182518258011bae304a004375a609200264660906ea0cde5250375c6092002660906092609400297ae05980098141b8d0018998239ba930090013304737526601e601c6e340040052f5c116410c6eb8c11cc120004d6600294624b30013371290201b8d0018998231ba93300b48100004cc118dd4cc005204099b80371a002901fc0057184bd704590424590411bae30463047001300100259800a51892cc004cdc4a4100026e340062660886ea4cc0252080010013304437533001482000666e00dc6800a40ff0015c612f5c11641011640fd1640f86eb8c10cc11000566002600e6e340062660826ea4c008004cc104dd49980298021b8d0010014bd7045903d1bae3041009300348010c00d200819801001181d000a06e8991801181c8019bae303700240d46eb0c0d0c0c4dd5000c5902f19199119801001000912cc004006298103d87a80008992cc004cdd78021819800c4c070cc0d8c0d00052f5c1133003003303800240c8606c00281a0dd5981a181a981a981a981a981a981a981a981a981a98189baa0043374a90021981919ba548008cc0c8c054c0c0dd5181998181baa0014bd7025eb822c8170c8cc004004dd6180e18181baa0032259800800c530103d87a80008992cc006600260220034a14a281822003133003003303600240c064b3001332259800801452844ca600264b30013029303537540031375a606c60726eacc0e4c0d8dd5000c5200040d06070003375e6070607200337560069112cc0040062b30013002006899802801a400114a081b2264b30013375e607000298010140008acc004cc018010dd6981c981e1bab3039001898019ba6303d0028a5040dd1598009980300224001130030078a5040dc81b8c0ec0050390ca600200337566042606a6ea8c084c0d4dd5002488cc0e4008cc0e4dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0dc0066eacc0e000660780069112cc004cdc8a441000038acc004cdc7a4410000389980298119981e9ba60024bd70000c4cc015300103d87a800000640e519800803c006446600e0046607e66ec0dd48029ba6004001401c81c8607400481c22942294229410391ba633034337606ea4018dd31981a19bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002605060626ea8c0d4c0c8dd5181a98191baa301e3032375400313259800981298191baa0018992cc004c09cc0ccdd5000c4c8c8c8c8cc8966002607c007132598009817181d1baa0018991919194c004dd69821000cdd718210024dd69821001cdd7182100124444b300130470058998121bab304600e225980080144cc09803089660020051302f330490144bd7044c8c8cc07cc1200084c00cc134010dd7182400098250012090899191980e98238010980198258021bae304500130480024119164110304200130410013040001303b37540031640e4607a00d1640ec6eb8c0ec004dd5981d801181d800981d000981c800981a1baa0018b20643036303337540031640c4603060646ea8c078c0c8dd5000c590304530103d87a800040c0606800281908cc020dd6180b18181baa00125980099b87375a606860626ea800400e2646644b3001302730333754005132598009814181a1baa0018992cc004c0a4c0d4dd5000c4c8cc8966002605e60706ea800a2980103d87a8000898109981d9ba832337086eb4c0f4004dd6981e981f000981c9baa332230233303d375066e08dd6981f0011bad303e0013303d375066e08dd6981f181f8011bad303e303f0014bd70181c9baa301000130393754607860726ea80092f5c081b8c8cc8966002b3001302d002899b8900448002294103845300103d87a80008acc004cdc424000009130223303c30223303c37506601e004008660786ea0cc03c0040112f5c097ae08acc004cdc400224001130223303c30223303c37506601e002602c008660786ea0cc03c008c0580112f5c097ae08a610ad8799fd8799f0101ffff0040e081c10381bad303b001375a60766078002606e6ea8c0392014375a6074606e6ea800cdd6981c981b1baa001801a06830383039004801206630373034375400500140c8606a002298103d87a800033033301d3031375400266066601e60626ea80052f5c114c0103d87a800040bc44b3001301f302b3754005132323259800981980144cc024c0c800c4cc0240040122c8180c0c4004c0c4004c0b0dd500145902a1801801914a080a88080c04c010c04cc05001114a080506016002600c6ea803229344d9590041", + "hash": "062f7dfb8896f75a6dfcccddf028d4e8bf2ef52a5a73c04b4170707b" + } + ], + "definitions": { + "ByteArray": { + "dataType": "bytes" + }, + "Int": { + "dataType": "integer" + }, + "Option": { + "title": "Option", + "anyOf": [ + { + "title": "Some", + "description": "An optional value.", + "dataType": "constructor", + "index": 0, + "fields": [ + { + "$ref": "#/definitions/Int" + } + ] + }, + { + "title": "None", + "description": "Nothing.", + "dataType": "constructor", + "index": 1, + "fields": [] + } + ] + }, + "Option": { + "title": "Option", + "anyOf": [ + { + "title": "Some", + "description": "An optional value.", + "dataType": "constructor", + "index": 0, + "fields": [ + { + "$ref": "#/definitions/validators~1Player" + } + ] + }, + { + "title": "None", + "description": "Nothing.", + "dataType": "constructor", + "index": 1, + "fields": [] + } + ] + }, + "aiken/crypto/VerificationKeyHash": { + "title": "VerificationKeyHash", + "dataType": "bytes" + }, + "cardano/assets/PolicyId": { + "title": "PolicyId", + "dataType": "bytes" + }, + "cardano/transaction/OutputReference": { + "title": "OutputReference", + "description": "An `OutputReference` is a unique reference to an output on-chain. The `output_index`\n corresponds to the position in the output list of the transaction (identified by its id)\n that produced that output", + "anyOf": [ + { + "title": "OutputReference", + "dataType": "constructor", + "index": 0, + "fields": [ + { + "title": "transaction_id", + "$ref": "#/definitions/ByteArray" + }, + { + "title": "output_index", + "$ref": "#/definitions/Int" + } + ] + } + ] + }, + "nft/NftRedeemer": { + "title": "NftRedeemer", + "anyOf": [ + { + "title": "Mint", + "dataType": "constructor", + "index": 0, + "fields": [ + { + "title": "utxo_ref", + "$ref": "#/definitions/cardano~1transaction~1OutputReference" + } + ] + }, + { + "title": "Burn", + "dataType": "constructor", + "index": 1, + "fields": [] + } + ] + }, + "validators/DuelDatum": { + "title": "DuelDatum", + "anyOf": [ + { + "title": "DuelDatum", + "dataType": "constructor", + "index": 0, + "fields": [ + { + "title": "duel_id", + "$ref": "#/definitions/ByteArray" + }, + { + "title": "player_a", + "$ref": "#/definitions/validators~1Player" + }, + { + "title": "player_b", + "$ref": "#/definitions/Option" + }, + { + "title": "bet_amount_lovelace", + "$ref": "#/definitions/Int" + }, + { + "title": "status", + "$ref": "#/definitions/validators~1DuelStatus" + }, + { + "title": "deadline", + "$ref": "#/definitions/Option" + } + ] + } + ] + }, + "validators/DuelRedeemer": { + "title": "DuelRedeemer", + "anyOf": [ + { + "title": "Join", + "dataType": "constructor", + "index": 0, + "fields": [ + { + "title": "player_pkh", + "$ref": "#/definitions/aiken~1crypto~1VerificationKeyHash" + }, + { + "title": "feed_id", + "$ref": "#/definitions/Int" + } + ] + }, + { + "title": "Resolve", + "dataType": "constructor", + "index": 1, + "fields": [ + { + "title": "timestamp", + "$ref": "#/definitions/Int" + } + ] + }, + { + "title": "Cancel", + "dataType": "constructor", + "index": 2, + "fields": [] + } + ] + }, + "validators/DuelStatus": { + "title": "DuelStatus", + "anyOf": [ + { + "title": "Waiting", + "dataType": "constructor", + "index": 0, + "fields": [] + }, + { + "title": "Active", + "dataType": "constructor", + "index": 1, + "fields": [] + }, + { + "title": "Finished", + "dataType": "constructor", + "index": 2, + "fields": [] + } + ] + }, + "validators/Player": { + "title": "Player", + "anyOf": [ + { + "title": "Player", + "dataType": "constructor", + "index": 0, + "fields": [ + { + "title": "pkh", + "$ref": "#/definitions/aiken~1crypto~1VerificationKeyHash" + }, + { + "title": "feed_id", + "$ref": "#/definitions/Int" + }, + { + "title": "start_price", + "$ref": "#/definitions/Option" + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/lazer/cardano/lafhis/pyth-coin-stable-validators/validators/nft.ak b/lazer/cardano/lafhis/pyth-coin-stable-validators/validators/nft.ak new file mode 100644 index 00000000..5927e420 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-validators/validators/nft.ak @@ -0,0 +1,105 @@ +use aiken/primitive/bytearray +use aiken/collection/dict +use aiken/collection/list +use aiken/crypto.{VerificationKeyHash, sha2_256} +use cardano/assets +use cardano/assets.{PolicyId} +use cardano/transaction.{OutputReference, Transaction} + +// โ”€โ”€ Redeemer โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +pub type NftRedeemer { + // Mints exactly 1 NFT with asset_name duel_id + // derived from UTxO of Player A Wallet that is consumed in this Tx. + Mint { utxo_ref: OutputReference } + + // Burn one or more NFTs of this policy + // Used in Resolve and Cancel. + Burn +} + +// โ”€โ”€ Helpers โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +fn signed_by(tx: Transaction, pkh: VerificationKeyHash) -> Bool { + list.has(tx.extra_signatories, pkh) +} + +// Derives the duel_id from the OutputReference of a wallet UTxO. +// IMPORTANT: uses a fixed size of 8 bytes for the output_index, +// so the encoding is deterministic and matches the off-chain calculation. +fn duel_id_from_input(utxo_ref: OutputReference) -> ByteArray { + let OutputReference { transaction_id, output_index } = utxo_ref + sha2_256( + bytearray.concat( + transaction_id, + bytearray.from_int_big_endian(output_index, 8), + ), + ) +} + +// โ”€โ”€ Validator โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +// Parameter: +// backend_pkh โ€” only the backend can authorize minting, +// preventing anyone from creating spam duels. +// +// This policy ID is passed as `nft_policy_id` to the `bet` validator. +// Compile this validator first, get its hash, and use it +// as a parameter when compiling `bet`. + +validator nft_policy(backend_pkh: VerificationKeyHash) { + mint( + redeemer: NftRedeemer, + policy_id: PolicyId, + self: Transaction, + ) { + when redeemer is { + + // โ”€โ”€ MINT โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + // Conditions: + // 1. The referenced UTxO in the redeemer must be consumed + // (guarantees unicity of duel_id) + // 2. Exactly 1 Token is minted under this policy, + // with asset_name = duel_id derived from that UTxO. + // 3. Backend signs the TX (avoid spam in duels). + Mint { utxo_ref } -> { + // 1. UTxO from wallet of Player A debe must be an input of this TX + let utxo_consumed = + list.any(self.inputs, fn(i) { + i.output_reference == utxo_ref + }) + + // 2. Derive expected id from that input + let expected_duel_id = duel_id_from_input(utxo_ref) + + // 3. Verify that exactly 1 token with that name is minted + // and nothing else under this policy + let mint_ok = + when assets.tokens(self.mint, policy_id) |> dict.to_pairs is { + [Pair(asset_name, quantity)] -> + asset_name == expected_duel_id && quantity == 1 + _ -> False + } + + // 4. Backend must sign + let backend_ok = signed_by(self, backend_pkh) + + utxo_consumed && mint_ok && backend_ok + } + + // โ”€โ”€ BURN โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + // Called in Resolve (winner determined) and Cancel + // (duel aborted before Player B joins). + // + // Only verifies that all burned tokens have quantity -1. + // Business logic (refund, payout) is validated by + // the spend validator in `bet`. + Burn -> { + assets.tokens(self.mint, policy_id) + |> dict.values() + |> list.all(fn(q) { q == -1 }) + } + } + } + + else(_) { False } +} \ No newline at end of file diff --git a/lazer/cardano/lafhis/pyth-coin-stable-validators/validators/validators.ak b/lazer/cardano/lafhis/pyth-coin-stable-validators/validators/validators.ak new file mode 100644 index 00000000..8c64a416 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-validators/validators/validators.ak @@ -0,0 +1,366 @@ +use aiken/collection/list +use aiken/crypto.{VerificationKeyHash} +use cardano/address.{VerificationKey} +use cardano/assets.{PolicyId, lovelace_of, quantity_of} +use cardano/transaction.{InlineDatum, Output, OutputReference, Transaction} +use pyth +use types/u32 + +// โ”€โ”€ Types โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +pub type DuelStatus { + Waiting + Active + Finished +} + +pub type Player { + pkh: VerificationKeyHash, + feed_id: Int, + // Pyth Pro feed ID (ej: 16 = ADA/USD) + start_price: Option, +} + +// Price snapshot at the beginning of the duel (set in Join) + +pub type DuelDatum { + duel_id: ByteArray, + player_a: Player, + player_b: Option, + bet_amount_lovelace: Int, + status: DuelStatus, + deadline: Option, +} + +// POSIX ms; duel resolves after this + +pub type DuelRedeemer { + // Player B joins; el backend includes the Pyth withdrawal in the same TX + Join { player_pkh: VerificationKeyHash, feed_id: Int } + + // The backend resolves post-deadline; prices come from Pyth withdrawal + Resolve { timestamp: Int } + + // Cancel if player B did not join + Cancel +} + +// โ”€โ”€ Helpers โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +fn signed_by(tx: Transaction, pkh: VerificationKeyHash) -> Bool { + list.has(tx.extra_signatories, pkh) +} + +// Returns percentual change x1_000_000 (1% = 10_000) +fn percent_change(start: Int, end: Int) -> Int { + ( end - start ) * 1_000_000 / start +} + +fn abs(n: Int) -> Int { + if n >= 0 { + n + } else { + -n + } +} + +fn pays_to(o: Output, pkh: VerificationKeyHash) -> Bool { + o.address.payment_credential == VerificationKey(pkh) +} + +// โ”€โ”€ Pyth helpers โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +// Reads the price from a specific feed from Pyth-verified updates. +// pyth.get_updates guarantees the signatures are valid, we only +// look for the feed_id we care about. +// +// Return Price as Int +fn get_price_from_pyth( + pyth_id: PolicyId, + tx: Transaction, + feed_id: Int, +) -> Option { + let updates = pyth.get_updates(pyth_id, tx) + + list.find_map( + updates, + fn(update) { + list.find_map( + update.feeds, + fn(feed) { + if u32.as_int(feed.feed_id) == feed_id { + when feed.price is { + Some(Some(p)) -> Some(p) + _ -> None + } + } else { + None + } + }, + ) + }, + ) +} + +// โ”€โ”€ Continuing Output โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +// Verifies that an output UTxO exists with the right duel_id and authenticity NFT +// Used in Join to guarantee conitnuity +fn find_continuing_output( + tx: Transaction, + duel_id: ByteArray, + policy_id: PolicyId, +) -> Option<(DuelDatum, Int)> { + list.find_map( + tx.outputs, + fn(o) { + when o.datum is { + InlineDatum(raw) -> { + expect d: DuelDatum = raw + if d.duel_id == duel_id { + let has_nft = quantity_of(o.value, policy_id, duel_id) == 1 + if has_nft { + Some((d, lovelace_of(o.value))) + } else { + None + } + } else { + None + } + } + _ -> None + } + }, + ) +} + +// โ”€โ”€ Main Validator โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +validator bet( + backend_pkh: VerificationKeyHash, + nft_policy_id: PolicyId, + pyth_id: PolicyId, +) { + // Policy ID del deployment de Pyth en esta red + spend( + datum: Option, + redeemer: DuelRedeemer, + utxo: OutputReference, + self: Transaction, + ) { + when datum is { + None -> False + Some(d) -> { + // No se deben mintear NFTs de esta policy en TXs intermedias + let has_auth_nft = + list.any( + self.inputs, + fn(i) { + i.output_reference == utxo && quantity_of( + i.output.value, + nft_policy_id, + d.duel_id, + ) == 1 + }, + ) + + // Allow burning (-1) but block any positive minting in intermediate TXs + let no_extra_mint = + quantity_of(self.mint, nft_policy_id, d.duel_id) <= 0 + + let base_ok = has_auth_nft && no_extra_mint + + base_ok && when redeemer is { + // โ”€โ”€ JOIN โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + // Player B joins the duel. + // Tx must include: + // - A zero-withdrawal from the Pyth script with the signed updates + // - Pyth state UTxO as reference input + // - A continuing output with status=Active and both start_prices + // + // CHECKS: prices of output Datum + // match with the things Pyth reports in this Tx + Join { player_pkh, feed_id } -> { + let is_waiting = d.status == Waiting + let not_player_a = player_pkh != d.player_a.pkh + let no_opponent_yet = d.player_b == None + let backend_ok = signed_by(self, backend_pkh) + let diff_asset = feed_id != d.player_a.feed_id + + // Read start prices from Pyth (verify crypt.) + let price_a_opt = + get_price_from_pyth(pyth_id, self, d.player_a.feed_id) + let price_b_opt = get_price_from_pyth(pyth_id, self, feed_id) + + let output_ok = + when (price_a_opt, price_b_opt) is { + (Some(pa), Some(pb)) -> + when + find_continuing_output(self, d.duel_id, nft_policy_id) + is { + None -> False + Some((out_datum, out_lovelace)) -> { + // The pool has to be 2 times the individual bet + let amount_ok = out_lovelace == d.bet_amount_lovelace * 2 + + // Datum has to have updated status + // With prices read from pyth + let datum_ok = + out_datum.status == Active && out_datum.player_a.start_price == Some( + pa, + ) && when (out_datum.deadline, out_datum.player_b) is { + (Some(dl), Some(pb_out)) -> + dl > 0 && pb_out.pkh == player_pkh && pb_out.feed_id == feed_id && pb_out.start_price == Some( + pb, + ) + _ -> False + } + + amount_ok && datum_ok + } + } + _ -> False + } + + is_waiting && not_player_a && no_opponent_yet && backend_ok && diff_asset && output_ok + } + + // โ”€โ”€ RESOLVE โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + // Backends call this post deadline + // Final prices are read from Pyth withdrawal in this Tx + // + // Winner: asset with greater change % since their start_price. + // Draw: difference < 1% โ†’ both get their deposit back. + Resolve { timestamp } -> { + let is_active = d.status == Active + let backend_ok = signed_by(self, backend_pkh) + + let deadline_passed = + when d.deadline is { + None -> False + Some(dl) -> timestamp >= dl + } + + let payout_ok = + when d.player_b is { + None -> False + Some(pb) -> { + // Read final prices from Pyth + let end_a_opt = + get_price_from_pyth(pyth_id, self, d.player_a.feed_id) + let end_b_opt = get_price_from_pyth(pyth_id, self, pb.feed_id) + + when + ( + d.player_a.start_price, + pb.start_price, + end_a_opt, + end_b_opt, + ) + is { + (Some(sa), Some(sb), Some(end_a), Some(end_b)) -> { + let change_a = percent_change(sa, end_a) + let change_b = percent_change(sb, end_b) + let total = d.bet_amount_lovelace * 2 + let is_draw = abs(change_a - change_b) < 100 + + if is_draw { + // Draw: each player recovers their initial bet + let a_ok = + list.any( + self.outputs, + fn(o) { + pays_to(o, d.player_a.pkh) && lovelace_of(o.value) >= d.bet_amount_lovelace + }, + ) + let b_ok = + list.any( + self.outputs, + fn(o) { + pays_to(o, pb.pkh) && lovelace_of(o.value) >= d.bet_amount_lovelace + }, + ) + a_ok && b_ok + } else { + // Winner: takes it all + let winner = + if change_a > change_b { + d.player_a.pkh + } else { + pb.pkh + } + list.any( + self.outputs, + fn(o) { + pays_to(o, winner) && lovelace_of(o.value) >= total + }, + ) + } + } + // Error in price retrieval + _ -> False + } + } + } + + is_active && backend_ok && deadline_passed && payout_ok + } + + // โ”€โ”€ CANCEL โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + // Only valid if Status is Waiting + // Player A or backend may cancel + // NFT must be burned and Player A recovers their money + Cancel -> { + let is_waiting = d.status == Waiting + let no_opponent = d.player_b == None + let authorized = + signed_by(self, d.player_a.pkh) || signed_by(self, backend_pkh) + let refund_ok = + list.any( + self.outputs, + fn(o) { + pays_to(o, d.player_a.pkh) && lovelace_of(o.value) >= d.bet_amount_lovelace + }, + ) + let nft_burned = + quantity_of(self.mint, nft_policy_id, d.duel_id) == -1 + + is_waiting && no_opponent && authorized && refund_ok && nft_burned + } + } + } + } + } + + else(_) { + False + } +} +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// .' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||_ \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// ไฝ›็ฅ–ไฟไฝ‘ ๆฐธๆ— BUG +// ไฝ›ๆ›ฐ: +// ๅ†™ๅญ—ๆฅผ้‡Œๅ†™ๅญ—้—ด๏ผŒ ๅ†™ๅญ—้—ด้‡Œ็จ‹ๅบๅ‘˜๏ผ› +// ็จ‹ๅบไบบๅ‘˜ๅ†™็จ‹ๅบ๏ผŒ ๅˆๆ‹ฟ็จ‹ๅบๆข้…’้’ฑใ€‚ +// ้…’้†’ๅชๅœจ็ฝ‘ไธŠๅ๏ผŒ ้…’้†‰่ฟ˜ๆฅ็ฝ‘ไธ‹็œ ๏ผ› +// ้…’้†‰้…’้†’ๆ—ฅๅคๆ—ฅ๏ผŒ ็ฝ‘ไธŠ็ฝ‘ไธ‹ๅนดๅคๅนดใ€‚ +// ไฝ†ๆ„ฟ่€ๆญป็”ต่„‘้—ด๏ผŒ ไธๆ„ฟ้ž ่บฌ่€ๆฟๅ‰๏ผ› +// ๅฅ”้ฉฐๅฎ้ฉฌ่ดต่€…่ถฃ๏ผŒ ๅ…ฌไบค่‡ช่กŒ็จ‹ๅบๅ‘˜ใ€‚ +// ๅˆซไบบ็ฌ‘ๆˆ‘ๅฟ’็–ฏ็™ซ๏ผŒ ๆˆ‘็ฌ‘่‡ชๅทฑๅ‘ฝๅคช่ดฑ๏ผ› +// ไธ่งๆปก่ก—ๆผ‚ไบฎๅฆน๏ผŒ ๅ“ชไธชๅฝ’ๅพ—็จ‹ๅบๅ‘˜๏ผŸ diff --git a/lazer/cardano/lafhis/pyth-coin-stable-validators/validators/winner_token.ak b/lazer/cardano/lafhis/pyth-coin-stable-validators/validators/winner_token.ak new file mode 100644 index 00000000..7dd99b9d --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable-validators/validators/winner_token.ak @@ -0,0 +1,75 @@ +use aiken/collection/dict +use aiken/collection/list +use aiken/crypto.{VerificationKeyHash} +use cardano/assets +use cardano/assets.{PolicyId} +use cardano/transaction.{Transaction} + +// Token name for all victory tokens โ€” fungible, same name across all duels. +// "horseshoe" encoded as UTF-8 hex +const horseshoe: ByteArray = "686f727365736f6f65" + +// โ”€โ”€ Redeemer โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +pub type WinnerRedeemer { + // Mints exactly 1 "horseshoe" token to the winner. + // Called by the backend in the same TX as Resolve. + MintVictory + + // Burns one or more horseshoe tokens (future work: leaderboard redemption). + BurnVictory +} + +// โ”€โ”€ Helpers โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +fn signed_by(tx: Transaction, pkh: VerificationKeyHash) -> Bool { + list.has(tx.extra_signatories, pkh) +} + +// โ”€โ”€ Validator โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +// Parameters: +// backend_pkh โ€” only the backend can authorize minting, +// so tokens can only be issued after a real Resolve TX. +// +// Usage: +// The backend includes this mint alongside the Resolve spend in one TX. +// That single atomic TX settles the duel AND awards 1 horseshoe to the winner. +// Winners accumulate horseshoes across duels โ€” their balance is the leaderboard. + +validator winner_token(backend_pkh: VerificationKeyHash) { + mint( + redeemer: WinnerRedeemer, + policy_id: PolicyId, + self: Transaction, + ) { + when redeemer is { + + // โ”€โ”€ MINT VICTORY โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + // Conditions: + // 1. Backend signs the TX (only issued on a real Resolve) + // 2. Exactly 1 "horseshoe" token minted under this policy + MintVictory -> { + let backend_ok = signed_by(self, backend_pkh) + + let mint_ok = + when assets.tokens(self.mint, policy_id) |> dict.to_pairs is { + [Pair(asset_name, quantity)] -> + asset_name == horseshoe && quantity == 1 + _ -> False + } + + backend_ok && mint_ok + } + + // โ”€โ”€ BURN VICTORY โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + // Holders can burn their own tokens (no backend needed). + BurnVictory -> { + assets.tokens(self.mint, policy_id) + |> dict.values() + |> list.all(fn(q) { q == -1 }) + } + } + } + + else(_) { False } +} diff --git a/lazer/cardano/lafhis/pyth-coin-stable/package-lock.json b/lazer/cardano/lafhis/pyth-coin-stable/package-lock.json new file mode 100644 index 00000000..922a2433 --- /dev/null +++ b/lazer/cardano/lafhis/pyth-coin-stable/package-lock.json @@ -0,0 +1,14980 @@ +{ + "name": "pyth-coin-stable", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "pyth-coin-stable", + "version": "0.1.0", + "license": "Apache-2.0", + "dependencies": { + "@meshsdk/core": "^1.9.0-beta.0", + "@meshsdk/react": "^1.9.0-beta.0", + "next": "15.0.3", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "15.0.3", + "postcss": "^8", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "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.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@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/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@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", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "license": "MIT", + "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-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "license": "MIT", + "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", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "license": "MIT", + "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", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "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.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@basementuniverse/commonjs": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@basementuniverse/commonjs/-/commonjs-1.2.10.tgz", + "integrity": "sha512-hmqEAGVCdsyQWJ5PwweFegOZ19gBm5Ppw48/l8mOexcjubyuhmgRt6SB8BoLF9C4lzRemG816hH77w7hJRrDMA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT" + }, + "node_modules/@basementuniverse/marble-identicons": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@basementuniverse/marble-identicons/-/marble-identicons-0.1.2.tgz", + "integrity": "sha512-Z9w8lp4hwy3zwtl+ldVtN+Vr9BkD/NJCJZWLDjiWYLIkMPglhqUDy8ffXNDAB35UmKj7p/X+LKtSr+ApbMYhLA==", + "license": "MIT", + "dependencies": { + "@basementuniverse/commonjs": "^1.2.10", + "seed-random": "^2.2.0" + } + }, + "node_modules/@biglup/is-cid": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@biglup/is-cid/-/is-cid-1.0.3.tgz", + "integrity": "sha512-R0XPZ/IQhU2TtetSFI9vI+7kJOJYNiCncn5ixEBW+/LNaZCo2HK37Mq3pRNzrM4FryuAkyeqY7Ujmj3I3e3t9g==", + "license": "Apache-2.0", + "dependencies": { + "@multiformats/mafmt": "^12.1.6", + "@multiformats/multiaddr": "^12.1.14", + "iso-url": "^1.1.3", + "multiformats": "^13.0.1", + "uint8arrays": "^5.0.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@bufbuild/protobuf": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-1.10.1.tgz", + "integrity": "sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ==", + "license": "(Apache-2.0 AND BSD-3-Clause)", + "peer": true + }, + "node_modules/@cardano-ogmios/client": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@cardano-ogmios/client/-/client-6.9.0.tgz", + "integrity": "sha512-IsoUVsaMXiYyhWrdVKYOA5PDlX0EZ2gaq4lfk4JelRw6mcWVxemUrMaU2ndvugO9LQ3SCM1nESPgMIU0xe5FWw==", + "license": "MPL-2.0", + "dependencies": { + "@cardano-ogmios/schema": "6.9.0", + "@cardanosolutions/json-bigint": "^1.0.1", + "@types/json-bigint": "^1.0.1", + "bech32": "^2.0.0", + "cross-fetch": "^3.1.4", + "fastq": "^1.11.0", + "isomorphic-ws": "^4.0.1", + "nanoid": "^3.1.31", + "ts-custom-error": "^3.2.0", + "ws": "^7.5.10" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@cardano-ogmios/schema": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@cardano-ogmios/schema/-/schema-6.9.0.tgz", + "integrity": "sha512-e7QVLF+dQMIv9p+p5CWQjMfBmkERYRa2wK2AjyehQZCJnecZ0gvTbRqewdX5VW4mVXf6KUfFyphsxWK46Pg6LA==", + "license": "MPL-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@cardano-sdk/core": { + "version": "0.46.12", + "resolved": "https://registry.npmjs.org/@cardano-sdk/core/-/core-0.46.12.tgz", + "integrity": "sha512-yUA/xBUQMiMqIWiZPvIhM911pL3jNKg4PkZQ8qP9R7yU3NQ5x4RQkZ+zFDlVLxUt+gJiwIW2es0iPd8ObIKCxA==", + "license": "Apache-2.0", + "dependencies": { + "@biglup/is-cid": "^1.0.3", + "@cardano-ogmios/client": "6.9.0", + "@cardano-ogmios/schema": "6.9.0", + "@cardano-sdk/crypto": "~0.4.5", + "@cardano-sdk/util": "~0.17.1", + "@foxglove/crc": "^0.0.3", + "@scure/base": "^1.1.1", + "fraction.js": "4.0.1", + "ip-address": "^9.0.5", + "lodash": "^4.17.21", + "ts-custom-error": "^3.2.0", + "ts-log": "^2.2.4", + "web-encoding": "^1.1.5" + }, + "engines": { + "node": ">=16.20.2" + }, + "peerDependencies": { + "rxjs": "^7.4.0" + }, + "peerDependenciesMeta": { + "rxjs": { + "optional": true + } + } + }, + "node_modules/@cardano-sdk/crypto": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@cardano-sdk/crypto/-/crypto-0.4.5.tgz", + "integrity": "sha512-ymliqxdmen5dGVaiMVQ0VnhrwaYUjbPD3sHoMj8NI6MTuxrREp3pLJASREtWhwmv9k+QzDT6CoyuIXnlEQiWZQ==", + "license": "Apache-2.0", + "dependencies": { + "@cardano-sdk/util": "~0.17.1", + "blake2b": "^2.1.4", + "i": "^0.3.7", + "libsodium-wrappers-sumo": "0.7.10", + "lodash": "^4.17.21", + "pbkdf2": "^3.1.3", + "ts-custom-error": "^3.2.0", + "ts-log": "^2.2.4" + }, + "engines": { + "node": ">=16.20.2" + }, + "peerDependencies": { + "@dcspark/cardano-multiplatform-lib-asmjs": "^3.1.1", + "@dcspark/cardano-multiplatform-lib-browser": "^3.1.1", + "@dcspark/cardano-multiplatform-lib-nodejs": "^3.1.1" + }, + "peerDependenciesMeta": { + "@dcspark/cardano-multiplatform-lib-asmjs": { + "optional": true + }, + "@dcspark/cardano-multiplatform-lib-browser": { + "optional": true + }, + "@dcspark/cardano-multiplatform-lib-nodejs": { + "optional": true + } + } + }, + "node_modules/@cardano-sdk/dapp-connector": { + "version": "0.13.26", + "resolved": "https://registry.npmjs.org/@cardano-sdk/dapp-connector/-/dapp-connector-0.13.26.tgz", + "integrity": "sha512-4GptUVsGmgZhzKs+yp3360dA+HNdMi8IW1r2n1H63PYOJDPj2bjopBeyOGFn8Dmkzt+64rm2KyVyZM2SlcUq9Q==", + "license": "Apache-2.0", + "dependencies": { + "@cardano-sdk/core": "~0.46.12", + "@cardano-sdk/crypto": "~0.4.5", + "@cardano-sdk/util": "~0.17.1", + "ts-custom-error": "^3.2.0", + "ts-log": "^2.2.4", + "webextension-polyfill": "^0.8.0" + }, + "engines": { + "node": ">=16.20.2" + } + }, + "node_modules/@cardano-sdk/input-selection": { + "version": "0.14.28", + "resolved": "https://registry.npmjs.org/@cardano-sdk/input-selection/-/input-selection-0.14.28.tgz", + "integrity": "sha512-pbysJUaIbbpesbv/f0XfFPKBb+bLjCmPcMfNJzpePSZBvr8bUcFpnfKtq28KthVdpe2mgL3k9ebTTcBSk7aERw==", + "license": "Apache-2.0", + "dependencies": { + "@cardano-sdk/core": "~0.46.12", + "@cardano-sdk/key-management": "~0.29.12", + "@cardano-sdk/util": "~0.17.1", + "bignumber.js": "^9.1.1", + "lodash": "^4.17.21", + "ts-custom-error": "^3.2.0" + }, + "engines": { + "node": ">=16.20.2" + } + }, + "node_modules/@cardano-sdk/key-management": { + "version": "0.29.12", + "resolved": "https://registry.npmjs.org/@cardano-sdk/key-management/-/key-management-0.29.12.tgz", + "integrity": "sha512-bctIVPg0DBCECnECIPCBfHwnF3En+AVJzpUdje+Q2a+/kryolw99i5Y7le+rpjq1LRypWUG0sUAGLY8D850epA==", + "license": "Apache-2.0", + "dependencies": { + "@cardano-sdk/core": "~0.46.12", + "@cardano-sdk/crypto": "~0.4.5", + "@cardano-sdk/dapp-connector": "~0.13.26", + "@cardano-sdk/util": "~0.17.1", + "@emurgo/cardano-message-signing-nodejs": "^1.0.1", + "bip39": "^3.0.4", + "chacha": "^2.1.0", + "get-random-values": "^2.0.0", + "lodash": "^4.17.21", + "pbkdf2": "^3.1.3", + "rxjs": "^7.4.0", + "ts-custom-error": "^3.2.0", + "ts-log": "^2.2.4" + }, + "engines": { + "node": ">=16.20.2" + } + }, + "node_modules/@cardano-sdk/util": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@cardano-sdk/util/-/util-0.17.1.tgz", + "integrity": "sha512-TCYe+wRguW1WgRlbWqhGPhcSBkzVzdIcCVgDDN7wiQk2dew0EWVqjsKeqDZdfwzy/s2kr/ZOgXIGywBn/Bzu/Q==", + "license": "Apache-2.0", + "dependencies": { + "bech32": "^2.0.0", + "lodash": "^4.17.21", + "serialize-error": "^8", + "ts-custom-error": "^3.2.0", + "ts-log": "^2.2.4" + }, + "engines": { + "node": ">=16.20.2" + } + }, + "node_modules/@cardanosolutions/json-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@cardanosolutions/json-bigint/-/json-bigint-1.1.0.tgz", + "integrity": "sha512-Pdgz18cSwLKKgheOqW/dqbzNI+CliNT4AdaKaKY/P++J9qLxIB8MITCurlzbaFWV3W4nmK0CRQwI1yvuArmjFg==", + "license": "MIT" + }, + "node_modules/@chainsafe/is-ip": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.1.0.tgz", + "integrity": "sha512-KIjt+6IfysQ4GCv66xihEitBjvhU/bixbbbFxdJ1sqCp4uJ0wuZiYBPhksZoy4lfaF0k9cwNzY5upEW/VWdw3w==", + "license": "MIT" + }, + "node_modules/@chainsafe/netmask": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@chainsafe/netmask/-/netmask-2.0.0.tgz", + "integrity": "sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==", + "license": "MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1" + } + }, + "node_modules/@connectrpc/connect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@connectrpc/connect/-/connect-1.4.0.tgz", + "integrity": "sha512-vZeOkKaAjyV4+RH3+rJZIfDFJAfr+7fyYr6sLDKbYX3uuTVszhFe9/YKf5DNqrDb5cKdKVlYkGn6DTDqMitAnA==", + "license": "Apache-2.0", + "peer": true, + "peerDependencies": { + "@bufbuild/protobuf": "^1.4.2" + } + }, + "node_modules/@connectrpc/connect-node": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@connectrpc/connect-node/-/connect-node-1.4.0.tgz", + "integrity": "sha512-0ANnrr6SvsjevsWEgdzHy7BaHkluZyS6s4xNoVt7RBHFR5V/kT9lPokoIbYUOU9JHzdRgTaS3x5595mwUsu15g==", + "license": "Apache-2.0", + "dependencies": { + "undici": "^5.28.3" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@bufbuild/protobuf": "^1.4.2", + "@connectrpc/connect": "1.4.0" + } + }, + "node_modules/@connectrpc/connect-web": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@connectrpc/connect-web/-/connect-web-1.4.0.tgz", + "integrity": "sha512-13aO4psFbbm7rdOFGV0De2Za64DY/acMspgloDlcOKzLPPs0yZkhp1OOzAQeiAIr7BM/VOHIA3p8mF0inxCYTA==", + "license": "Apache-2.0", + "peerDependencies": { + "@bufbuild/protobuf": "^1.4.2", + "@connectrpc/connect": "1.4.0" + } + }, + "node_modules/@dnsquery/dns-packet": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@dnsquery/dns-packet/-/dns-packet-6.1.1.tgz", + "integrity": "sha512-WXTuFvL3G+74SchFAtz3FgIYVOe196ycvGsMgvSH/8Goptb1qpIQtIuM4SOK9G9lhMWYpHxnXyy544ZhluFOew==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.4", + "utf8-codec": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emurgo/cardano-message-signing-nodejs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-message-signing-nodejs/-/cardano-message-signing-nodejs-1.1.0.tgz", + "integrity": "sha512-PQRc8K8wZshEdmQenNUzVtiI8oJNF/1uAnBhidee5C4o1l2mDLOW+ur46HWHIFKQ6x8mSJTllcjMscHgzju0gQ==", + "license": "MIT" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "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/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fabianbormann/cardano-peer-connect": { + "version": "1.2.18", + "resolved": "https://registry.npmjs.org/@fabianbormann/cardano-peer-connect/-/cardano-peer-connect-1.2.18.tgz", + "integrity": "sha512-eyVVMlThkURTsHFJDww253Mk+IzCR2yRYaepyomyqu9HWu2/N8qqC98vNksAbAQ12AzQs7ElwwRgT9HggOuhcw==", + "license": "Apache-2.0", + "dependencies": { + "@basementuniverse/marble-identicons": "^0.1.2", + "@fabianbormann/meerkat": "^1.0.17", + "qrcode-svg": "^1.1.0" + } + }, + "node_modules/@fabianbormann/meerkat": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/@fabianbormann/meerkat/-/meerkat-1.0.18.tgz", + "integrity": "sha512-4QuyhlpouIJvcwqlItn91ugl8uC/L1muuN3XFLuO38qMrUucyV0+yykAp1RlzwOlO7YvDYZEaJ8kCa+/MU7UCg==", + "license": "Apache-2.0", + "dependencies": { + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@rvagg/ripemd160": "^2.2.4", + "@webpod/ip": "^0.6.1", + "bs58": "^6.0.0", + "bs58check": "^4.0.0", + "tweetnacl": "^1.0.3", + "vm-browserify": "^1.1.2", + "webtorrent": "^2.8.4" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@foxglove/crc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@foxglove/crc/-/crc-0.0.3.tgz", + "integrity": "sha512-DjIZsnL3CyP/yQ/vUYA9cjrD0a/8YXejI5ZmsaOiT16cLfZcTwaCxIN01/ys4jsy+dZCQ/9DnWFn7AEFbiMDaA==", + "license": "MIT" + }, + "node_modules/@harmoniclabs/bigint-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@harmoniclabs/bigint-utils/-/bigint-utils-1.0.0.tgz", + "integrity": "sha512-OhZMHcdtH2hHKMlxWFHf71PmKHdoi9ARpjS9mUu0/cd8VWDDjT7VQoQwC5NN/68iyO4O5Dojrvrp9tjG5BDABA==", + "license": "Apache-2.0", + "dependencies": { + "@harmoniclabs/uint8array-utils": "^1.0.0" + } + }, + "node_modules/@harmoniclabs/biguint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@harmoniclabs/biguint/-/biguint-1.0.0.tgz", + "integrity": "sha512-5DyCIBDL4W+7ffR1IJSbGrCG4xEYxAlFH5gCNF42qtyL5ltwZ92Ae1MyXpHM2TUPy7ocSTqlLUsOdy+SvqVVPw==", + "license": "Apache-2.0" + }, + "node_modules/@harmoniclabs/bitstream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@harmoniclabs/bitstream/-/bitstream-1.0.0.tgz", + "integrity": "sha512-Ed/I46IuCiytE5QiMmmUo9kPJcypM7OuUqoRaAXUALL5C6LKLpT6kYE1qeuhLkx2/WvkHT18jcOX6jhM/nmqoA==", + "license": "MIT", + "dependencies": { + "@harmoniclabs/uint8array-utils": "^1.0.0" + } + }, + "node_modules/@harmoniclabs/bytestring": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@harmoniclabs/bytestring/-/bytestring-1.0.0.tgz", + "integrity": "sha512-d5m10O0okKc6QNX0pSRriFTkk/kNMnMBGbo5X3kEZwKaXTI4tDVoTZBL7bwbYHwOEdSxWJjVtlO9xtB7ZrYZNg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@harmoniclabs/uint8array-utils": "^1.0.0" + } + }, + "node_modules/@harmoniclabs/cbor": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@harmoniclabs/cbor/-/cbor-1.6.0.tgz", + "integrity": "sha512-KI25p8pHI1rmFZC9NYSxATwlCZ+KJdjydpptKebHcw03Iy7M+E8mF+hSnN5dTbS45xw5ZyKUgPLRgLo1sTuIoQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@harmoniclabs/bytestring": "^1.0.0", + "@harmoniclabs/obj-utils": "^1.0.0", + "@harmoniclabs/uint8array-utils": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/HarmonicLabs" + } + }, + "node_modules/@harmoniclabs/crypto": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@harmoniclabs/crypto/-/crypto-0.3.0.tgz", + "integrity": "sha512-UvmGQOLFVFhRIDYLpcWbPQLXl9advCt0h02Z/BtBuXtHiy35WRxKQ3njcUKI0v6zGITuvqQhsf6VOPMeekLdeA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@harmoniclabs/bitstream": "^1.0.0", + "@harmoniclabs/uint8array-utils": "^1.0.3" + } + }, + "node_modules/@harmoniclabs/obj-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@harmoniclabs/obj-utils/-/obj-utils-1.0.0.tgz", + "integrity": "sha512-EO1bQBZAORrutcP+leP5YNDwNd/9TOE23VEvs3ktniXg6w0knUrLjUIl2Pkcbs/D1VQxqmsNpXho+vaMj00qxA==", + "license": "MIT" + }, + "node_modules/@harmoniclabs/pair": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@harmoniclabs/pair/-/pair-1.0.0.tgz", + "integrity": "sha512-D9OBowsUsy1LctHxWzd9AngTzoo5x3rBiJ0gu579t41Q23pb+VNx1euEfluUEiaYbgljcl1lb/4D1fFTZd1tRQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@harmoniclabs/plutus-data": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@harmoniclabs/plutus-data/-/plutus-data-1.2.6.tgz", + "integrity": "sha512-rF046GZ07XDpjZBNybALKYSycjxCLzXKbhLylu9pRuZiii5fVXReEfgtLB29TsPBvGY6ZBeiyHgJnLgm+huZBw==", + "license": "Apache-2.0", + "dependencies": { + "@harmoniclabs/biguint": "^1.0.0", + "@harmoniclabs/crypto": "^0.2.4", + "@harmoniclabs/uint8array-utils": "^1.0.0" + }, + "peerDependencies": { + "@harmoniclabs/bytestring": "^1.0.0", + "@harmoniclabs/cbor": "^1.3.0" + } + }, + "node_modules/@harmoniclabs/plutus-data/node_modules/@harmoniclabs/crypto": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@harmoniclabs/crypto/-/crypto-0.2.5.tgz", + "integrity": "sha512-t2saWMFWBx8tOHotiYTTfQKhPGpWT4AMLXxq3u0apShVXNV0vgL0gEgSMudBjES/wrKByCqa2xmU70gadz26hA==", + "license": "MIT", + "dependencies": { + "@harmoniclabs/bitstream": "^1.0.0", + "@harmoniclabs/uint8array-utils": "^1.0.3" + } + }, + "node_modules/@harmoniclabs/uint8array-utils": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@harmoniclabs/uint8array-utils/-/uint8array-utils-1.0.4.tgz", + "integrity": "sha512-Z454prSbX4geXGHyjjcn9vm6u9NsD3VJykv8f8yE1VjIXSPitaLPEnm8u2+B+GMp1chYlLilOq+kW4OvJ6y28A==", + "license": "Apache-2.0" + }, + "node_modules/@harmoniclabs/uplc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@harmoniclabs/uplc/-/uplc-1.4.1.tgz", + "integrity": "sha512-sELKStjxPBPBxBMylU4oBSUe0/8eJe2HqRblNSwrMu8Fso4YpSPDqHZ33iDZ8QAadVUsT5r2EQKX0TLrj7qXvQ==", + "license": "Apache-2.0", + "dependencies": { + "@harmoniclabs/bigint-utils": "^1.0.0", + "@harmoniclabs/uint8array-utils": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/HarmonicLabs" + }, + "peerDependencies": { + "@harmoniclabs/bytestring": "^1.0.0", + "@harmoniclabs/cbor": "^1.3.0", + "@harmoniclabs/crypto": "^0.3.0-dev0", + "@harmoniclabs/pair": "^1.0.0", + "@harmoniclabs/plutus-data": "^1.2.4" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "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.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "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-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@libp2p/interface": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-3.1.0.tgz", + "integrity": "sha512-RE7/XyvC47fQBe1cHxhMvepYKa5bFCUyFrrpj8PuM0E7JtzxU7F+Du5j4VXbg2yLDcToe0+j8mB7jvwE2AThYw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@multiformats/dns": "^1.0.6", + "@multiformats/multiaddr": "^13.0.1", + "main-event": "^1.0.1", + "multiformats": "^13.4.0", + "progress-events": "^1.0.1", + "uint8arraylist": "^2.4.8" + } + }, + "node_modules/@libp2p/interface/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" + } + }, + "node_modules/@meshsdk/common": { + "version": "1.9.0-beta.101", + "resolved": "https://registry.npmjs.org/@meshsdk/common/-/common-1.9.0-beta.101.tgz", + "integrity": "sha512-5riUdwO78nSq61P+fNOMs5rfOVxm61N5T/JbdKE9oa8FMuAvgePBs6vesdCU1FSAQy4ppZI3Ez5q1ujoShw/7g==", + "license": "Apache-2.0", + "dependencies": { + "bech32": "^2.0.0", + "bip39": "3.1.0", + "blake2b": "^2.1.4", + "blakejs": "^1.2.1" + } + }, + "node_modules/@meshsdk/core": { + "version": "1.9.0-beta.101", + "resolved": "https://registry.npmjs.org/@meshsdk/core/-/core-1.9.0-beta.101.tgz", + "integrity": "sha512-tAg8V3+CJEwHMKsXHlfYsmTSZSz1fUIFzmGkH247ydjcynqNKjoZ10vtj0O2nI7QXT7oI9EhCJ6xikJC/jUXBQ==", + "license": "Apache-2.0", + "dependencies": { + "@meshsdk/common": "1.9.0-beta.101", + "@meshsdk/core-cst": "1.9.0-beta.101", + "@meshsdk/provider": "1.9.0-beta.100", + "@meshsdk/transaction": "1.9.0-beta.101", + "@meshsdk/wallet": "1.9.0-beta.101" + } + }, + "node_modules/@meshsdk/core-cst": { + "version": "1.9.0-beta.101", + "resolved": "https://registry.npmjs.org/@meshsdk/core-cst/-/core-cst-1.9.0-beta.101.tgz", + "integrity": "sha512-Vz7EFwc+9zNjhxt0LanY3283eqdjb78uyvodTKMixkYOJvDYprGY3Ul6B4w+IJ4fn/RfazFn9XtIk2Y+wIJ69w==", + "license": "Apache-2.0", + "dependencies": { + "@cardano-sdk/core": "0.46.12", + "@cardano-sdk/crypto": "0.4.5", + "@cardano-sdk/input-selection": "0.14.28", + "@cardano-sdk/util": "0.17.1", + "@harmoniclabs/cbor": "1.6.0", + "@harmoniclabs/pair": "^1.0.0", + "@harmoniclabs/plutus-data": "1.2.6", + "@harmoniclabs/uplc": "1.4.1", + "@meshsdk/common": "1.9.0-beta.101", + "@types/base32-encoding": "^1.0.2", + "base32-encoding": "^1.0.0", + "bech32": "^2.0.0", + "blakejs": "^1.2.1", + "bn.js": "^5.2.0", + "hash.js": "^1.1.7", + "scalus": "^0.14.2" + } + }, + "node_modules/@meshsdk/provider": { + "version": "1.9.0-beta.100", + "resolved": "https://registry.npmjs.org/@meshsdk/provider/-/provider-1.9.0-beta.100.tgz", + "integrity": "sha512-930tN8ZxK/pOXCSlvLxWIUbP5KyEO7EloacuPjSNnRP9rVJlt/AoiW30CSV8l9ZegA9VH30pev9Svv0Qj/kjRQ==", + "license": "Apache-2.0", + "dependencies": { + "@meshsdk/common": "1.9.0-beta.100", + "@meshsdk/core-cst": "1.9.0-beta.100", + "@utxorpc/sdk": "^0.6.7", + "@utxorpc/spec": "^0.16.0", + "axios": "^1.7.2", + "cbor": "^10.0.9" + } + }, + "node_modules/@meshsdk/provider/node_modules/@meshsdk/common": { + "version": "1.9.0-beta.100", + "resolved": "https://registry.npmjs.org/@meshsdk/common/-/common-1.9.0-beta.100.tgz", + "integrity": "sha512-H3ktKR9eheRKZupg7DLdUr8A9dsefJbu7Wc+I1suwrv+oAZWiJ2wCuF3bX2QQo3LyWrSkVCE7WEiKFfQmukIww==", + "license": "Apache-2.0", + "dependencies": { + "bech32": "^2.0.0", + "bip39": "3.1.0", + "blake2b": "^2.1.4", + "blakejs": "^1.2.1" + } + }, + "node_modules/@meshsdk/provider/node_modules/@meshsdk/core-cst": { + "version": "1.9.0-beta.100", + "resolved": "https://registry.npmjs.org/@meshsdk/core-cst/-/core-cst-1.9.0-beta.100.tgz", + "integrity": "sha512-gXC7c81puzv12C3xJ6vhH/KIEc/P6ScuXsgmLlqFMpDv0SuoMg+42HgdyWi0WrccVwi8cdepsn5YhtCaYVn0nw==", + "license": "Apache-2.0", + "dependencies": { + "@cardano-sdk/core": "0.46.12", + "@cardano-sdk/crypto": "0.4.5", + "@cardano-sdk/input-selection": "0.14.28", + "@cardano-sdk/util": "0.17.1", + "@harmoniclabs/cbor": "1.6.0", + "@harmoniclabs/pair": "^1.0.0", + "@harmoniclabs/plutus-data": "1.2.6", + "@harmoniclabs/uplc": "1.4.1", + "@meshsdk/common": "1.9.0-beta.100", + "@types/base32-encoding": "^1.0.2", + "base32-encoding": "^1.0.0", + "bech32": "^2.0.0", + "blakejs": "^1.2.1", + "bn.js": "^5.2.0", + "hash.js": "^1.1.7", + "scalus": "^0.14.2" + } + }, + "node_modules/@meshsdk/react": { + "version": "1.9.0-beta-40", + "resolved": "https://registry.npmjs.org/@meshsdk/react/-/react-1.9.0-beta-40.tgz", + "integrity": "sha512-RsqI/dBpYDEg2uz3mYCuEgNJIAOm+1Bn/nJM+zlj66ujL349cLpmrTDF/ApGF9HHqjKF7NqesVimGqt6BNILQg==", + "license": "Apache-2.0", + "dependencies": { + "@fabianbormann/cardano-peer-connect": "^1.2.18", + "@meshsdk/common": "1.9.0-beta-40", + "@meshsdk/transaction": "1.9.0-beta-40", + "@meshsdk/wallet": "1.9.0-beta-40", + "@meshsdk/web3-sdk": "0.0.26", + "@radix-ui/react-dialog": "^1.1.2", + "@radix-ui/react-dropdown-menu": "^2.1.2", + "@radix-ui/react-icons": "^1.3.2", + "@radix-ui/react-label": "^2.1.1", + "@radix-ui/react-tooltip": "^1.1.4", + "class-variance-authority": "^0.7.1", + "tailwind-merge": "^2.6.0", + "tailwindcss-animate": "^1.0.7" + }, + "peerDependencies": { + "react": ">=16.0.0 <20.0.0 || >=16.0.0-rc <20.0.0-rc || >=19.0.0-rc", + "react-dom": ">=16.0.0 <20.0.0 || >=16.0.0-rc <20.0.0-rc || >=19.0.0-rc" + } + }, + "node_modules/@meshsdk/react/node_modules/@cardano-sdk/core": { + "version": "0.45.10", + "resolved": "https://registry.npmjs.org/@cardano-sdk/core/-/core-0.45.10.tgz", + "integrity": "sha512-PU/onQuPgsy0CtFKDlHcozGHMTHrigWztTmKq54tL0TdWRcClXbMh5Q63ALcP388ZouPC1nKomOAooVgyrrEfw==", + "license": "Apache-2.0", + "dependencies": { + "@biglup/is-cid": "^1.0.3", + "@cardano-ogmios/client": "6.9.0", + "@cardano-ogmios/schema": "6.9.0", + "@cardano-sdk/crypto": "~0.2.3", + "@cardano-sdk/util": "~0.16.0", + "@foxglove/crc": "^0.0.3", + "@scure/base": "^1.1.1", + "fraction.js": "4.0.1", + "ip-address": "^9.0.5", + "lodash": "^4.17.21", + "ts-custom-error": "^3.2.0", + "ts-log": "^2.2.4", + "web-encoding": "^1.1.5" + }, + "engines": { + "node": ">=16.20.2" + }, + "peerDependencies": { + "rxjs": "^7.4.0" + }, + "peerDependenciesMeta": { + "rxjs": { + "optional": true + } + } + }, + "node_modules/@meshsdk/react/node_modules/@cardano-sdk/core/node_modules/@cardano-sdk/util": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@cardano-sdk/util/-/util-0.16.0.tgz", + "integrity": "sha512-f0tfX8oiauqAFCyyc/o2Ouezyk83QD4zqLl4DUjZNyCtITL8gBHh25Bkw7RUCGEZ+hf6Qms1n0ui0j3wVY7zRg==", + "license": "Apache-2.0", + "dependencies": { + "bech32": "^2.0.0", + "lodash": "^4.17.21", + "serialize-error": "^8", + "ts-custom-error": "^3.2.0", + "ts-log": "^2.2.4", + "type-fest": "^2.19.0" + }, + "engines": { + "node": ">=16.20.2" + } + }, + "node_modules/@meshsdk/react/node_modules/@cardano-sdk/crypto": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@cardano-sdk/crypto/-/crypto-0.2.3.tgz", + "integrity": "sha512-jTl8rbocV1XO5DBR6+lGY6Owc/bP+wBg5eO3PttTeKhx/J7o99pyuTa5H36a/XTJwqDwKIXV922QxZR+rfjVbA==", + "license": "Apache-2.0", + "dependencies": { + "@cardano-sdk/util": "~0.16.0", + "blake2b": "^2.1.4", + "i": "^0.3.7", + "libsodium-wrappers-sumo": "^0.7.5", + "lodash": "^4.17.21", + "npm": "^9.3.0", + "pbkdf2": "^3.1.2", + "ts-custom-error": "^3.2.0", + "ts-log": "^2.2.4" + }, + "engines": { + "node": ">=16.20.2" + }, + "peerDependencies": { + "@dcspark/cardano-multiplatform-lib-asmjs": "^3.1.1", + "@dcspark/cardano-multiplatform-lib-browser": "^3.1.1", + "@dcspark/cardano-multiplatform-lib-nodejs": "^3.1.1" + }, + "peerDependenciesMeta": { + "@dcspark/cardano-multiplatform-lib-asmjs": { + "optional": true + }, + "@dcspark/cardano-multiplatform-lib-browser": { + "optional": true + }, + "@dcspark/cardano-multiplatform-lib-nodejs": { + "optional": true + } + } + }, + "node_modules/@meshsdk/react/node_modules/@cardano-sdk/crypto/node_modules/@cardano-sdk/util": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@cardano-sdk/util/-/util-0.16.0.tgz", + "integrity": "sha512-f0tfX8oiauqAFCyyc/o2Ouezyk83QD4zqLl4DUjZNyCtITL8gBHh25Bkw7RUCGEZ+hf6Qms1n0ui0j3wVY7zRg==", + "license": "Apache-2.0", + "dependencies": { + "bech32": "^2.0.0", + "lodash": "^4.17.21", + "serialize-error": "^8", + "ts-custom-error": "^3.2.0", + "ts-log": "^2.2.4", + "type-fest": "^2.19.0" + }, + "engines": { + "node": ">=16.20.2" + } + }, + "node_modules/@meshsdk/react/node_modules/@cardano-sdk/input-selection": { + "version": "0.13.34", + "resolved": "https://registry.npmjs.org/@cardano-sdk/input-selection/-/input-selection-0.13.34.tgz", + "integrity": "sha512-/AidYTF9WesLoMc4PHoETxXgrfYEq8GECcikjvLwx1mygmKpok4Lp41Aio7sBasUCLvZ82/yTd3uXIAvec1aCA==", + "license": "Apache-2.0", + "dependencies": { + "@cardano-sdk/core": "~0.43.0", + "@cardano-sdk/key-management": "~0.25.1", + "@cardano-sdk/util": "~0.15.5", + "bignumber.js": "^9.1.1", + "lodash": "^4.17.21", + "ts-custom-error": "^3.2.0" + }, + "engines": { + "node": ">=16.20.2" + } + }, + "node_modules/@meshsdk/react/node_modules/@cardano-sdk/input-selection/node_modules/@cardano-sdk/core": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@cardano-sdk/core/-/core-0.43.0.tgz", + "integrity": "sha512-hPnZXjObJub0eXV2dDAG2/gEg/vw092RZ1VGMZfBSqavz18Tg/K6jGQ3cOpWZ9d+MqFzZTCB+s5ctdRkYt3idA==", + "license": "Apache-2.0", + "dependencies": { + "@biglup/is-cid": "^1.0.3", + "@cardano-ogmios/client": "6.9.0", + "@cardano-ogmios/schema": "6.9.0", + "@cardano-sdk/crypto": "~0.1.32", + "@cardano-sdk/util": "~0.15.5", + "@foxglove/crc": "^0.0.3", + "@scure/base": "^1.1.1", + "fraction.js": "4.0.1", + "ip-address": "^9.0.5", + "lodash": "^4.17.21", + "ts-custom-error": "^3.2.0", + "ts-log": "^2.2.4", + "web-encoding": "^1.1.5" + }, + "engines": { + "node": ">=16.20.2" + }, + "peerDependencies": { + "rxjs": "^7.4.0" + }, + "peerDependenciesMeta": { + "rxjs": { + "optional": true + } + } + }, + "node_modules/@meshsdk/react/node_modules/@cardano-sdk/input-selection/node_modules/@cardano-sdk/crypto": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/@cardano-sdk/crypto/-/crypto-0.1.32.tgz", + "integrity": "sha512-RCKFvkzD32QpKQ0jULADVRNmfBNkCwiZl2nlFbkZ3aCrfIex+6/2CizoagJ161fA7lL5/HGuzWfjOg3GX2ax6w==", + "license": "Apache-2.0", + "dependencies": { + "@cardano-sdk/util": "~0.15.5", + "blake2b": "^2.1.4", + "i": "^0.3.7", + "libsodium-wrappers-sumo": "^0.7.5", + "lodash": "^4.17.21", + "npm": "^9.3.0", + "pbkdf2": "^3.1.2", + "ts-custom-error": "^3.2.0", + "ts-log": "^2.2.4" + }, + "engines": { + "node": ">=16.20.2" + }, + "peerDependencies": { + "@dcspark/cardano-multiplatform-lib-asmjs": "^3.1.1", + "@dcspark/cardano-multiplatform-lib-browser": "^3.1.1", + "@dcspark/cardano-multiplatform-lib-nodejs": "^3.1.1" + }, + "peerDependenciesMeta": { + "@dcspark/cardano-multiplatform-lib-asmjs": { + "optional": true + }, + "@dcspark/cardano-multiplatform-lib-browser": { + "optional": true + }, + "@dcspark/cardano-multiplatform-lib-nodejs": { + "optional": true + } + } + }, + "node_modules/@meshsdk/react/node_modules/@cardano-sdk/key-management": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@cardano-sdk/key-management/-/key-management-0.25.1.tgz", + "integrity": "sha512-D99XTIplI2aQnCZtVUKZdmH9wZJQC2WuZL6hTqGZHHFBAeju2zBzGWT21LlcPRlT0/2DP2/OdfIHoHCr2ORp4g==", + "license": "Apache-2.0", + "dependencies": { + "@cardano-sdk/core": "~0.43.0", + "@cardano-sdk/crypto": "~0.1.32", + "@cardano-sdk/dapp-connector": "~0.13.1", + "@cardano-sdk/util": "~0.15.5", + "@emurgo/cardano-message-signing-nodejs": "^1.0.1", + "bip39": "^3.0.4", + "chacha": "^2.1.0", + "get-random-values": "^2.0.0", + "lodash": "^4.17.21", + "pbkdf2": "^3.1.2", + "rxjs": "^7.4.0", + "ts-custom-error": "^3.2.0", + "ts-log": "^2.2.4" + }, + "engines": { + "node": ">=16.20.2" + } + }, + "node_modules/@meshsdk/react/node_modules/@cardano-sdk/key-management/node_modules/@cardano-sdk/core": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@cardano-sdk/core/-/core-0.43.0.tgz", + "integrity": "sha512-hPnZXjObJub0eXV2dDAG2/gEg/vw092RZ1VGMZfBSqavz18Tg/K6jGQ3cOpWZ9d+MqFzZTCB+s5ctdRkYt3idA==", + "license": "Apache-2.0", + "dependencies": { + "@biglup/is-cid": "^1.0.3", + "@cardano-ogmios/client": "6.9.0", + "@cardano-ogmios/schema": "6.9.0", + "@cardano-sdk/crypto": "~0.1.32", + "@cardano-sdk/util": "~0.15.5", + "@foxglove/crc": "^0.0.3", + "@scure/base": "^1.1.1", + "fraction.js": "4.0.1", + "ip-address": "^9.0.5", + "lodash": "^4.17.21", + "ts-custom-error": "^3.2.0", + "ts-log": "^2.2.4", + "web-encoding": "^1.1.5" + }, + "engines": { + "node": ">=16.20.2" + }, + "peerDependencies": { + "rxjs": "^7.4.0" + }, + "peerDependenciesMeta": { + "rxjs": { + "optional": true + } + } + }, + "node_modules/@meshsdk/react/node_modules/@cardano-sdk/key-management/node_modules/@cardano-sdk/crypto": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/@cardano-sdk/crypto/-/crypto-0.1.32.tgz", + "integrity": "sha512-RCKFvkzD32QpKQ0jULADVRNmfBNkCwiZl2nlFbkZ3aCrfIex+6/2CizoagJ161fA7lL5/HGuzWfjOg3GX2ax6w==", + "license": "Apache-2.0", + "dependencies": { + "@cardano-sdk/util": "~0.15.5", + "blake2b": "^2.1.4", + "i": "^0.3.7", + "libsodium-wrappers-sumo": "^0.7.5", + "lodash": "^4.17.21", + "npm": "^9.3.0", + "pbkdf2": "^3.1.2", + "ts-custom-error": "^3.2.0", + "ts-log": "^2.2.4" + }, + "engines": { + "node": ">=16.20.2" + }, + "peerDependencies": { + "@dcspark/cardano-multiplatform-lib-asmjs": "^3.1.1", + "@dcspark/cardano-multiplatform-lib-browser": "^3.1.1", + "@dcspark/cardano-multiplatform-lib-nodejs": "^3.1.1" + }, + "peerDependenciesMeta": { + "@dcspark/cardano-multiplatform-lib-asmjs": { + "optional": true + }, + "@dcspark/cardano-multiplatform-lib-browser": { + "optional": true + }, + "@dcspark/cardano-multiplatform-lib-nodejs": { + "optional": true + } + } + }, + "node_modules/@meshsdk/react/node_modules/@cardano-sdk/util": { + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/@cardano-sdk/util/-/util-0.15.7.tgz", + "integrity": "sha512-L0f3gXFujRwSSpjzq2W/OwW23fg0gw5S+9R+91He3LgmyfjNygd939eFPCLhwOscsHcJ4AN27UJSYnx3JMKZ0w==", + "license": "Apache-2.0", + "dependencies": { + "bech32": "^2.0.0", + "lodash": "^4.17.21", + "serialize-error": "^8", + "ts-custom-error": "^3.2.0", + "ts-log": "^2.2.4", + "type-fest": "^2.19.0" + }, + "engines": { + "node": ">=16.20.2" + } + }, + "node_modules/@meshsdk/react/node_modules/@harmoniclabs/cbor": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@harmoniclabs/cbor/-/cbor-1.3.0.tgz", + "integrity": "sha512-gzRqqcJL8sulc2/6iqRXZdWUCEeK3A+jwJ88sbVNzgk4IeMFQLSFg4Ck8ZBETu/W/q1zdknjNfJYyH1OxVriQA==", + "deprecated": "update to 1.6.0", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@harmoniclabs/bytestring": "^1.0.0", + "@harmoniclabs/obj-utils": "^1.0.0", + "@harmoniclabs/uint8array-utils": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/HarmonicLabs" + } + }, + "node_modules/@meshsdk/react/node_modules/@harmoniclabs/crypto": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@harmoniclabs/crypto/-/crypto-0.2.5.tgz", + "integrity": "sha512-t2saWMFWBx8tOHotiYTTfQKhPGpWT4AMLXxq3u0apShVXNV0vgL0gEgSMudBjES/wrKByCqa2xmU70gadz26hA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@harmoniclabs/bitstream": "^1.0.0", + "@harmoniclabs/uint8array-utils": "^1.0.3" + } + }, + "node_modules/@meshsdk/react/node_modules/@harmoniclabs/plutus-data": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@harmoniclabs/plutus-data/-/plutus-data-1.2.4.tgz", + "integrity": "sha512-cpr6AnJRultH6PJRDriewHEgNLQs2IGLampZrLjmK5shzTsHICD0yD0Zig9eKdcS7dmY6mlzvSpAJWPGeTxbCA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@harmoniclabs/biguint": "^1.0.0", + "@harmoniclabs/crypto": "^0.2.4", + "@harmoniclabs/uint8array-utils": "^1.0.0" + }, + "peerDependencies": { + "@harmoniclabs/bytestring": "^1.0.0", + "@harmoniclabs/cbor": "^1.3.0" + } + }, + "node_modules/@meshsdk/react/node_modules/@harmoniclabs/uplc": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@harmoniclabs/uplc/-/uplc-1.2.4.tgz", + "integrity": "sha512-Px6utj94cO/hQd9NJgVQI8zycsbgh3rAzDeLdZ1m52bo++EuU1GL+arWX3JYso3/3uNrnUFuizjrAIISwQe3Fg==", + "license": "Apache-2.0", + "dependencies": { + "@harmoniclabs/bigint-utils": "^1.0.0", + "@harmoniclabs/bitstream": "^1.0.0", + "@harmoniclabs/uint8array-utils": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/HarmonicLabs" + }, + "peerDependencies": { + "@harmoniclabs/bytestring": "^1.0.0", + "@harmoniclabs/cbor": "^1.3.0", + "@harmoniclabs/crypto": "^0.2.4", + "@harmoniclabs/pair": "^1.0.0", + "@harmoniclabs/plutus-data": "^1.2.4" + } + }, + "node_modules/@meshsdk/react/node_modules/@meshsdk/common": { + "version": "1.9.0-beta-40", + "resolved": "https://registry.npmjs.org/@meshsdk/common/-/common-1.9.0-beta-40.tgz", + "integrity": "sha512-owMpLDCJAIY5SFcvrh5uIBd7EPKl7vfxLuPFv9ZA/QcbT7YvbzBD/f6H+2ZgCHnNkuHFqoqBPoC+DQEzjeyagQ==", + "license": "Apache-2.0", + "dependencies": { + "bech32": "^2.0.0", + "bip39": "3.1.0", + "blake2b": "^2.1.4", + "blakejs": "^1.2.1" + } + }, + "node_modules/@meshsdk/react/node_modules/@meshsdk/core-cst": { + "version": "1.9.0-beta-40", + "resolved": "https://registry.npmjs.org/@meshsdk/core-cst/-/core-cst-1.9.0-beta-40.tgz", + "integrity": "sha512-fP71MGGZ3u99nCYn1+cil7oMhYGTPYN6jbwmuJXTyxrSJe7xA6jBb13WBl4VRm+wII/ME9topxx9BirhQO6bGA==", + "license": "Apache-2.0", + "dependencies": { + "@cardano-sdk/core": "^0.45.5", + "@cardano-sdk/crypto": "^0.2.2", + "@cardano-sdk/input-selection": "^0.13.33", + "@cardano-sdk/util": "^0.15.5", + "@harmoniclabs/cbor": "1.3.0", + "@harmoniclabs/pair": "^1.0.0", + "@harmoniclabs/plutus-data": "1.2.4", + "@harmoniclabs/uplc": "1.2.4", + "@meshsdk/common": "1.9.0-beta-40", + "@types/base32-encoding": "^1.0.2", + "base32-encoding": "^1.0.0", + "bech32": "^2.0.0", + "blakejs": "^1.2.1", + "bn.js": "^5.2.0" + } + }, + "node_modules/@meshsdk/react/node_modules/@meshsdk/transaction": { + "version": "1.9.0-beta-40", + "resolved": "https://registry.npmjs.org/@meshsdk/transaction/-/transaction-1.9.0-beta-40.tgz", + "integrity": "sha512-AP68D1op0MTnuagh7Ti6eqizLuN6m2FVGWuLRdZcdWRwGfWnIxctKENgPkd7QcTgtTfsHrce80GsIw6wy+KHPQ==", + "license": "Apache-2.0", + "dependencies": { + "@cardano-sdk/core": "^0.45.5", + "@cardano-sdk/input-selection": "^0.13.33", + "@cardano-sdk/util": "^0.15.5", + "@meshsdk/common": "1.9.0-beta-40", + "@meshsdk/core-cst": "1.9.0-beta-40", + "json-bigint": "^1.0.0" + } + }, + "node_modules/@meshsdk/react/node_modules/@meshsdk/wallet": { + "version": "1.9.0-beta-40", + "resolved": "https://registry.npmjs.org/@meshsdk/wallet/-/wallet-1.9.0-beta-40.tgz", + "integrity": "sha512-MEMQEbbC5Ej++VrLt1Gf3nzmtnRieI6NJ/EgoWEmBvMlgj6g5OdDF3DkWJDOSAx38OJCnKnZQ/DN7W3zDmmaGA==", + "license": "Apache-2.0", + "dependencies": { + "@meshsdk/common": "1.9.0-beta-40", + "@meshsdk/core-cst": "1.9.0-beta-40", + "@meshsdk/transaction": "1.9.0-beta-40", + "@simplewebauthn/browser": "^13.0.0" + } + }, + "node_modules/@meshsdk/react/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@meshsdk/transaction": { + "version": "1.9.0-beta.101", + "resolved": "https://registry.npmjs.org/@meshsdk/transaction/-/transaction-1.9.0-beta.101.tgz", + "integrity": "sha512-kjJ1zQgy3sVCNPwpcvpSrpQ2bA6AIz6sDJiPBgBSZqSzBp2qfto3ERIwXQ6eu7vvFzqnnDWcj/QSJB5O7FWqww==", + "license": "Apache-2.0", + "dependencies": { + "@cardano-sdk/core": "0.46.12", + "@cardano-sdk/input-selection": "0.14.28", + "@cardano-sdk/util": "0.17.1", + "@meshsdk/common": "1.9.0-beta.101", + "@meshsdk/core-cst": "1.9.0-beta.101", + "json-bigint": "^1.0.0" + } + }, + "node_modules/@meshsdk/wallet": { + "version": "1.9.0-beta.101", + "resolved": "https://registry.npmjs.org/@meshsdk/wallet/-/wallet-1.9.0-beta.101.tgz", + "integrity": "sha512-HAG8gyZY7HQJ66sPj6Id/ojhqbuGYe7xRj0Qu9z3iAXE9pq9h2FvSjCCxiclKEwyRot9Gk/+wMZTJCqSen0luw==", + "license": "Apache-2.0", + "dependencies": { + "@meshsdk/common": "1.9.0-beta.101", + "@meshsdk/core-cst": "1.9.0-beta.101", + "@meshsdk/transaction": "1.9.0-beta.101", + "@simplewebauthn/browser": "^13.0.0" + } + }, + "node_modules/@meshsdk/web3-sdk": { + "version": "0.0.26", + "resolved": "https://registry.npmjs.org/@meshsdk/web3-sdk/-/web3-sdk-0.0.26.tgz", + "integrity": "sha512-HCEOXYeeE569S1T4nILhu9E00an8ya+jtrn5t85NIWYwNxmMhoqjSrxfx5tfEXSN1g2SukuDqViAUZPLuwQjHg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "Apache-2.0", + "dependencies": { + "@meshsdk/common": "^1.9.0-beta.35", + "@meshsdk/core-cst": "^1.9.0-beta.35", + "@meshsdk/wallet": "^1.9.0-beta.35", + "@peculiar/webcrypto": "^1.5.0", + "axios": "^1.8.3", + "base32-encoding": "^1.0.0", + "uuid": "^11.1.0" + } + }, + "node_modules/@multiformats/dns": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.13.tgz", + "integrity": "sha512-yr4bxtA3MbvJ+2461kYIYMsiiZj/FIqKI64hE4SdvWJUdWF9EtZLar38juf20Sf5tguXKFUruluswAO6JsjS2w==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@dnsquery/dns-packet": "^6.1.1", + "@libp2p/interface": "^3.1.0", + "hashlru": "^2.3.0", + "p-queue": "^9.0.0", + "progress-events": "^1.0.0", + "uint8arrays": "^5.0.2" + } + }, + "node_modules/@multiformats/mafmt": { + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@multiformats/mafmt/-/mafmt-12.1.6.tgz", + "integrity": "sha512-tlJRfL21X+AKn9b5i5VnaTD6bNttpSpcqwKVmDmSHLwxoz97fAHaepqFOk/l1fIu94nImIXneNbhsJx/RQNIww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@multiformats/multiaddr": "^12.0.0" + } + }, + "node_modules/@multiformats/multiaddr": { + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.5.1.tgz", + "integrity": "sha512-+DDlr9LIRUS8KncI1TX/FfUn8F2dl6BIxJgshS/yFQCNB5IAF0OGzcwB39g5NLE22s4qqDePv0Qof6HdpJ/4aQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "@chainsafe/netmask": "^2.0.0", + "@multiformats/dns": "^1.0.3", + "abort-error": "^1.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next/env": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.0.3.tgz", + "integrity": "sha512-t9Xy32pjNOvVn2AS+Utt6VmyrshbpfUMhIjFO60gI58deSo/KgLOp31XZ4O+kY/Is8WAGYwA5gR7kOb1eORDBA==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.0.3.tgz", + "integrity": "sha512-3Ln/nHq2V+v8uIaxCR6YfYo7ceRgZNXfTd3yW1ukTaFbO+/I8jNakrjYWODvG9BuR2v5kgVtH/C8r0i11quOgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.0.3.tgz", + "integrity": "sha512-s3Q/NOorCsLYdCKvQlWU+a+GeAd3C8Rb3L1YnetsgwXzhc3UTWrtQpB/3eCjFOdGUj5QmXfRak12uocd1ZiiQw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.0.3.tgz", + "integrity": "sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.0.3.tgz", + "integrity": "sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.0.3.tgz", + "integrity": "sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.0.3.tgz", + "integrity": "sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.0.3.tgz", + "integrity": "sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.0.3.tgz", + "integrity": "sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.0.3.tgz", + "integrity": "sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "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", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "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", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", + "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", + "license": "MIT", + "dependencies": { + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz", + "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2", + "webcrypto-core": "^1.8.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "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-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "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-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "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-icons": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.2.tgz", + "integrity": "sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==", + "license": "MIT", + "peerDependencies": { + "react": "^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz", + "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "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", + "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 + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "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-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "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-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "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-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "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-tooltip": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "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-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "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", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.16.1.tgz", + "integrity": "sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rvagg/ripemd160": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@rvagg/ripemd160/-/ripemd160-2.2.4.tgz", + "integrity": "sha512-ejuJhx9Q+hfOy/4w86E+obE4OAzTVcDh6QNc0v/0IG9hHvegqzwLeltNJSarzkXvIIZfgh63a/EZhpA25VoJLg==", + "license": "MIT" + }, + "node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@silentbot1/nat-api": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@silentbot1/nat-api/-/nat-api-0.4.9.tgz", + "integrity": "sha512-Bm2Fr0sJyGr4B/XgKjQxjGe7Rzs/OlK91OIHsghObxhP3Y4j2y8o7Xjlledu/pxzFEIWaTbZIBSl8ABqoP/WhQ==", + "license": "MIT", + "dependencies": { + "chrome-dgram": "^3.0.6", + "cross-fetch-ponyfill": "^1.0.3", + "debug": "^4.4.0", + "default-gateway": "^7.2.2", + "unordered-array-remove": "^1.0.2", + "xml2js": "^0.6.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@simplewebauthn/browser": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@simplewebauthn/browser/-/browser-13.3.0.tgz", + "integrity": "sha512-BE/UWv6FOToAdVk0EokzkqQQDOWtNydYlY6+OrmiZ5SCNmb41VehttboTetUM3T/fr6EAFYVXjz4My2wg230rQ==", + "license": "MIT" + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", + "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@thaunknown/simple-peer": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@thaunknown/simple-peer/-/simple-peer-10.1.0.tgz", + "integrity": "sha512-xNM49v0rBbjIKrS9XNwXW3FFuGvsPGadFRWbBdLAY87pEJeo7V0dxyX6GBHP8UVlefffRedCLsjYXb6i8W9Ofg==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "err-code": "^3.0.1", + "streamx": "^2.23.0", + "uint8-util": "^2.2.6", + "webrtc-polyfill": "^1.2.0" + } + }, + "node_modules/@thaunknown/simple-peer/node_modules/streamx": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/@thaunknown/simple-websocket": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@thaunknown/simple-websocket/-/simple-websocket-9.1.3.tgz", + "integrity": "sha512-pf/FCJsgWtLJiJmIpiSI7acOZVq3bIQCpnNo222UFc8Ph1lOUOTpe6LoYhhiOSKB9GUaWJEVUtZ+sK1/aBgU5Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "queue-microtask": "^1.2.3", + "streamx": "^2.17.0", + "uint8-util": "^2.2.5", + "ws": "^8.17.1" + } + }, + "node_modules/@thaunknown/simple-websocket/node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "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/@thaunknown/thirty-two": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@thaunknown/thirty-two/-/thirty-two-1.0.5.tgz", + "integrity": "sha512-Q53KyCXweV1CS62EfqtPDqfpksn5keQ59PGqzzkK+g8Vif1jB4inoBCcs/BUSdsqddhE3G+2Fn+4RX3S6RqT0A==", + "license": "MIT", + "dependencies": { + "uint8-util": "^2.2.5" + }, + "engines": { + "node": ">=0.2.6" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/base32-encoding": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/base32-encoding/-/base32-encoding-1.0.2.tgz", + "integrity": "sha512-6kXiZ8gETqBU/B9ddcw15nwacX4iX9mLZTU0kghWK5u+OdjfJg6vxHh/vXoURWTyLSzs2jKgcq1lS3S/Tvl4mw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/json-bigint/-/json-bigint-1.0.4.tgz", + "integrity": "sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag==", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", + "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "devOptional": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.1.tgz", + "integrity": "sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/type-utils": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.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.57.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.1.tgz", + "integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.1.tgz", + "integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.57.1", + "@typescript-eslint/types": "^8.57.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.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz", + "integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.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.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz", + "integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==", + "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.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.1.tgz", + "integrity": "sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/utils": "8.57.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz", + "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==", + "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.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz", + "integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.1", + "@typescript-eslint/tsconfig-utils": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "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/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "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/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.1.tgz", + "integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz", + "integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@utxorpc/sdk": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@utxorpc/sdk/-/sdk-0.6.8.tgz", + "integrity": "sha512-Mff6q2o7R2aam85KmjtAZDKPhJesMmnGFbk2M54lPO0FwrrWRfUf6DYezqWfYcjXgKQSHDuklAcdtF0weEENRA==", + "license": "MIT", + "dependencies": { + "@connectrpc/connect": "1.4", + "@connectrpc/connect-node": "1.4", + "@connectrpc/connect-web": "1.4", + "@utxorpc/spec": "0.16.0", + "buffer": "^6.0.3" + } + }, + "node_modules/@utxorpc/spec": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@utxorpc/spec/-/spec-0.16.0.tgz", + "integrity": "sha512-EK2M0TBp14MrRCYDuFeJ+bAS39RxxLLh+CD08h/YvAgxSv/4ZOBCf1/sxHAGCBGGndB4heZYFeuQ+i1i8vP5lw==", + "license": "MIT", + "dependencies": { + "@bufbuild/protobuf": "^1.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@webpod/ip": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@webpod/ip/-/ip-0.6.1.tgz", + "integrity": "sha512-0oPIqLPfoIPzstsbmWUFlLx9I8KiisiC9/+YQPaotVU67DnTV+vx/zXXnkMgZTKu9rHWznmUQX3jgvfqr1t4+g==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@webtorrent/http-node": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@webtorrent/http-node/-/http-node-1.3.0.tgz", + "integrity": "sha512-GWZQKroPES4z91Ijx6zsOsb7+USOxjy66s8AoTWg0HiBBdfnbtf9aeh3Uav0MgYn4BL8Q7tVSUpd0gGpngKGEQ==", + "license": "MIT", + "dependencies": { + "freelist": "^1.0.3", + "http-parser-js": "^0.4.3" + } + }, + "node_modules/@zxing/text-encoding": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", + "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", + "license": "(Unlicense OR Apache-2.0)", + "optional": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abort-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/abort-error/-/abort-error-1.0.1.tgz", + "integrity": "sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/addr-to-ip-port": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/addr-to-ip-port/-/addr-to-ip-port-2.0.0.tgz", + "integrity": "sha512-9bYbtjamtdLHZSqVIUXhilOryNPiL+x+Q5J/Unpg4VY3ZIkK3fT52UoErj1NdUeVm3J1t2iBEAur4Ywbl/bahw==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "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/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "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", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "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.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "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", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "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", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "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", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "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", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "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", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "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/asn1js": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", + "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "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==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/bare-addon-resolve": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/bare-addon-resolve/-/bare-addon-resolve-1.10.0.tgz", + "integrity": "sha512-sSd0jieRJlDaODOzj0oe0RjFVC1QI0ZIjGIdPkbrTXsdVVtENg14c+lHHAhHwmWCZ2nQlMhy8jA3Y5LYPc/isA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-module-resolve": "^1.10.0", + "bare-semver": "^1.0.0" + }, + "peerDependencies": { + "bare-url": "*" + }, + "peerDependenciesMeta": { + "bare-url": { + "optional": true + } + } + }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "license": "Apache-2.0", + "peer": true, + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.6.tgz", + "integrity": "sha512-1QovqDrR80Pmt5HPAsMsXTCFcDYr+NSUKW6nd6WO5v0JBmnItc/irNRzm2KOQ5oZ69P37y+AMujNyNtG+1Rggw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-module-resolve": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/bare-module-resolve/-/bare-module-resolve-1.12.1.tgz", + "integrity": "sha512-hbmAPyFpEq8FoZMd5sFO3u6MC5feluWoGE8YKlA8fCrl6mNtx68Wjg4DTiDJcqRJaovTvOYKfYngoBUnbaT7eg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-semver": "^1.0.0" + }, + "peerDependencies": { + "bare-url": "*" + }, + "peerDependenciesMeta": { + "bare-url": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.0.tgz", + "integrity": "sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==", + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-semver": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bare-semver/-/bare-semver-1.0.2.tgz", + "integrity": "sha512-ESVaN2nzWhcI5tf3Zzcq9aqCZ676VWzqw07eEZ0qxAcEOAFYBa0pWq8sK34OQeHLY3JsfKXZS9mDyzyxGjeLzA==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-stream": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.10.0.tgz", + "integrity": "sha512-DOPZF/DDcDruKDA43cOw6e9Quq5daua7ygcAwJE/pKJsRWhgSSemi7qVNGE5kyDIxIeN1533G/zfbvWX7Wcb9w==", + "license": "Apache-2.0", + "dependencies": { + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-stream/node_modules/streamx": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/bare-url": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz", + "integrity": "sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/base32-encoding": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base32-encoding/-/base32-encoding-1.0.0.tgz", + "integrity": "sha512-k1gA7f00ODLY7YtuEQFz0Kn3huTCmL/JW+oQtw51ID+zxs5chj/YQ1bXN+Q0JsqiKB2Yn0oA0AA8uipFYgpagQ==", + "license": "ISC" + }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz", + "integrity": "sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", + "license": "MIT" + }, + "node_modules/bencode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bencode/-/bencode-4.0.0.tgz", + "integrity": "sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==", + "license": "MIT", + "dependencies": { + "uint8-util": "^2.2.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/bep53-range": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bep53-range/-/bep53-range-2.0.0.tgz", + "integrity": "sha512-sMm2sV5PRs0YOVk0LTKtjuIprVzxgTQUsrGX/7Yph2Rm4FO2Fqqtq7hNjsOB5xezM4v4+5rljCgK++UeQJZguA==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "license": "ISC", + "dependencies": { + "@noble/hashes": "^1.2.0" + } + }, + "node_modules/bitfield": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/bitfield/-/bitfield-4.2.0.tgz", + "integrity": "sha512-kUTatQb/mBd8uhvdLrUkouGDBUQiJaIOvPlptUwOWp6MFqih4d1MiVf0m3ATxfZSzu+LjW/awFeABltYa62uIA==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/bittorrent-dht": { + "version": "11.0.11", + "resolved": "https://registry.npmjs.org/bittorrent-dht/-/bittorrent-dht-11.0.11.tgz", + "integrity": "sha512-5rWMoK/2XjcPSx9nfqiL6mHxsXLwohX+81aL4a3qUyGU1992mBqARQE/evZ+a6eWb5DeRjeDU+qFZm11rmPZnQ==", + "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": { + "bencode": "^4.0.0", + "debug": "^4.4.3", + "k-bucket": "^5.1.0", + "k-rpc": "^5.1.0", + "last-one-wins": "^1.0.4", + "lru": "^3.1.0", + "randombytes": "^2.1.0", + "record-cache": "^1.2.0" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/bittorrent-lsd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bittorrent-lsd/-/bittorrent-lsd-2.0.0.tgz", + "integrity": "sha512-jV+SMTGNY1iGWjf5cPA2HMeA6axuMQRWwWELtsuZ1FmQmZwC74we92nwtDTfv1WMnLx+oqEjWRri42IHjZitSQ==", + "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": { + "chrome-dgram": "^3.0.6", + "debug": "^4.2.0" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/bittorrent-peerid": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/bittorrent-peerid/-/bittorrent-peerid-1.3.6.tgz", + "integrity": "sha512-VyLcUjVMEOdSpHaCG/7odvCdLbAB1y3l9A2V6WIje24uV7FkJPrQrH/RrlFmKxP89pFVDEnE+YlHaFujlFIZsg==", + "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/bittorrent-protocol": { + "version": "4.1.21", + "resolved": "https://registry.npmjs.org/bittorrent-protocol/-/bittorrent-protocol-4.1.21.tgz", + "integrity": "sha512-CcuPt6BL7gXa8BF+0GckYcQmr44ARfSPM0rYwMeYgWg+jftekWgy5vuxX6wJDpC5bKFvqNG+74bPBjyM7Swxrw==", + "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": { + "bencode": "^4.0.0", + "bitfield": "^4.2.0", + "debug": "^4.4.3", + "rc4": "^0.1.5", + "streamx": "^2.22.1", + "throughput": "^1.0.2", + "uint8-util": "^2.2.5", + "unordered-array-remove": "^1.0.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/bittorrent-tracker": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/bittorrent-tracker/-/bittorrent-tracker-11.2.2.tgz", + "integrity": "sha512-pVjpd6tPtLByrYwtDOo+cVx9zQZ2XUvlaWrlm57+9yvVDKHuNL+TFEAtyfXuIutghG7Bde/uWXGfoVWpPYY+8A==", + "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": { + "@thaunknown/simple-peer": "^10.0.8", + "@thaunknown/simple-websocket": "^9.1.3", + "bencode": "^4.0.0", + "bittorrent-peerid": "^1.3.6", + "chrome-dgram": "^3.0.6", + "compact2string": "^1.4.1", + "cross-fetch-ponyfill": "^1.0.3", + "debug": "^4.3.4", + "ip": "^2.0.1", + "lru": "^3.1.0", + "minimist": "^1.2.8", + "once": "^1.4.0", + "queue-microtask": "^1.2.3", + "random-iterate": "^1.0.1", + "run-parallel": "^1.2.0", + "run-series": "^1.1.9", + "socks": "^2.8.3", + "string2compact": "^2.0.1", + "uint8-util": "^2.2.5", + "unordered-array-remove": "^1.0.2", + "ws": "^8.17.0" + }, + "bin": { + "bittorrent-tracker": "bin/cmd.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "bufferutil": "^4.0.8", + "utf-8-validate": "^6.0.4" + } + }, + "node_modules/bittorrent-tracker/node_modules/utf-8-validate": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-6.0.6.tgz", + "integrity": "sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/bittorrent-tracker/node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "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/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/blake2b": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", + "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", + "license": "ISC", + "dependencies": { + "blake2b-wasm": "^2.4.0", + "nanoassert": "^2.0.0" + } + }, + "node_modules/blake2b-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", + "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", + "license": "MIT", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/blake2b-wasm/node_modules/b4a": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "license": "MIT" + }, + "node_modules/block-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/block-iterator/-/block-iterator-1.1.2.tgz", + "integrity": "sha512-yAHUP44v2K25xLPdrgVTgwtuQctlullzjczu9CoUZom5AP3g4p1R1+aWHjS1GHG9JtcSUVUnbEPiuXiW5YZ24w==", + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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", + "peer": true, + "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": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, + "node_modules/bs58check": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-4.0.0.tgz", + "integrity": "sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.2.0", + "bs58": "^6.0.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/bufferutil": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", + "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/cache-chunk-store": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/cache-chunk-store/-/cache-chunk-store-3.2.2.tgz", + "integrity": "sha512-2lJdWbgHFFxcSth9s2wpId3CR3v1YC63KjP4T9WhpW7LWlY7Hiiei3QwwqzkWqlJTfR8lSy9F5kRQECeyj+yQA==", + "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": { + "lru": "^3.1.0", + "queue-microtask": "^1.2.3" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "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", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "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", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "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/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001780", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", + "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", + "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/cbor": { + "version": "10.0.12", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-10.0.12.tgz", + "integrity": "sha512-exQDevYd7ZQLP4moMQcZkKCVZsXLAtUSflObr3xTh4xzFIv/xBCdvCd6L259kQOUP2kcTC0jvC6PpZIf/WmRXA==", + "license": "MIT", + "dependencies": { + "nofilter": "^3.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/chacha": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chacha/-/chacha-2.1.0.tgz", + "integrity": "sha512-FhVtqaZOiHlOKUkAWfDlJ+oe/O8iPQbCC0pFXJqphr4YQBCZPXa8Mv3j35+W4eWFWCoTUcW2u5IWDDkknygvVA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^1.0.33" + }, + "optionalDependencies": { + "chacha-native": "^2.0.0" + } + }, + "node_modules/chacha-native": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chacha-native/-/chacha-native-2.0.3.tgz", + "integrity": "sha512-93h+osfjhR2sMHAaapTLlL/COoBPEZ6upicPBQ4GfUyadoMb8t9/M0PKK8kC+F+DEA/Oy3Kg9w3HzY3J1foP3g==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "bindings": "^1.2.1", + "inherits": "^2.0.1", + "nan": "^2.4.0" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "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", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/chrome-dgram": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/chrome-dgram/-/chrome-dgram-3.0.6.tgz", + "integrity": "sha512-bqBsUuaOiXiqxXt/zA/jukNJJ4oaOtc7ciwqJpZVEaaXwwxqgI2/ZdG02vXYWUhHGziDlvGMQWk0qObgJwVYKA==", + "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": { + "inherits": "^2.0.4", + "run-series": "^1.1.9" + } + }, + "node_modules/chrome-dns": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chrome-dns/-/chrome-dns-1.0.1.tgz", + "integrity": "sha512-HqsYJgIc8ljJJOqOzLphjAs79EUuWSX3nzZi2LNkzlw3GIzAeZbaSektC8iT/tKvLqZq8yl1GJu5o6doA4TRbg==", + "license": "MIT", + "dependencies": { + "chrome-net": "^3.3.2" + } + }, + "node_modules/chrome-net": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/chrome-net/-/chrome-net-3.3.4.tgz", + "integrity": "sha512-Jzy2EnzmE+ligqIZUsmWnck9RBXLuUy6CaKyuNMtowFG3ZvLt8d+WBJCTPEludV0DHpIKjAOlwjFmTaEdfdWCw==", + "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": { + "inherits": "^2.0.1" + } + }, + "node_modules/chunk-store-iterator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chunk-store-iterator/-/chunk-store-iterator-1.0.4.tgz", + "integrity": "sha512-LGjzJNmk7W1mrdaBoJNztPumT2ACmgjHmI1AMm8aeGYOl4+LKaYC/yfnx27i++LiAtoe/dR+3jC8HRzb6gW4/A==", + "license": "MIT", + "dependencies": { + "block-iterator": "^1.1.1" + } + }, + "node_modules/cipher-base": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", + "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", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compact2string": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/compact2string/-/compact2string-1.4.1.tgz", + "integrity": "sha512-3D+EY5nsRhqnOwDxveBv5T8wGo4DEvYxjDtPGmdOX+gfr5gE92c2RC0w2wa+xEefm07QuVqqcF3nZJUZ92l/og==", + "license": "BSD", + "dependencies": { + "ipaddr.js": ">= 0.1.5" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cpus": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cpus/-/cpus-1.0.3.tgz", + "integrity": "sha512-PXHBvGLuL69u55IkLa5e5838fLhIMHxmkV4ge42a8alGyn7BtawYgI0hQ849EedvtHIOLNNH3i6eQU1BiE9SUA==", + "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/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "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", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "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/create-torrent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/create-torrent/-/create-torrent-6.1.0.tgz", + "integrity": "sha512-War593HCsg4TotHgMGWTJqnDHN0pmEU2RM13xUzzSZ78TpRNOC2bbcsC5yMO3pqIkedHEWFzYNqH1yhwuuBYTg==", + "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": { + "bencode": "^4.0.0", + "block-iterator": "^1.1.1", + "fast-readable-async-iterator": "^2.0.0", + "is-file": "^1.0.0", + "join-async-iterator": "^1.1.1", + "junk": "^4.0.1", + "minimist": "^1.2.8", + "once": "^1.4.0", + "piece-length": "^2.0.1", + "queue-microtask": "^1.2.3", + "run-parallel": "^1.2.0", + "uint8-util": "^2.2.5" + }, + "bin": { + "create-torrent": "bin/cmd.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-fetch-ponyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cross-fetch-ponyfill/-/cross-fetch-ponyfill-1.0.3.tgz", + "integrity": "sha512-uOBkDhUAGAbx/FEzNKkOfx3w57H8xReBBXoZvUnOKTI0FW0Xvrj3GrYv2iZXUqlffC1LMGfQzhmBM/ke+6eTDA==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "node-fetch": "^3.3.0" + } + }, + "node_modules/cross-fetch-ponyfill/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "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", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "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", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "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/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/default-gateway": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-7.2.2.tgz", + "integrity": "sha512-AD7TrdNNPXRZIGw63dw+lnGmT4v7ggZC5NHNJgAYWm5njrwoze1q5JSAW9YuLy2tjnoLUG/r8FEB93MCh9QJPg==", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^7.1.1" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/define-data-property": { + "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==", + "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", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "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/electron-to-chromium": { + "version": "1.5.321", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", + "integrity": "sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", + "license": "MIT" + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "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", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.1.tgz", + "integrity": "sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==", + "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", + "math-intrinsics": "^1.1.0", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "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", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "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/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.0.3.tgz", + "integrity": "sha512-IGP2DdQQrgjcr4mwFPve4DrCqo7CVVez1WoYY47XwKSrYO4hC0Dlb+iJA60i0YfICOzgNADIb8r28BpQ5Zs0wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "15.0.3", + "@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.35.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-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "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", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "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", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "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", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "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", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "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-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "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", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "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/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.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/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "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/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "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", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-readable-async-iterator": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-readable-async-iterator/-/fast-readable-async-iterator-2.0.0.tgz", + "integrity": "sha512-8Sld+DuyWRIftl86ZguJxR2oXCBccOiJxrY/Rj9/7ZBynW8pYMWzIcqxFL1da+25jaWJZVa+HHX/8SsA21JdTA==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "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==", + "license": "MIT", + "optional": true + }, + "node_modules/filename-reserved-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", + "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "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": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "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", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "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/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fraction.js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.1.tgz", + "integrity": "sha512-NQYzZw8MUsxSZFQo6E8tKOlmSd/BlDTNOR4puXFSHSwFwNaIlmbortQy5PDN/KnVQ4xWG2NtN0J0hjPw7eE06A==", + "license": "MIT OR GPL-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/freelist": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/freelist/-/freelist-1.0.3.tgz", + "integrity": "sha512-Ji7fEnMdZDGbS5oXElpRJsn9jPvBR8h/037D3bzreNmS8809cISq/2D9//JbA/TaZmkkN8cmecXwmQHmM+NHhg==", + "license": "MIT" + }, + "node_modules/fs-chunk-store": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-chunk-store/-/fs-chunk-store-5.0.0.tgz", + "integrity": "sha512-tKlT0joU9KmsLn0dTbVYVUa7VNqYQhl0X2qPPsN9lPEc3guXOmQJWY5/7kpo34Sk273qyWT5mqEhROCQPF+JKw==", + "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": { + "filename-reserved-regex": "^3.0.0", + "queue-microtask": "^1.2.2", + "random-access-file": "^4.0.0", + "run-parallel": "^1.1.2", + "thunky": "^1.0.1", + "uint8-util": "^2.2.5" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fs-native-extensions": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/fs-native-extensions/-/fs-native-extensions-1.4.5.tgz", + "integrity": "sha512-ekV0T//iDm4AvhOcuPaHpxub4DI7HvY5ucLJVDvi7T2J+NZkQ9S6MuvgP0yeQvoqNUaAGyLjVYb1905BF9bpmg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "require-addon": "^1.1.0", + "which-runtime": "^1.2.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsa-chunk-store": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fsa-chunk-store/-/fsa-chunk-store-1.3.0.tgz", + "integrity": "sha512-0WCfuxqqSB6Tz/g7Ar/nwAxMoigXaIXuvfrnLIEFYIA9uc6w9eNaHuBGzU1X3lyM4cpLKCOTUmKAA/gCiTvzMQ==", + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^3.0.0" + } + }, + "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", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "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", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "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", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-random-values": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-random-values/-/get-random-values-2.1.0.tgz", + "integrity": "sha512-q2yOLpLyA8f9unfv2LV8KVRUFeOIrQVS5cnqpbv6N+ea9j1rmW5dFKj/2Q7CK3juEfDYQgPxGt941VJcmw0jKg==", + "license": "MIT", + "dependencies": { + "global": "^4.4.0" + }, + "engines": { + "node": "14 || 16 || >=18" + } + }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "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.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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", + "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", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "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", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "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", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "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.1.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", + "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", + "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/hash-base/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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/hash-base/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hash-base/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/hash-base/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hashlru": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", + "integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==", + "license": "MIT" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-parser-js": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", + "integrity": "sha512-u8u5ZaG0Tr/VvHlucK2ufMuOp4/5bvwgneXle+y228K5rMbJOlVjThONcaAw3ikAy8b2OO9RfEucdMHFz3UWMA==", + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/i": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", + "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate-chunk-store": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/immediate-chunk-store/-/immediate-chunk-store-2.2.0.tgz", + "integrity": "sha512-1bHBna0hCa6arRXicu91IiL9RvvkbNYLVq+mzWdaLGZC3hXvX4doh8e1dLhMKez5siu63CYgO5NrGJbRX5lbPA==", + "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.3" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "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", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "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/ip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", + "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", + "license": "MIT" + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-set": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ip-set/-/ip-set-2.2.0.tgz", + "integrity": "sha512-NmmY3BfY4pejh6GOqNcNWRsBNdR+I7pUVtXRgZlkZdcnLtlG4X6HNtu2FZoCGyvGRzyroP1fJ+SJZBZ65JJl/Q==", + "license": "MIT", + "dependencies": { + "ip": "^2.0.1" + } + }, + "node_modules/ipaddr.js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arguments": { + "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==", + "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", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "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.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT", + "optional": true + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "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", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "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", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "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", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "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", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "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", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "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-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-file/-/is-file-1.0.0.tgz", + "integrity": "sha512-ZGMuc+xA8mRnrXtmtf2l/EkIW2zaD2LSBWlaOVEF6yH4RTndHob65V4SwWWdtGKVthQfXPVKsXqw4TDUjbVxVQ==", + "license": "MIT" + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "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", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "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-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "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==", + "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-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "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", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "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", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "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", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "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", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "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", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "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/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/iso-url": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-1.2.1.tgz", + "integrity": "sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "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/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "peer": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/join-async-iterator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/join-async-iterator/-/join-async-iterator-1.1.1.tgz", + "integrity": "sha512-ATse+nuNeKZ9K1y27LKdvPe/GCe9R/u9dw9vI248e+vILeRK3IcJP4JUPAlSmKRCDK0cKhEwfmiw4Skqx7UnGQ==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "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/junk": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz", + "integrity": "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/k-bucket": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-5.1.0.tgz", + "integrity": "sha512-Fac7iINEovXIWU20GPnOMLUbjctiS+cnmyjC4zAUgvs3XPf1vo9akfCHkigftSic/jiKqKl+KA3a/vFcJbHyCg==", + "license": "MIT", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/k-rpc": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/k-rpc/-/k-rpc-5.1.0.tgz", + "integrity": "sha512-FGc+n70Hcjoa/X2JTwP+jMIOpBz+pkRffHnSl9yrYiwUxg3FIgD50+u1ePfJUOnRCnx6pbjmVk5aAeB1wIijuQ==", + "license": "MIT", + "dependencies": { + "k-bucket": "^5.0.0", + "k-rpc-socket": "^1.7.2", + "randombytes": "^2.0.5" + } + }, + "node_modules/k-rpc-socket": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/k-rpc-socket/-/k-rpc-socket-1.11.1.tgz", + "integrity": "sha512-8xtA8oqbZ6v1Niryp2/g4GxW16EQh5MvrUylQoOG+zcrDff5CKttON2XUXvMwlIHq4/2zfPVFiinAccJ+WhxoA==", + "license": "MIT", + "dependencies": { + "bencode": "^2.0.0", + "chrome-dgram": "^3.0.2", + "chrome-dns": "^1.0.0", + "chrome-net": "^3.3.2" + } + }, + "node_modules/k-rpc-socket/node_modules/bencode": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.3.tgz", + "integrity": "sha512-D/vrAD4dLVX23NalHwb8dSvsUsxeRPO8Y7ToKA015JQYq69MLDOMkC0uGZYA/MPpltLO8rt8eqFC2j8DxjTZ/w==", + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/last-one-wins": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", + "integrity": "sha512-t+KLJFkHPQk8lfN6WBOiGkiUXoub+gnb2XTYI2P3aiISL+94xgZ1vgz1SXN/N4hthuOoLXarXfBZPUruyjQtfA==", + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libsodium-sumo": { + "version": "0.7.16", + "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.16.tgz", + "integrity": "sha512-x6atrz2AdXCJg6G709x9W9TTJRI6/0NcL5dD0l5GGVqNE48UJmDsjO4RUWYTeyXXUpg+NXZ2SHECaZnFRYzwGA==", + "license": "ISC" + }, + "node_modules/libsodium-wrappers-sumo": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.10.tgz", + "integrity": "sha512-1noz8Mcl/LUzO/iSO/FJzoJyIaPwxl+/+E4CoTIXtsPiEEXQx2sxalmrVWxteLpynqgX0ASo28ChB9NEVRh0Pg==", + "license": "ISC", + "dependencies": { + "libsodium-sumo": "^0.7.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/load-ip-set": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/load-ip-set/-/load-ip-set-3.0.1.tgz", + "integrity": "sha512-ZFZt1g4Exq01SFtKjffqau+L4Qibt+51utymHHiWo8Iu/W7LYSqE7fiZ/iAZ6dIqbmeU6ICSIK02IizSScBkLQ==", + "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": { + "cross-fetch-ponyfill": "^1.0.1", + "ip-set": "^2.1.0", + "netmask": "^2.0.1", + "once": "^1.4.0", + "queue-microtask": "^1.2.3", + "split": "^1.0.1" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "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.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lru/-/lru-3.1.0.tgz", + "integrity": "sha512-5OUtoiVIGU4VXBOshidmtOsvBIvcQR6FD/RzWSvaeHyxCGB+PCUCu+52lqMfdc0h/2CLvHhZS4TwUmMQrrMbBQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lt_donthave": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lt_donthave/-/lt_donthave-2.0.6.tgz", + "integrity": "sha512-ZVcaRbZpNB6ugwa5T9gUN0Jg9XGT9cyVjZJvdbN3V27rOQ170rEs//zaQXEQkTCBhh3i/JnCRF472KWHJu74Yg==", + "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": { + "debug": "^4.2.0", + "unordered-array-remove": "^1.0.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/magnet-uri": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/magnet-uri/-/magnet-uri-7.0.7.tgz", + "integrity": "sha512-z/+dB2NQsXaDuxVBjoPLpZT8ePaacUmoontoFheRBl++nALHYs4qV9MmhTur9e4SaMbkCR/uPX43UMzEOoeyaw==", + "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": { + "@thaunknown/thirty-two": "^1.0.5", + "bep53-range": "^2.0.0", + "uint8-util": "^2.2.5" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/main-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/main-event/-/main-event-1.0.1.tgz", + "integrity": "sha512-NWtdGrAca/69fm6DIVd8T9rtfDII4Q8NQbIbsKQq2VzS9eqOGYs8uaNQjcuaCq/d9H/o625aOTJX2Qoxzqw0Pw==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/memory-chunk-store": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/memory-chunk-store/-/memory-chunk-store-1.3.5.tgz", + "integrity": "sha512-E1Xc1U4ifk/FkC2ZsWhCaW1xg9HbE/OBmQTLe2Tr9c27YPSLbW7kw1cnb3kQWD1rDtErFJHa7mB9EVrs7aTx9g==", + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.3" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-document": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.2.tgz", + "integrity": "sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==", + "license": "MIT", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multiformats": { + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", + "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.26.2.tgz", + "integrity": "sha512-0tTvBTYkt3tdGw22nrAy50x7gpbGCCFH3AFcyS5WiUu7Eu4vWlri1woE6qHBSfy11vksDqkiwjOnlR7WV8G1Hw==", + "license": "MIT", + "optional": true + }, + "node_modules/nanoassert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==", + "license": "ISC" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "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-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "node_modules/napi-macros": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", + "license": "MIT", + "optional": true + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "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", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/next": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/next/-/next-15.0.3.tgz", + "integrity": "sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw==", + "deprecated": "This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/CVE-2025-66478 for more details.", + "license": "MIT", + "dependencies": { + "@next/env": "15.0.3", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.13", + "busboy": "1.6.0", + "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.0.3", + "@next/swc-darwin-x64": "15.0.3", + "@next/swc-linux-arm64-gnu": "15.0.3", + "@next/swc-linux-arm64-musl": "15.0.3", + "@next/swc-linux-x64-gnu": "15.0.3", + "@next/swc-linux-x64-musl": "15.0.3", + "@next/swc-win32-arm64-msvc": "15.0.3", + "@next/swc-win32-x64-msvc": "15.0.3", + "sharp": "^0.33.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-66855b96-20241106", + "react-dom": "^18.2.0 || 19.0.0-rc-66855b96-20241106", + "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/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "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/node-abi": { + "version": "3.89.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz", + "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-datachannel": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/node-datachannel/-/node-datachannel-0.32.1.tgz", + "integrity": "sha512-r4UdtA0lCsz6XrG84pJ6lntAyw/MHpmBOhEkg5UQcmWTEpANqCPkMos6rj/QZDdq3GBUsdI/wst5acwWUiibCA==", + "hasInstallScript": true, + "license": "MPL 2.0", + "dependencies": { + "prebuild-install": "^7.1.3" + }, + "engines": { + "node": ">=18.20.0" + } + }, + "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-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-fetch": { + "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==", + "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-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "license": "MIT" + }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "license": "MIT", + "engines": { + "node": ">=12.19" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm": { + "version": "9.9.4", + "resolved": "https://registry.npmjs.org/npm/-/npm-9.9.4.tgz", + "integrity": "sha512-NzcQiLpqDuLhavdyJ2J3tGJ/ni/ebcqHVFZkv1C4/6lblraUPbPgCJ4Vhb4oa3FFhRa2Yj9gA58jGH/ztKueNQ==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/promise-spawn", + "@npmcli/run-script", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "normalize-package-data", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "semver", + "sigstore", + "spdx-expression-parse", + "ssri", + "supports-color", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "license": "Artistic-2.0", + "workspaces": [ + "docs", + "smoke-tests", + "mock-globals", + "mock-registry", + "workspaces/*" + ], + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^6.5.0", + "@npmcli/config": "^6.4.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/map-workspaces": "^3.0.4", + "@npmcli/package-json": "^4.0.1", + "@npmcli/promise-spawn": "^6.0.2", + "@npmcli/run-script": "^6.0.2", + "abbrev": "^2.0.0", + "archy": "~1.0.0", + "cacache": "^17.1.4", + "chalk": "^5.3.0", + "ci-info": "^4.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.3", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.3", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^6.1.3", + "ini": "^4.1.1", + "init-package-json": "^5.0.0", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^3.0.1", + "libnpmaccess": "^7.0.2", + "libnpmdiff": "^5.0.20", + "libnpmexec": "^6.0.4", + "libnpmfund": "^4.2.1", + "libnpmhook": "^9.0.3", + "libnpmorg": "^5.0.4", + "libnpmpack": "^5.0.20", + "libnpmpublish": "^7.5.1", + "libnpmsearch": "^6.0.2", + "libnpmteam": "^5.0.3", + "libnpmversion": "^4.0.2", + "make-fetch-happen": "^11.1.1", + "minimatch": "^9.0.3", + "minipass": "^7.0.4", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^9.4.1", + "nopt": "^7.2.0", + "normalize-package-data": "^5.0.0", + "npm-audit-report": "^5.0.0", + "npm-install-checks": "^6.3.0", + "npm-package-arg": "^10.1.0", + "npm-pick-manifest": "^8.0.2", + "npm-profile": "^7.0.1", + "npm-registry-fetch": "^14.0.5", + "npm-user-validate": "^2.0.0", + "npmlog": "^7.0.1", + "p-map": "^4.0.0", + "pacote": "^15.2.0", + "parse-conflict-json": "^3.0.1", + "proc-log": "^3.0.0", + "qrcode-terminal": "^0.12.0", + "read": "^2.1.0", + "semver": "^7.6.0", + "sigstore": "^1.9.0", + "spdx-expression-parse": "^3.0.1", + "ssri": "^10.0.5", + "supports-color": "^9.4.0", + "tar": "^6.2.1", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^5.0.0", + "which": "^3.0.1", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/@colors/colors": { + "version": "1.5.0", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/npm/node_modules/@gar/promisify": { + "version": "1.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "6.5.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/installed-package-contents": "^2.0.2", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^5.0.0", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^4.0.0", + "@npmcli/query": "^3.1.0", + "@npmcli/run-script": "^6.0.0", + "bin-links": "^4.0.1", + "cacache": "^17.0.4", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^6.1.1", + "json-parse-even-better-errors": "^3.0.0", + "json-stringify-nice": "^1.1.4", + "minimatch": "^9.0.0", + "nopt": "^7.0.0", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^10.1.0", + "npm-pick-manifest": "^8.0.1", + "npm-registry-fetch": "^14.0.3", + "npmlog": "^7.0.1", + "pacote": "^15.0.8", + "parse-conflict-json": "^3.0.0", + "proc-log": "^3.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.2", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.1", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/config": { + "version": "6.4.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^3.0.2", + "ci-info": "^4.0.0", + "ini": "^4.1.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.5", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi-styles": "^4.3.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "3.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "4.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "3.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^17.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^15.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "4.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^4.1.0", + "glob": "^10.2.2", + "hosted-git-info": "^6.1.1", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "3.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "6.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "1.1.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "1.0.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "1.0.3", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tootallnate/once": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/models": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/agent-base": { + "version": "6.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/npm/node_modules/agentkeepalive": { + "version": "4.5.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/are-we-there-yet": { + "version": "4.0.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/bin-links": { + "version": "4.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/builtins": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/npm/node_modules/cacache": { + "version": "17.1.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/chalk": { + "version": "5.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ci-info": { + "version": "4.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "3.1.1", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^4.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/cli-table3": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "6.0.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/color-support": { + "version": "1.1.3", + "inBundle": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/npm/node_modules/columnify": { + "version": "1.6.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/cross-spawn": { + "version": "7.0.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/debug": { + "version": "4.3.7", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/defaults": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/delegates": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/diff": { + "version": "5.2.0", + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/npm/node_modules/eastasianwidth": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.1", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/npm/node_modules/foreground-child": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/fs.realpath": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/function-bind": { + "version": "1.1.2", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/gauge": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^4.0.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/glob": { + "version": "10.3.10", + "inBundle": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hasown": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "6.1.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "5.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/humanize-ms": { + "version": "1.2.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/ignore-walk": { + "version": "6.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/infer-owner": { + "version": "1.0.4", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/inflight": { + "version": "1.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/inherits": { + "version": "2.0.4", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/ini": { + "version": "4.1.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^10.0.0", + "promzard": "^1.0.0", + "read": "^2.0.0", + "read-package-json": "^6.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/ip-address": { + "version": "9.0.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/npm/node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/npm/node_modules/ip-regex": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-cidr": { + "version": "4.0.2", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^3.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/is-core-module": { + "version": "2.13.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/jackspeak": { + "version": "2.3.6", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/npm/node_modules/jsbn": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "7.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^10.1.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmdiff": { + "version": "5.0.21", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.5.0", + "@npmcli/disparity-colors": "^3.0.0", + "@npmcli/installed-package-contents": "^2.0.2", + "binary-extensions": "^2.2.0", + "diff": "^5.1.0", + "minimatch": "^9.0.0", + "npm-package-arg": "^10.1.0", + "pacote": "^15.0.8", + "tar": "^6.1.13" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmexec": { + "version": "6.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.5.0", + "@npmcli/run-script": "^6.0.0", + "ci-info": "^4.0.0", + "npm-package-arg": "^10.1.0", + "npmlog": "^7.0.1", + "pacote": "^15.0.8", + "proc-log": "^3.0.0", + "read": "^2.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmfund": { + "version": "4.2.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.5.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmhook": { + "version": "9.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmorg": { + "version": "5.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpack": { + "version": "5.0.21", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.5.0", + "@npmcli/run-script": "^6.0.0", + "npm-package-arg": "^10.1.0", + "pacote": "^15.0.8" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpublish": { + "version": "7.5.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ci-info": "^4.0.0", + "normalize-package-data": "^5.0.0", + "npm-package-arg": "^10.1.0", + "npm-registry-fetch": "^14.0.3", + "proc-log": "^3.0.0", + "semver": "^7.3.7", + "sigstore": "^1.4.0", + "ssri": "^10.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "6.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmteam": { + "version": "5.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "4.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^4.0.1", + "@npmcli/run-script": "^6.0.0", + "json-parse-even-better-errors": "^3.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "7.18.3", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "11.1.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/make-fetch-happen/node_modules/minipass": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minimatch": { + "version": "9.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/minipass": { + "version": "7.0.4", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-collect": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-fetch": { + "version": "3.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "9.4.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/fs": { + "version": "2.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { + "version": "1.1.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/cacache": { + "version": "16.1.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/fs-minipass": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "inBundle": true, + "license": "ISC", + "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/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "10.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/signal-exit": { + "version": "3.0.7", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/node-gyp/node_modules/ssri": { + "version": "9.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "7.2.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "5.0.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "6.3.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "10.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-packlist": { + "version": "7.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "8.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-profile": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "14.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch/node_modules/minipass": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "2.0.0", + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npmlog": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^4.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^5.0.0", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/once": { + "version": "1.4.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/pacote": { + "version": "15.2.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/pacote/node_modules/minipass": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/path-is-absolute": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/path-key": { + "version": "3.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/path-scurry": { + "version": "1.10.1", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.15", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/proc-log": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/promzard": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json": { + "version": "6.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json-fast": { + "version": "3.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/readable-stream": { + "version": "3.6.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm/node_modules/rimraf": { + "version": "3.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "inBundle": true, + "license": "ISC", + "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/npm/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/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" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { + "version": "7.6.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/shebang-command": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/shebang-regex": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/sigstore": { + "version": "1.9.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "2.8.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "7.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/spdx-correct": { + "version": "3.2.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.5.0", + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.17", + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/ssri": { + "version": "10.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/string_decoder": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "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/npm/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "inBundle": true, + "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/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/supports-color": { + "version": "9.4.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "6.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js": { + "version": "1.1.7", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-filename": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-slug": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/walk-up-path": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/npm/node_modules/which": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/wide-align": { + "version": "1.1.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/npm/node_modules/wrap-ansi": { + "version": "8.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrappy": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "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", + "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", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "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", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "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", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "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", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "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", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "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/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "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", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.1.0.tgz", + "integrity": "sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^7.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-torrent": { + "version": "11.0.19", + "resolved": "https://registry.npmjs.org/parse-torrent/-/parse-torrent-11.0.19.tgz", + "integrity": "sha512-T0lEkDdFVQsy0YxHIKjzDHSgt/yl57f3INs5jl7OZqAm77XDF0FgRgrv3LCKgSqsTOrMwYaF0t2761WKdvhgig==", + "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": { + "bencode": "^4.0.0", + "cross-fetch-ponyfill": "^1.0.3", + "get-stdin": "^9.0.0", + "magnet-uri": "^7.0.7", + "queue-microtask": "^1.2.3", + "uint8-util": "^2.2.5" + }, + "bin": { + "parse-torrent": "bin/cmd.js" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/pbkdf2": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", + "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", + "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", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/piece-length": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/piece-length/-/piece-length-2.0.1.tgz", + "integrity": "sha512-dBILiDmm43y0JPISWEmVGKBETQjwJe6mSU9GND+P9KW0SJGUwoU/odyH1nbalOP9i8WSYuqf1lQnaj92Bhw+Ug==", + "license": "MIT" + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "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", + "peer": true, + "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", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "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", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "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-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "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/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "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", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/progress-events": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.1.tgz", + "integrity": "sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/qrcode-svg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/qrcode-svg/-/qrcode-svg-1.1.0.tgz", + "integrity": "sha512-XyQCIXux1zEIA3NPb0AeR8UMYvXZzWEhgdBgBjH9gO7M48H9uoHzviNz8pXw3UzrAcxRRRn9gxHewAVK7bn9qw==", + "license": "MIT", + "bin": { + "qrcode-svg": "bin/qrcode-svg.js" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "license": "MIT" + }, + "node_modules/random-access-file": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/random-access-file/-/random-access-file-4.1.2.tgz", + "integrity": "sha512-GQM6R78DceZDcQod8KxlDFwXIiUvlvuy1EOzxTDsjuDjW5NlnlZi0MOk6iI4itAj/2vcvdqcEExYbVpC/dJcEw==", + "license": "MIT", + "dependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0", + "random-access-storage": "^3.0.0" + }, + "optionalDependencies": { + "fs-native-extensions": "^1.3.1" + } + }, + "node_modules/random-access-storage": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/random-access-storage/-/random-access-storage-3.0.2.tgz", + "integrity": "sha512-Es9maUyWdJXWKckKy9s1+vT+DEgAt+PBb9lxPaake/0EDUsHehloKGv9v1zimS2V3gpFAcQXubvc1Rgci2sDPQ==", + "license": "MIT", + "dependencies": { + "bare-events": "^2.2.0", + "queue-tick": "^1.0.0" + } + }, + "node_modules/random-iterate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/random-iterate/-/random-iterate-1.0.1.tgz", + "integrity": "sha512-Jdsdnezu913Ot8qgKgSgs63XkAjEsnMcS1z+cC6D6TNXsUXsMxy0RpclF2pzGZTEiTXL9BiArdGTEexcv4nqcA==", + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc4": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/rc4/-/rc4-0.1.5.tgz", + "integrity": "sha512-xdDTNV90z5x5u25Oc871Xnvu7yAr4tV7Eluh0VSvrhUkry39q1k+zkz7xroqHbRq+8PiazySHJPArqifUvz9VA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "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", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "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-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "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", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/record-cache": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.2.0.tgz", + "integrity": "sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==", + "license": "MIT", + "dependencies": { + "b4a": "^1.3.1" + } + }, + "node_modules/record-cache/node_modules/b4a": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "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/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "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-addon": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/require-addon/-/require-addon-1.2.0.tgz", + "integrity": "sha512-VNPDZlYgIYQwWp9jMTzljx+k0ZtatKlcvOhktZ/anNPI3dQ9NXk7cq2U4iJ1wd9IrytRnYhyEocFWbkdPb+MYA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-addon-resolve": "^1.3.0" + }, + "engines": { + "bare": ">=1.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "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", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", + "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", + "license": "MIT", + "dependencies": { + "hash-base": "^3.1.2", + "inherits": "^2.0.4" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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/run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "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/run-series": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", + "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", + "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/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "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-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "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-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "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/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scalus": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/scalus/-/scalus-0.14.2.tgz", + "integrity": "sha512-dobDMIUDUVhtxoX3ceGlaykKQGkph4HOE9hjkLsmwVgYf24fIik6YrZzVFrZSNCTvI2WN7hjEknehIrEJo1CMQ==", + "license": "Apache-2.0" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/seed-random": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", + "integrity": "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-error": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-function-length": { + "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==", + "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", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "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", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "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/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "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.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "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/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "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/node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speed-limiter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/speed-limiter/-/speed-limiter-1.0.2.tgz", + "integrity": "sha512-Ax+TbUOho84bWUc3AKqWtkIvAIVws7d6QI4oJkgH4yQ5Yil+lR3vjd/7qd51dHKGzS5bFxg0++QwyNRN7s6rZA==", + "license": "MIT", + "dependencies": { + "limiter": "^1.1.5", + "streamx": "^2.10.3" + } + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "license": "MIT", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/streamx": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "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", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "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", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "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", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "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", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "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/string2compact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string2compact/-/string2compact-2.0.1.tgz", + "integrity": "sha512-Bm/T8lHMTRXw+u83LE+OW7fXmC/wM+Mbccfdo533ajSBNxddDHlRrvxE49NdciGHgXkUQM5WYskJ7uTkbBUI0A==", + "license": "MIT", + "dependencies": { + "addr-to-ip-port": "^2.0.0", + "ipaddr.js": "^2.0.0" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "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", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "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/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz", + "integrity": "sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "license": "MIT", + "peer": true, + "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", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/tailwindcss/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "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", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-decoder/node_modules/b4a": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT" + }, + "node_modules/throughput": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/throughput/-/throughput-1.0.2.tgz", + "integrity": "sha512-jvK1ZXuhsggjb3qYQjMiU/AVYYiTeqT5thWvYR2yuy2LGM84P5MSSyAinwHahGsdBYKR9m9HncVR/3f3nFKkxg==", + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/timeout-refresh": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/timeout-refresh/-/timeout-refresh-1.0.3.tgz", + "integrity": "sha512-Mz0CX4vBGM5lj8ttbIFt7o4ZMxk/9rgudJRh76EvB7xXZMur7T/cjRiH2w4Fmkq0zxf2QpM8IFvOSRn8FEu3gA==", + "license": "MIT", + "optional": true + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "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", + "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/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "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-buffer/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/to-regex-range": { + "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==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/torrent-discovery": { + "version": "11.0.19", + "resolved": "https://registry.npmjs.org/torrent-discovery/-/torrent-discovery-11.0.19.tgz", + "integrity": "sha512-BLhdj7o0px+u72UuhJmq6CB0LBkZOa1nwgbd5ktyTELJlvcRL8EoxSSmSpzMOIScLGgslh1uLaAy/POhLpagtg==", + "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": { + "bittorrent-dht": "^11.0.11", + "bittorrent-lsd": "^2.0.0", + "bittorrent-tracker": "^11.2.2", + "debug": "^4.4.3", + "run-parallel": "^1.2.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/torrent-piece": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/torrent-piece/-/torrent-piece-3.0.2.tgz", + "integrity": "sha512-K1A5tZ3BolFrUtnBpk9iDg8av1na0OgQ7E0IlA9tj0bcsPhLhzvln+oMtMmtkqAwmUsbNCilRm2ymUdZg0rVbQ==", + "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": { + "uint8-util": "^2.1.9" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-custom-error": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", + "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/ts-log": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/ts-log/-/ts-log-2.2.7.tgz", + "integrity": "sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==", + "license": "MIT" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "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", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "license": "Unlicense" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "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", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "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", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "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", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "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/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uint8-util": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/uint8-util/-/uint8-util-2.2.6.tgz", + "integrity": "sha512-r+ZjS8CzPhtPF771ROOadUoqC40OVdiMKBI8lTfJQWb4W7+73sMBwMYmai/uvNcmZ7tBJJyZSad03yMWIt3RQg==", + "license": "MIT", + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, + "node_modules/uint8-varint": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arraylist": "^2.0.0", + "uint8arrays": "^5.0.0" + } + }, + "node_modules/uint8arraylist": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.8.tgz", + "integrity": "sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arrays": "^5.0.1" + } + }, + "node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "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/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unordered-array-remove": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", + "integrity": "sha512-45YsfD6svkgaCBNyvD+dFHm4qFX9g3wRSIVgWVPtm2OCnphvPxzJoe20ATsiNpNJrmzHifnxm+BN5F7gFT/4gw==", + "license": "MIT" + }, + "node_modules/unordered-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-2.0.1.tgz", + "integrity": "sha512-eUmNTPzdx+q/WvOHW0bgGYLWvWHNT3PTKEQLg0MAQhc0AHASHVHoP/9YytYd4RBVariqno/mEUhVZN98CmD7bg==", + "license": "MIT", + "optional": true + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "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/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "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", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "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", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "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/ut_metadata": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ut_metadata/-/ut_metadata-4.0.3.tgz", + "integrity": "sha512-2tovup0VDYpT8t8+EhhhKBmbgIyiYyJQZ+Hf+/61+SvjuRS2MEeA5CiSARP4q+9/83Wu09OsGrUre/Zv6OI5NA==", + "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": { + "bencode": "^4.0.0", + "bitfield": "^4.0.0", + "debug": "^4.2.0", + "uint8-util": "^2.1.3" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/ut_pex": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/ut_pex/-/ut_pex-4.0.4.tgz", + "integrity": "sha512-isVTbp2TKGoMOu+4Zh/i6ijpYr0VG83xjRPgCXaUjKzgXXndjCMWg32/9kZjubD+kxEXcmXMkoS8IttS9FZE8g==", + "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": { + "bencode": "^4.0.0", + "compact2string": "^1.4.1", + "string2compact": "^2.0.1" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/utf8-codec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utf8-codec/-/utf8-codec-1.0.0.tgz", + "integrity": "sha512-S/QSLezp3qvG4ld5PUfXiH7mCFxLKjSVZRFkB3DOjgwHuJPFDkInAXc/anf7BAbHt/D38ozDzL+QMZ6/7gsI6w==", + "license": "MIT" + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "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", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utp-native": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/utp-native/-/utp-native-2.5.3.tgz", + "integrity": "sha512-sWTrWYXPhhWJh+cS2baPzhaZc89zwlWCfwSthUjGhLkZztyPhcQllo+XVVCbNGi7dhyRlxkWxN4NKU6FbA9Y8w==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "napi-macros": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.0.2", + "timeout-refresh": "^1.0.0", + "unordered-set": "^2.0.1" + }, + "bin": { + "ucat": "ucat.js" + }, + "engines": { + "node": ">=8.12" + } + }, + "node_modules/utp-native/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/utp-native/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "license": "MIT" + }, + "node_modules/web-encoding": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", + "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", + "license": "MIT", + "dependencies": { + "util": "^0.12.3" + }, + "optionalDependencies": { + "@zxing/text-encoding": "0.9.0" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webcrypto-core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.8.1.tgz", + "integrity": "sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.13", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^3.0.5", + "pvtsutils": "^1.3.5", + "tslib": "^2.7.0" + } + }, + "node_modules/webextension-polyfill": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.8.0.tgz", + "integrity": "sha512-a19+DzlT6Kp9/UI+mF9XQopeZ+n2ussjhxHJ4/pmIGge9ijCDz7Gn93mNnjpZAk95T4Tae8iHZ6sSf869txqiQ==", + "license": "MPL-2.0" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/webrtc-polyfill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webrtc-polyfill/-/webrtc-polyfill-1.2.0.tgz", + "integrity": "sha512-epaVJbKzWOY5Wf3k7DoZLNgHP/5IoALBvjvlZQgX+9vFnf9UfCHv+rc+r/vJ7jxQUwH3cIYx9blHfyWWxGbw1g==", + "license": "MIT", + "dependencies": { + "node-datachannel": "^0.32.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/webtorrent": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/webtorrent/-/webtorrent-2.8.5.tgz", + "integrity": "sha512-oIjpuBrypApJ+RCZ8RRaHEncVSkt2cd25/I4Trb2sk9nlaEF92Dg1u8BCwqA4eJR7wIZQM95GyO7Wo4QTbrUUA==", + "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": { + "@silentbot1/nat-api": "^0.4.9", + "@thaunknown/simple-peer": "^10.0.11", + "@webtorrent/http-node": "^1.3.0", + "addr-to-ip-port": "^2.0.0", + "bitfield": "^4.2.0", + "bittorrent-dht": "^11.0.10", + "bittorrent-protocol": "^4.1.20", + "cache-chunk-store": "^3.2.2", + "chunk-store-iterator": "^1.0.4", + "cpus": "^1.0.3", + "create-torrent": "^6.1.0", + "cross-fetch-ponyfill": "^1.0.3", + "debug": "^4.4.1", + "escape-html": "^1.0.3", + "fs-chunk-store": "^5.0.0", + "fsa-chunk-store": "^1.3.0", + "immediate-chunk-store": "^2.2.0", + "join-async-iterator": "^1.1.1", + "load-ip-set": "^3.0.1", + "lt_donthave": "^2.0.5", + "memory-chunk-store": "^1.3.5", + "mime": "^3.0.0", + "once": "^1.4.0", + "parse-torrent": "^11.0.18", + "pump": "^3.0.2", + "queue-microtask": "^1.2.3", + "random-iterate": "^1.0.1", + "range-parser": "^1.2.1", + "run-parallel": "^1.2.0", + "run-parallel-limit": "^1.1.0", + "speed-limiter": "^1.0.2", + "streamx": "2.22.1", + "throughput": "^1.0.2", + "torrent-discovery": "^11.0.17", + "torrent-piece": "^3.0.2", + "uint8-util": "^2.2.5", + "unordered-array-remove": "^1.0.2", + "ut_metadata": "^4.0.3", + "ut_pex": "^4.0.4" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "utp-native": "^2.5.3" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "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", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "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", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "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-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "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-runtime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/which-runtime/-/which-runtime-1.3.2.tgz", + "integrity": "sha512-5kwCfWml7+b2NO7KrLMhYihjRx0teKkd3yGp1Xk5Vaf2JGdSh+rgVhEALAD9c/59dP+YwJHXoEO7e8QPy7gOkw==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "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/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "peer": true, + "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/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/lazer/cardano/lafhis/transaction flow.png b/lazer/cardano/lafhis/transaction flow.png new file mode 100644 index 00000000..02bbade9 Binary files /dev/null and b/lazer/cardano/lafhis/transaction flow.png differ diff --git a/lazer/cardano/lafhis/tx_flow.md b/lazer/cardano/lafhis/tx_flow.md new file mode 100644 index 00000000..57808449 --- /dev/null +++ b/lazer/cardano/lafhis/tx_flow.md @@ -0,0 +1,28 @@ + +## Flujo de transacciones +--- +**TX 1** โ€” Create (Player A) + Inputs: wallet UTxO de Player A + Outputs: script UTxO con bet_amount_lovelace + NFT + Datum: status=Waiting, player_b=None, deadline=None + Mint: +1 NFT (nft_policy_id, asset_name=duel_id) + Signers: Player A + Backend (para mintear NFT) + +**TX 2** โ€” Join (Player B + Backend) + Inputs: script UTxO (Waiting) + wallet UTxO de Player B + Ref Inputs: Pyth state UTxO โ† requerido por pyth.get_updates + Withdrawals: 0 lovelace del Pyth withdraw script, + redeemer = [signed_update_feed_a, signed_update_feed_b] + Outputs: script UTxO (Active) con start_price_a y start_price_b + Signers: Player B + Backend + + +**TX 3** โ€” Resolve (Backend, despuรฉs del deadline) + Inputs: script UTxO (Active) + Ref Inputs: Pyth state UTxO + Withdrawals: 0 lovelace del Pyth withdraw script, + redeemer = [signed_update_feed_a, signed_update_feed_b] + Outputs: winner recibe total (o ambos si draw) + Burn: -1 NFT + Signers: Backend + diff --git a/lazer/cardano/lafhis/wallet_integration.md b/lazer/cardano/lafhis/wallet_integration.md new file mode 100644 index 00000000..1226156a --- /dev/null +++ b/lazer/cardano/lafhis/wallet_integration.md @@ -0,0 +1,188 @@ +# Cardano Wallet Integration +URL: /apis/wallets + +Connect to browser wallets and create server-side wallets for Cardano dApp development. + +*** + +title: "Cardano Wallet Integration" +description: "Connect to browser wallets and create server-side wallets for Cardano dApp development." +icon: WalletIcon +full: true +---------- + +import {linksWallets} from "@/data/links-wallets"; +import Link from "next/link"; +import { + Card, + CardDescription, + CardTitle, +} from "@/components/ui/card"; + +## Overview + +Mesh provides wallet classes for different use cases: + +| Wallet Class | Use Case | Environment | +| ------------------------------------------------------- | --------------------------------------------- | ------------------ | +| [CardanoBrowserWallet](/apis/wallets/browserwallet) | Connect to user's wallet extension (CIP-30) | Frontend (browser) | +| [MeshCardanoBrowserWallet](/apis/wallets/browserwallet) | Browser wallet with Mesh convenience methods | Frontend (browser) | +| [CardanoHeadlessWallet](/apis/wallets/meshwallet) | Programmatic wallet control (low-level) | Backend (Node.js) | +| [MeshCardanoHeadlessWallet](/apis/wallets/meshwallet) | Headless wallet with Mesh convenience methods | Backend (Node.js) | + +## Quick Start + +### Browser Wallet (Frontend) + +Connect to CIP-30 compatible wallets like Eternl, Nami, and Lace: + +```tsx +import { MeshCardanoBrowserWallet } from "@meshsdk/wallet"; + +// Get installed wallets +const wallets = MeshCardanoBrowserWallet.getInstalledWallets(); + +// Connect to a wallet +const wallet = await MeshCardanoBrowserWallet.enable("eternl"); + +// Get balance (Mesh format) +const balance = await wallet.getBalanceMesh(); +console.log(`Balance: ${balance.find(a => a.unit === 'lovelace')?.quantity}`); + +// Get address (Bech32 format) +const address = await wallet.getChangeAddressBech32(); +``` + +### Headless Wallet (Backend) + +Create wallets programmatically for server-side applications: + +```tsx +import { MeshCardanoHeadlessWallet } from "@meshsdk/wallet"; +import { BlockfrostProvider } from "@meshsdk/core"; +import { AddressType } from "@meshsdk/wallet"; + +const provider = new BlockfrostProvider(""); + +// Create from mnemonic +const wallet = await MeshCardanoHeadlessWallet.fromMnemonic({ + networkId: 0, // 0 = testnet, 1 = mainnet + walletAddressType: AddressType.Base, + fetcher: provider, + submitter: provider, + mnemonic: ["your", "24", "word", "mnemonic", "phrase", "..."], +}); + +// Or create from Bip32 root key +const wallet = await MeshCardanoHeadlessWallet.fromBip32Root({ + networkId: 0, + walletAddressType: AddressType.Base, + fetcher: provider, + submitter: provider, + bech32: "xprv1...", +}); +``` + +## Choosing a Wallet Class + +**Use Browser Wallet classes when:** + +* Building frontend dApps +* Users need to connect their own wallets +* Transactions require user approval +* Working with CIP-30 features + +**Use Headless Wallet classes when:** + +* Running backend services +* Automating transactions +* Managing treasury wallets +* Building bots or scripts + +**Use Mesh variants (`MeshCardanoBrowserWallet`, `MeshCardanoHeadlessWallet`) when:** + +* You want UTxOs, balances, and addresses in Mesh-compatible formats +* You prefer Bech32 addresses directly +* You need convenience methods like `signTxReturnFullTx()` + +**Use base variants (`CardanoBrowserWallet`, `CardanoHeadlessWallet`) when:** + +* You want raw CIP-30 compliant CBOR hex responses +* You need maximum compatibility with the CIP-30 standard + +## Common Operations + +Both wallet types share similar APIs implementing the `ICardanoWallet` interface: + +```tsx +// Get UTXOs (CBOR hex format) +const utxos = await wallet.getUtxos(); + +// Get change address (hex format) +const address = await wallet.getChangeAddress(); + +// Sign transaction +const signedTx = await wallet.signTx(unsignedTx, partialSign); + +// Submit transaction +const txHash = await wallet.submitTx(signedTx); + +// Get balance (CBOR hex format) +const balance = await wallet.getBalance(); +``` + +Mesh wallet variants add convenience methods: + +```tsx +// Get UTXOs in Mesh format +const utxos = await wallet.getUtxosMesh(); + +// Get change address in Bech32 +const address = await wallet.getChangeAddressBech32(); + +// Get balance as Asset array +const balance = await wallet.getBalanceMesh(); + +// Sign and return full transaction (with witnesses merged) +const signedTx = await wallet.signTxReturnFullTx(unsignedTx); +``` + +## React Integration + +For React applications, use `@meshsdk/react` for built-in components and hooks: + +```tsx +import { CardanoWallet, useWallet } from "@meshsdk/react"; + +function App() { + const { connected, wallet } = useWallet(); + + return ( +
+ + {connected &&

Balance: {wallet.getLovelace()}

} +
+ ); +} +``` + +See [React Getting Started](/react/getting-started) for full integration details. + +## Available Wallet APIs + +
+ {linksWallets.map((card) => ( + + + {card.title} + {card.desc} + + + ))} +
+ +## Related + +* [React Integration](/react/getting-started) - Wallet components and hooks +* [Transaction Builder](/apis/txbuilder/basics) - Build transactions to sign +* [Prove Wallet Ownership](/guides/prove-wallet-ownership) - Authenticate users with signatures