diff --git a/docs/CHAIN_INTEGRATION.md b/docs/CHAIN_INTEGRATION.md new file mode 100644 index 0000000..a88dc95 --- /dev/null +++ b/docs/CHAIN_INTEGRATION.md @@ -0,0 +1,137 @@ +# Chain Integration Guide + +Connect your chain to Taifoon's multi-chain proof infrastructure in three steps. + +## Prerequisites + +```bash +# Install the Taifoon CLI (Jupiter fork with chain commands) +npm install -g @jup-ag/cli +# Or run directly: +npx tsx src/index.ts chain --help +``` + +## Step 1: Register Your Chain + +```bash +# Auto-derives chain ID from your RPC endpoint +jup chain register --endpoint + +# Or specify chain ID explicitly +jup chain register --chain-id --endpoint + +# Non-EVM chains +jup chain register --chain-id --endpoint --type solana +``` + +**What happens:** +1. CLI calls `eth_chainId` on your RPC to derive/verify chain ID +2. Validates: not a testnet, RPC is responsive, measures latency +3. Determines finality type and required light client verifier +4. Submits to Taifoon's chain queue (status: **PENDING**) +5. Taifoon team gets notified via Telegram with ✅/❌ buttons + +**Testnet rejection:** Chain IDs like Sepolia (11155111), Goerli (5), Base Sepolia (84532), etc. are automatically blocked. Taifoon only supports mainnet. + +## Step 2: Track Approval & Configure + +```bash +# Check your submission status +jup chain submission --id + +# List all pending submissions +jup chain submission --pending + +# Once approved, configure block submission +jup chain configure --chain-id --interval 12s --endpoint +``` + +**Approval flow:** +- Submission enters `PENDING` state +- Taifoon team reviews via Telegram inline buttons +- On approval: chain added to warmbed RPC pool + RPC submissions enabled +- Typical approval: < 24 hours + +## Step 3: Verify Cross-Chain Proofs + +```bash +# Verify proof path from your chain to Ethereum +jup chain verify --from --to 1 + +# Verify specific block +jup chain verify --from --to 1 --block +``` + +**Output includes:** +- V5 proof bundle (MMR siblings, super root, tx root) +- Full finality path: source consensus → destination consensus +- Light client verifier contract addresses + +## Finality Types + +Every chain maps to a consensus type in the `TaifoonLightClientRegistry`: + +| Type | Name | Verifier | Chains | +|------|------|----------|--------| +| 0 | ETH_POS_CHECKPOINT | Casper FFG | Ethereum, Gnosis | +| 1 | L2_OUTPUT_ROOT | L2OutputOracle | OP, Base, Scroll, Linea, zkSync, Blast, Zora, Mode, Lisk, Unichain, Fraxtal, Abstract, Lyra | +| 2 | BSC_FAST_FINALITY | Parlia | BNB Smart Chain | +| 3 | DEPTH_BASED | N confirms | Bitcoin (6), Polygon (128), new chains (64 default) | +| 4 | INSTANT | Single-slot BFT | Monad, Sei, Avalanche, Fantom | +| 5 | HOTSHOT | HotStuff BFT | Flow, HyperEVM, ApeChain, RARI | +| 7 | GRANDPA | Relay finality | Polkadot, Kusama, Moonbeam, Astar, Peaq | +| 11 | ARB_BOLD | BoLD disputes | Arbitrum | +| 12 | TRON_DPOS | 27 SRs | Tron | +| 14 | SOL_TOWER_BFT | Tower BFT + PoH | Solana | + +**Unknown chains** default to `DEPTH_BASED(64)`. Deploy a custom verifier for faster finality: +- Registry: `0xC38F10789FFeFc78cB611f9d7354B7B237b13B73` (Taifoon devnet 36927) +- Repo: [taifoon-io/taifoon-light-client](https://github.com/taifoon-io/taifoon-light-client) + +## Other Commands + +```bash +# List all registered chains +jup chain list + +# Check chain status (registered, collecting, proofs available) +jup chain status --chain-id + +# Add additional RPC to existing chain pool +jup chain add-rpc --chain-id --endpoint +``` + +## API Endpoints + +| Endpoint | Method | Description | +|----------|--------|-------------| +| `/chain/submit` | POST | Submit new chain for onboarding | +| `/chain/submissions` | GET | List submissions (filter: `?status=pending`) | +| `/chain/submission/:id` | GET | Get submission details | +| `/chain/approved` | GET | List all approved chains | +| `/chain/approve/:id` | POST | Approve chain (admin) | +| `/chain/reject/:id` | POST | Reject chain (admin) | + +## Architecture + +``` +CLI (jup chain register) + ↓ POST /chain/submit +Search API (taifoon-search) + ↓ validates RPC, checks testnet, detects finality + ↓ saves to chain-submissions.json + ↓ sends Telegram notification to Chefs + ↓ +Team reviews → ✅ Approve / ❌ Reject + ↓ POST /chain/approve/:id + ↓ adds to CHAIN_META (RPC submissions now accepted) + ↓ injects RPC into warmbed-collector + ↓ +Warmbed starts probing chain + ↓ +Spinner collector picks up chain + ↓ +DA-API generates V5 proofs + ↓ +jup chain verify → proof available! +``` diff --git a/docs/taifoon.md b/docs/taifoon.md new file mode 100644 index 0000000..18aa1d2 --- /dev/null +++ b/docs/taifoon.md @@ -0,0 +1,157 @@ +# Taifoon Integration + +The `jup taifoon` command group provides integration with Taifoon Network for AI trading agents: + +- **Signal subscription** — Consume Taifoon trading signals +- **V5 proof fetching** — Get cryptographic proofs for any Solana slot +- **On-chain PnL tracking** — Register agents and report trades +- **Leaderboard** — View top-performing agents + +## Commands + +### Subscribe to Signals + +```bash +# Subscribe to GEM_HUNT signals on Solana +jup taifoon subscribe --strategy GEM_HUNT --chains 200 --min-confidence 70 + +# JSON output for programmatic consumption +jup taifoon subscribe -f json +``` + +### Get V5 Proof Bundle + +```bash +# Get proof for a specific Solana slot +jup taifoon proof --slot 409081054 + +# JSON output +jup taifoon proof --slot 409081054 -f json +``` + +Response includes: +- MMR siblings (6 levels) +- SuperRoot hash +- Finality status +- Transactions root + +### Register as Agent + +```bash +# Register your wallet as a trading agent +jup taifoon register --agent-id "my-agent-v1" + +# With specific key +jup taifoon register --agent-id "my-agent-v1" --key mykey + +# Dry run +jup taifoon register --agent-id "my-agent-v1" --dry-run +``` + +### Report Trade + +After executing a trade via `jup spot swap`, report it to the on-chain tracker: + +```bash +jup taifoon report \ + --entry-tx "4oDunCMF..." \ + --exit-tx "5xPqrNMG..." \ + --entry-slot 409081054 \ + --exit-slot 409082000 \ + --entry-price 1.00 \ + --exit-price 1.50 \ + --size 100 \ + --token JUP \ + --signal-id "sig_001" +``` + +This will: +1. Fetch V5 proofs for both entry and exit slots +2. Calculate PnL in basis points +3. Submit to AgentPnLTracker contract on Taifoon devnet +4. Update your agent's leaderboard position + +### View Leaderboard + +```bash +# Top 10 agents +jup taifoon leaderboard + +# Top 50 +jup taifoon leaderboard --limit 50 + +# JSON format +jup taifoon leaderboard -f json +``` + +### View Your Stats + +```bash +# Your agent stats +jup taifoon stats + +# Another agent's stats +jup taifoon stats --address 0x123... +``` + +## Workflow Example + +```bash +# 1. Setup +jup keys add agent1 +jup taifoon register --agent-id "gemhunter-v1" + +# 2. Subscribe to signals (in background) +jup taifoon subscribe --strategy GEM_HUNT -f json > signals.jsonl & + +# 3. On signal, execute trade +jup spot swap --from USDC --to JUP --amount 100 -f json > entry.json + +# 4. Later, exit position +jup spot swap --from JUP --to USDC --amount all -f json > exit.json + +# 5. Report trade with V5 proofs +jup taifoon report \ + --entry-tx $(jq -r '.signature' entry.json) \ + --exit-tx $(jq -r '.signature' exit.json) \ + --entry-slot $(jq -r '.slot' entry.json) \ + --exit-slot $(jq -r '.slot' exit.json) \ + --entry-price 1.00 \ + --exit-price 1.50 \ + --size 100 \ + --token JUP + +# 6. Check your ranking +jup taifoon leaderboard +``` + +## API Endpoints + +The commands use these Taifoon API endpoints: + +- `GET /api/lambda/proof-bundle/block/200/{slot}` — V5 proof bundle +- `GET /api/signals/stream` — SSE signal stream (coming soon) + +## Contract + +Trades are recorded on `AgentPnLTracker` deployed on Taifoon devnet (chainId 36927): + +- Contract: `0x...` (TBD after deployment) +- Explorer: `https://scanner.taifoon.dev/agents` + +## Why V5 Proofs? + +Every trade is anchored to Taifoon's 6-layer MMR proof system: + +1. Block header inclusion +2. Twig (2048 block) root +3. Chain MMR root +4. SuperRoot (all chains) +5. Finality attestation +6. Operator signature + +This creates a verifiable, tamper-proof record of every trade, enabling: +- Trustless PnL verification +- Investor due diligence +- Regulatory compliance +- Insurance claims diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5215112 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1716 @@ +{ + "name": "@jup-ag/cli", + "version": "0.6.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@jup-ag/cli", + "version": "0.6.0", + "license": "GPL-3.0", + "dependencies": { + "@scure/bip32": "^2.0.1", + "@scure/bip39": "^2.0.1", + "@solana-program/token": "^0.12.0", + "@solana/kit": "^6.2.0", + "chalk": "^5.6.2", + "cli-table3": "^0.6.5", + "commander": "^14.0.3", + "ky": "^1.14.3", + "micro-key-producer": "^0.8.5" + }, + "bin": { + "jup": "dist/index.js" + }, + "devDependencies": { + "@types/bun": "latest", + "oxlint": "^1.53.0", + "prettier": "^3.8.1", + "typescript": "^5.9.3" + }, + "engines": { + "bun": ">=1", + "node": ">=20" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@noble/ciphers": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-2.1.1.tgz", + "integrity": "sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.0.1.tgz", + "integrity": "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "2.0.1" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", + "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.57.0.tgz", + "integrity": "sha512-C7EiyfAJG4B70496eV543nKiq5cH0o/xIh/ufbjQz3SIvHhlDDsyn+mRFh+aW8KskTyUpyH2LGWL8p2oN6bl1A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.57.0.tgz", + "integrity": "sha512-9i80AresjZ/FZf5xK8tKFbhQnijD4s1eOZw6/FHUwD59HEZbVLRc2C88ADYJfLZrF5XofWDiRX/Ja9KefCLy7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.57.0.tgz", + "integrity": "sha512-0eUfhRz5L2yKa9I8k3qpyl37XK3oBS5BvrgdVIx599WZK63P8sMbg+0s4IuxmIiZuBK68Ek+Z+gcKgeYf0otsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.57.0.tgz", + "integrity": "sha512-UvrSuzBaYOue+QMAcuDITe0k/Vhj6KZGjfnI6x+NkxBTke/VoM7ZisaxgNY0LWuBkTnd1OmeQfEQdQ48fRjkQg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.57.0.tgz", + "integrity": "sha512-wtQq0dCoiw4bUwlsNVDJJ3pxJA218fOezpgtLKrbQqUtQJcM9yP8z+I9fu14aHg0uyAxIY+99toL6uBa2r7nxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.57.0.tgz", + "integrity": "sha512-qxFWl2BBBFcT4djKa+OtMdnLgoHEJXpqjyGwz8OhW35ImoCwR5qtAGqApNYce5260FQqoAHW8S8eZTjiX67Tsg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.57.0.tgz", + "integrity": "sha512-SQoIsBU7J0bDW15/f0/RvxHfY3Y0+eB/caKBQtNFbuerTiA6JCYx9P1MrrFTwY2dTm/lMgTSgskvCEYk2AtG/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.57.0.tgz", + "integrity": "sha512-jqxYd1W6WMeozsCmqe9Rzbu3SRrGTyGDAipRlRggetyYbUksJqJKvUNTQtZR/KFoJPb+grnSm5SHhdWrywv3RQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.57.0.tgz", + "integrity": "sha512-i66WyEPVEvq9bxRUCJ/MP5EBfnTDN3nhwEdFZFTO5MmLLvzngfWEG3NSdXQzTT3vk5B9i6C2XSIYBh+aG6uqyg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.57.0.tgz", + "integrity": "sha512-oMZDCwz4NobclZU3pH+V1/upVlJZiZvne4jQP+zhJwt+lmio4XXr4qG47CehvrW1Lx2YZiIHuxM2D4YpkG3KVA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.57.0.tgz", + "integrity": "sha512-uoBnjJ3MMEBbfnWC1jSFr7/nSCkcQYa72NYoNtLl1imshDnWSolYCjzb8LVCwYCCfLJXD+0gBLD7fyC14c0+0g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.57.0.tgz", + "integrity": "sha512-BdrwD7haPZ8a9KrZhKJRSj6jwCor+Z8tHFZ3PT89Y3Jq5v3LfMfEePeAmD0LOTWpiTmzSzdmyw9ijneapiVHKQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.57.0.tgz", + "integrity": "sha512-BNs+7ZNsRstVg2tpNxAXfMX/Iv5oZh204dVyb8Z37+/gCh+yZqNTlg6YwCLIMPSk5wLWIGOaQjT0GUOahKYImw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.57.0.tgz", + "integrity": "sha512-AghS18w+XcENcAX0+BQGLiqjpqpaxKJa4cWWP0OWNLacs27vHBxu7TYkv9LUSGe5w8lOJHeMxcYfZNOAPqw2bg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.57.0.tgz", + "integrity": "sha512-E/FV3GB8phu/Rpkhz5T96hAiJlGzn91qX5yj5gU754P5cmVGXY1Jw/VSjDSlZBCY3VHjsVLdzgdkJaomEmcNOg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.57.0.tgz", + "integrity": "sha512-xvZ2yZt0nUVfU14iuGv3V25jpr9pov5N0Wr28RXnHFxHCRxNDMtYPHV61gGLhN9IlXM96gI4pyYpLSJC5ClLCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.57.0.tgz", + "integrity": "sha512-Z4D8Pd0AyHBKeazhdIXeUUy5sIS3Mo0veOlzlDECg6PhRRKgEsBJCCV1n+keUZtQ04OP+i7+itS3kOykUyNhDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.57.0.tgz", + "integrity": "sha512-StOZ9nFMVKvevicbQfql6Pouu9pgbeQnu60Fvhz2S6yfMaii+wnueLnqQ5I1JPgNF0Syew4voBlAaHD13wH6tw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.57.0.tgz", + "integrity": "sha512-6PuxhYgth8TuW0+ABPOIkGdBYw+qYGxgIdXPHSVpiCDm+hqTTWCmC739St1Xni0DJBt8HnSHTG67i1y6gr8qrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@scure/base": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-2.0.0.tgz", + "integrity": "sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-2.0.1.tgz", + "integrity": "sha512-4Md1NI5BzoVP+bhyJaY3K6yMesEFzNS1sE/cP+9nuvE7p/b0kx9XbpDHHFl8dHtufcbdHRUUQdRqLIPHN/s7yA==", + "license": "MIT", + "dependencies": { + "@noble/curves": "2.0.1", + "@noble/hashes": "2.0.1", + "@scure/base": "2.0.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-2.0.1.tgz", + "integrity": "sha512-PsxdFj/d2AcJcZDX1FXN3dDgitDDTmwf78rKZq1a6c1P1Nan1X/Sxc7667zU3U+AN60g7SxxP0YCVw2H/hBycg==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "2.0.1", + "@scure/base": "2.0.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@solana-program/system": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@solana-program/system/-/system-0.12.0.tgz", + "integrity": "sha512-ZnAAWeGVMWNtJhw3GdifI2HnhZ0A0H0qs8tBkcFvxp/8wIavvO+GOM4Jd0N22u2+Lni2zcwvcrxrsxj6Mjphng==", + "license": "Apache-2.0", + "peerDependencies": { + "@solana/kit": "^6.1.0" + } + }, + "node_modules/@solana-program/token": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@solana-program/token/-/token-0.12.0.tgz", + "integrity": "sha512-hnidRNuFhmqUdW5aWkKTJ+cdzuotVMNwLsTyAk0Nd8VjLDld+vQC0fugHWqm5GPrvYe0hCNAhtpJcZVnNp7rOA==", + "license": "Apache-2.0", + "dependencies": { + "@solana-program/system": "^0.12.0" + }, + "peerDependencies": { + "@solana/kit": "^6.1.0" + } + }, + "node_modules/@solana/accounts": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-6.5.0.tgz", + "integrity": "sha512-h3zQFjwZjmy+YxgTGOEna6g74Tsn4hTBaBCslwPT4QjqWhywe2JrM2Ab0ANfJcj7g/xrHF5QJ/FnUIcyUTeVfQ==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "6.5.0", + "@solana/codecs-core": "6.5.0", + "@solana/codecs-strings": "6.5.0", + "@solana/errors": "6.5.0", + "@solana/rpc-spec": "6.5.0", + "@solana/rpc-types": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/addresses": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-6.5.0.tgz", + "integrity": "sha512-iD4/u3CWchQcPofbwzteaE9RnFJSoi654Rnhru5fOu6U2XOte3+7t50d6OxdxQ109ho2LqZyVtyCo2Wb7u1aJQ==", + "license": "MIT", + "dependencies": { + "@solana/assertions": "6.5.0", + "@solana/codecs-core": "6.5.0", + "@solana/codecs-strings": "6.5.0", + "@solana/errors": "6.5.0", + "@solana/nominal-types": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/assertions": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-6.5.0.tgz", + "integrity": "sha512-rEAf40TtC9r6EtJFLe39WID4xnTNT6hdOVRfD1xDzmIQdVOyGgIbJGt2FAuB/uQDKLWneWMnvGDBim+K61Bljw==", + "license": "MIT", + "dependencies": { + "@solana/errors": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/codecs": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-6.5.0.tgz", + "integrity": "sha512-WfqMqUXk4jcCJQ9nfKqjDcCJN2Pt8/AKe/E78z8OcblFGVJnTzcu2yZpE2gsqM+DJyCVKdQmOY+NS8Uckk5e5w==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "6.5.0", + "@solana/codecs-data-structures": "6.5.0", + "@solana/codecs-numbers": "6.5.0", + "@solana/codecs-strings": "6.5.0", + "@solana/options": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/codecs-core": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-6.5.0.tgz", + "integrity": "sha512-Wb+YUj7vUKz5CxqZkrkugtQjxOP2fkMKnffySRlAmVAkpRnQvBY/2eP3VJAKTgDD4ru9xHSIQSpDu09hC/cQZg==", + "license": "MIT", + "dependencies": { + "@solana/errors": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/codecs-data-structures": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-6.5.0.tgz", + "integrity": "sha512-Rxi5zVJ1YA+E6FoSQ7RHP+3DF4U7ski0mJ3H5CsYQP24QLRlBqWB3X6m2n9GHT5O3s49UR0sqeF4oyq0lF8bKw==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "6.5.0", + "@solana/codecs-numbers": "6.5.0", + "@solana/errors": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/codecs-numbers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-6.5.0.tgz", + "integrity": "sha512-gU/7eYqD+zl2Kwzo7ctt7YHaxF+c3RX164F+iU4X02dwq8DGVcypp+kmEF1QaO6OiShtdryTxhL+JJmEBjhdfA==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "6.5.0", + "@solana/errors": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/codecs-strings": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-6.5.0.tgz", + "integrity": "sha512-9TuQQxumA9gWJeJzbv1GUg0+o0nZp204EijX3efR+lgBOKbkU7W0UWp33ygAZ+RvWE+kTs48ePoYoJ7UHpyxkQ==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "6.5.0", + "@solana/codecs-numbers": "6.5.0", + "@solana/errors": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "fastestsmallesttextencoderdecoder": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/errors": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-6.5.0.tgz", + "integrity": "sha512-XPc0I8Ck6vgx8Uu+LVLewx/1RWDkXkY3lU+1aN1kmbrPAQWbX4Txk7GPmuIIFpyys8o5aKocYfNxJOPKvfaQhg==", + "license": "MIT", + "dependencies": { + "chalk": "5.6.2", + "commander": "14.0.3" + }, + "bin": { + "errors": "bin/cli.mjs" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/fast-stable-stringify": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-6.5.0.tgz", + "integrity": "sha512-5ATQDwBVZMoenX5KS23uFswtaAGoaZB9TthzUXle3tkU3tOfgQTuEWEoqEBYc7ct0sK6LtyE1XXT/NP5YvAkkQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/functional": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-6.5.0.tgz", + "integrity": "sha512-/KYgY7ZpBJfkN8+qlIvxuBpxv32U9jHXIOOJh3U5xk8Ncsa9Ex5VwbU9NkOf43MJjoIamsP0vARCHjcqJwe5JQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/instruction-plans": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/instruction-plans/-/instruction-plans-6.5.0.tgz", + "integrity": "sha512-zp2asevpyMwvhajHYM1aruYpO+xf3LSwHEI2FK6E2hddYZaEhuBy+bz+NZ1ixCyfx3iXcq7MamlFQc2ySHDyUQ==", + "license": "MIT", + "dependencies": { + "@solana/errors": "6.5.0", + "@solana/instructions": "6.5.0", + "@solana/keys": "6.5.0", + "@solana/promises": "6.5.0", + "@solana/transaction-messages": "6.5.0", + "@solana/transactions": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/instructions": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-6.5.0.tgz", + "integrity": "sha512-2mQP/1qqr5PCfaVMzs9KofBjpyS7J1sBV6PidGoX9Dg5/4UgwJJ+7yfCVQPn37l1nKCShm4I+pQAy5vbmrxJmA==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "6.5.0", + "@solana/errors": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/keys": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-6.5.0.tgz", + "integrity": "sha512-CN5jmodX9j5CZKrWLM5XGaRlrLl/Ebl4vgqDXrnwC2NiSfUslLsthuORMuVUTDqkzBX/jd/tgVXFRH2NYNzREQ==", + "license": "MIT", + "dependencies": { + "@solana/assertions": "6.5.0", + "@solana/codecs-core": "6.5.0", + "@solana/codecs-strings": "6.5.0", + "@solana/errors": "6.5.0", + "@solana/nominal-types": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/kit": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-6.5.0.tgz", + "integrity": "sha512-4ysrtqMRd7CTYRv179gQq4kbw9zMsJCLhWjiyOmLZ4co4ld3L654D8ykW7yqWE5PJwF0hzEfheE7oBscO37nvw==", + "license": "MIT", + "dependencies": { + "@solana/accounts": "6.5.0", + "@solana/addresses": "6.5.0", + "@solana/codecs": "6.5.0", + "@solana/errors": "6.5.0", + "@solana/functional": "6.5.0", + "@solana/instruction-plans": "6.5.0", + "@solana/instructions": "6.5.0", + "@solana/keys": "6.5.0", + "@solana/offchain-messages": "6.5.0", + "@solana/plugin-core": "6.5.0", + "@solana/plugin-interfaces": "6.5.0", + "@solana/program-client-core": "6.5.0", + "@solana/programs": "6.5.0", + "@solana/rpc": "6.5.0", + "@solana/rpc-api": "6.5.0", + "@solana/rpc-parsed-types": "6.5.0", + "@solana/rpc-spec-types": "6.5.0", + "@solana/rpc-subscriptions": "6.5.0", + "@solana/rpc-types": "6.5.0", + "@solana/signers": "6.5.0", + "@solana/sysvars": "6.5.0", + "@solana/transaction-confirmation": "6.5.0", + "@solana/transaction-messages": "6.5.0", + "@solana/transactions": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/nominal-types": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/nominal-types/-/nominal-types-6.5.0.tgz", + "integrity": "sha512-HngIM2nlaDPXk0EDX0PklFqpjGDKuOFnlEKS0bfr2F9CorFwiNhNjhb9lPH+FdgsogD1wJ8wgLMMk1LZWn5kgQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/offchain-messages": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/offchain-messages/-/offchain-messages-6.5.0.tgz", + "integrity": "sha512-IYuidJCwfXg5xlh3rkflkA1fbTKWTsip8MdI+znvXm87grfqOYCTd6t/SKiV4BhLl/65Tn0wB/zvZ1cmzJqa1w==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "6.5.0", + "@solana/codecs-core": "6.5.0", + "@solana/codecs-data-structures": "6.5.0", + "@solana/codecs-numbers": "6.5.0", + "@solana/codecs-strings": "6.5.0", + "@solana/errors": "6.5.0", + "@solana/keys": "6.5.0", + "@solana/nominal-types": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/options": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-6.5.0.tgz", + "integrity": "sha512-jdZjSKGCQpsMFK+3CiUEI7W9iGsndi46R4Abk66ULNLDoMsjvfqNy8kqktm0TN0++EX8dKEecpFwxFaA4VlY5g==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "6.5.0", + "@solana/codecs-data-structures": "6.5.0", + "@solana/codecs-numbers": "6.5.0", + "@solana/codecs-strings": "6.5.0", + "@solana/errors": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/plugin-core": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/plugin-core/-/plugin-core-6.5.0.tgz", + "integrity": "sha512-L6N69oNQOAqljH4GnLTaxpwJB0nibW9DrybHZxpGWshyv6b/EvwvkDVRKj5bNqtCG+HRZUHnEhLi1UgZVNkjpQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/plugin-interfaces": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/plugin-interfaces/-/plugin-interfaces-6.5.0.tgz", + "integrity": "sha512-/ZlybbMaR7P4ySersOe1huioMADWze0AzsHbzgkpt5dJUv2tz5cpaKdu7TEVQkUZAFhLdqXQULNGqAU5neOgzg==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "6.5.0", + "@solana/instruction-plans": "6.5.0", + "@solana/keys": "6.5.0", + "@solana/rpc-spec": "6.5.0", + "@solana/rpc-subscriptions-spec": "6.5.0", + "@solana/rpc-types": "6.5.0", + "@solana/signers": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/program-client-core": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/program-client-core/-/program-client-core-6.5.0.tgz", + "integrity": "sha512-eUz1xSeDKySGIjToAryPmlESdj8KX0Np7R+Pjt+kSFGw5Jgmn/Inh4o8luoeEnf5XwbvSPVb4aHpIsDyoUVbIg==", + "license": "MIT", + "dependencies": { + "@solana/accounts": "6.5.0", + "@solana/addresses": "6.5.0", + "@solana/codecs-core": "6.5.0", + "@solana/errors": "6.5.0", + "@solana/instruction-plans": "6.5.0", + "@solana/instructions": "6.5.0", + "@solana/plugin-interfaces": "6.5.0", + "@solana/rpc-api": "6.5.0", + "@solana/signers": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/programs": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/programs/-/programs-6.5.0.tgz", + "integrity": "sha512-srn3nEROBxCnBpVz/bvLkVln1BZtk3bS3nuReu3yaeOLkKl8b0h1Zp0YmXVyXHzdMcYahsTvKKLR1ZtLZEyEPA==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "6.5.0", + "@solana/errors": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/promises": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/promises/-/promises-6.5.0.tgz", + "integrity": "sha512-n5rsA3YwOO2nUst6ghuVw6RSnuZQYqevqBKqVYbw11Z4XezsoQ6hb78opW3J9YNYapw9wLWy6tEfUsJjY+xtGw==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/rpc": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/rpc/-/rpc-6.5.0.tgz", + "integrity": "sha512-lGj7ZMVOR3Rf16aByXD6ghrMqw3G8rAMuWCHU4uMKES5M5VLqNv6o71bSyoTxVMGrmYdbALOvCbFMFINAxtoBg==", + "license": "MIT", + "dependencies": { + "@solana/errors": "6.5.0", + "@solana/fast-stable-stringify": "6.5.0", + "@solana/functional": "6.5.0", + "@solana/rpc-api": "6.5.0", + "@solana/rpc-spec": "6.5.0", + "@solana/rpc-spec-types": "6.5.0", + "@solana/rpc-transformers": "6.5.0", + "@solana/rpc-transport-http": "6.5.0", + "@solana/rpc-types": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/rpc-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-6.5.0.tgz", + "integrity": "sha512-b+kftroO8vZFzLHj7Nk/uATS3HOlBUsUqdGg3eTQrW1pFgkyq5yIoEYHeFF7ApUN/SJLTK86U8ofCaXabd2SXA==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "6.5.0", + "@solana/codecs-core": "6.5.0", + "@solana/codecs-strings": "6.5.0", + "@solana/errors": "6.5.0", + "@solana/keys": "6.5.0", + "@solana/rpc-parsed-types": "6.5.0", + "@solana/rpc-spec": "6.5.0", + "@solana/rpc-transformers": "6.5.0", + "@solana/rpc-types": "6.5.0", + "@solana/transaction-messages": "6.5.0", + "@solana/transactions": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/rpc-parsed-types": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-6.5.0.tgz", + "integrity": "sha512-129c8meL6CxRg56/HfhkFOpwYteQH9Rt0wyXOXZQx3a3FNpcJLd4JdPvxDsLBE3EupEkXLGVku/1bGKz+F2J+g==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/rpc-spec": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-6.5.0.tgz", + "integrity": "sha512-k4O7Kg0QfVyjUqQovL+WZJ1iuPzq0jiUDcWYgvzFjYVxQDVOIZmAol7yTvLEL4maVmf0tNFDsrDaB6t75MKRZA==", + "license": "MIT", + "dependencies": { + "@solana/errors": "6.5.0", + "@solana/rpc-spec-types": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/rpc-spec-types": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-6.5.0.tgz", + "integrity": "sha512-XasJp+sOW6PLfNoalzoLnm+j3LEZF8XOQmSrOqv9AGrGxQckkuOf6iXZucWTqeNKdstsOpU28BN2B6qOavfRzQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/rpc-subscriptions": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions/-/rpc-subscriptions-6.5.0.tgz", + "integrity": "sha512-EenogPQw9Iy8VUj8anu7xoBnPk7gu1J6sAi4MTVlNVz02sNjdUBJoSS0PRJZuhSM1ktPTtHrNwqlXP8TxPR7jg==", + "license": "MIT", + "dependencies": { + "@solana/errors": "6.5.0", + "@solana/fast-stable-stringify": "6.5.0", + "@solana/functional": "6.5.0", + "@solana/promises": "6.5.0", + "@solana/rpc-spec-types": "6.5.0", + "@solana/rpc-subscriptions-api": "6.5.0", + "@solana/rpc-subscriptions-channel-websocket": "6.5.0", + "@solana/rpc-subscriptions-spec": "6.5.0", + "@solana/rpc-transformers": "6.5.0", + "@solana/rpc-types": "6.5.0", + "@solana/subscribable": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/rpc-subscriptions-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-api/-/rpc-subscriptions-api-6.5.0.tgz", + "integrity": "sha512-smqNjT2C5Vf9nWGIwiYOLOP744gRWKi2i2g0i3ZVdsfoouvB0d/WTQ2bbWq47MrdV8FSuGnjAOM3dRIwYmYOWw==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "6.5.0", + "@solana/keys": "6.5.0", + "@solana/rpc-subscriptions-spec": "6.5.0", + "@solana/rpc-transformers": "6.5.0", + "@solana/rpc-types": "6.5.0", + "@solana/transaction-messages": "6.5.0", + "@solana/transactions": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/rpc-subscriptions-channel-websocket": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-channel-websocket/-/rpc-subscriptions-channel-websocket-6.5.0.tgz", + "integrity": "sha512-xRKH3ZwIoV9Zua9Gp0RR0eL8lXNgx+iNIkE3F0ROlOzI48lt4lRJ7jLrHQCN3raVtkatFVuEyZ7e9eLHK9zhAw==", + "license": "MIT", + "dependencies": { + "@solana/errors": "6.5.0", + "@solana/functional": "6.5.0", + "@solana/rpc-subscriptions-spec": "6.5.0", + "@solana/subscribable": "6.5.0", + "ws": "^8.19.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/rpc-subscriptions-spec": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-spec/-/rpc-subscriptions-spec-6.5.0.tgz", + "integrity": "sha512-Mi8g9rNS2lG7lyNkDhOVfQVfDC7hXKgH+BlI5qKGk+8cfyU7VDq6tVjDysu6kBWGOPHZxyCvcL6+xW/EkdVoAg==", + "license": "MIT", + "dependencies": { + "@solana/errors": "6.5.0", + "@solana/promises": "6.5.0", + "@solana/rpc-spec-types": "6.5.0", + "@solana/subscribable": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/rpc-transformers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-6.5.0.tgz", + "integrity": "sha512-kS0d+LuuSLfsod2cm2xp0mNj65PL1aomwu6VKtubmsdESwPXHIaI9XrpkPCBuhNSz1SwVp4OkfK5O/VOOHYHSw==", + "license": "MIT", + "dependencies": { + "@solana/errors": "6.5.0", + "@solana/functional": "6.5.0", + "@solana/nominal-types": "6.5.0", + "@solana/rpc-spec-types": "6.5.0", + "@solana/rpc-types": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/rpc-transport-http": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-transport-http/-/rpc-transport-http-6.5.0.tgz", + "integrity": "sha512-A3qgDGiUIHdtAfc2OyazlQa7IvRh+xyl0dmzaZlz4rY7Oc7Xk8jmXtaKGkgXihLyAK3oVSqSz5gn9yEfx55eXA==", + "license": "MIT", + "dependencies": { + "@solana/errors": "6.5.0", + "@solana/rpc-spec": "6.5.0", + "@solana/rpc-spec-types": "6.5.0", + "undici-types": "^7.22.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/rpc-types": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-6.5.0.tgz", + "integrity": "sha512-hxts27+Z2VNv4IjXGcXkqbj/MgrN9Xtw/4iE1qZk68T2OAb5vA4b8LHchsOHmHvrzZfo8XDvB9mModCdM3JPsQ==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "6.5.0", + "@solana/codecs-core": "6.5.0", + "@solana/codecs-numbers": "6.5.0", + "@solana/codecs-strings": "6.5.0", + "@solana/errors": "6.5.0", + "@solana/nominal-types": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/signers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/signers/-/signers-6.5.0.tgz", + "integrity": "sha512-AL75/DyDUhc+QQ+VGZT7aRwJNzIUTWvmLNXQRlCVhLRuyroXzZEL2WJBs8xOwbZXjY8weacfYT7UNM8qK6ucDg==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "6.5.0", + "@solana/codecs-core": "6.5.0", + "@solana/errors": "6.5.0", + "@solana/instructions": "6.5.0", + "@solana/keys": "6.5.0", + "@solana/nominal-types": "6.5.0", + "@solana/offchain-messages": "6.5.0", + "@solana/transaction-messages": "6.5.0", + "@solana/transactions": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/subscribable": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-6.5.0.tgz", + "integrity": "sha512-Jmy2NYmQN68FsQzKJ5CY3qrxXBJdb5qtJKp8B4byPPO5liKNIsC59HpT0Tq8MCNSfBMmOkWF2rrVot2/g1iB1A==", + "license": "MIT", + "dependencies": { + "@solana/errors": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/sysvars": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-6.5.0.tgz", + "integrity": "sha512-iLSS5qj0MWNiGH1LN1E4jhGsXH9D3tWSjwaB6zK9LjhLdVYcPfkosBkj7s0EHHrH03QlwiuFdU0Y2kH8Jcp8kw==", + "license": "MIT", + "dependencies": { + "@solana/accounts": "6.5.0", + "@solana/codecs-core": "6.5.0", + "@solana/codecs-data-structures": "6.5.0", + "@solana/codecs-numbers": "6.5.0", + "@solana/errors": "6.5.0", + "@solana/rpc-types": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/transaction-confirmation": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-6.5.0.tgz", + "integrity": "sha512-hfdRBq4toZj7DRMgBN3F0VtJpmTAEtcVTTDZoiszoSpSVa2cAvFth6KypIqASVFZyi9t4FKolLP8ASd3/39UQg==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "6.5.0", + "@solana/codecs-strings": "6.5.0", + "@solana/errors": "6.5.0", + "@solana/keys": "6.5.0", + "@solana/promises": "6.5.0", + "@solana/rpc": "6.5.0", + "@solana/rpc-subscriptions": "6.5.0", + "@solana/rpc-types": "6.5.0", + "@solana/transaction-messages": "6.5.0", + "@solana/transactions": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/transaction-messages": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-6.5.0.tgz", + "integrity": "sha512-ueXkm5xaRlqYBFAlABhaCKK/DuzIYSot0FybwSDeOQCDy2hvU9Zda16Iwa1n56M0fG+XUvFJz2woG3u9DhQh1g==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "6.5.0", + "@solana/codecs-core": "6.5.0", + "@solana/codecs-data-structures": "6.5.0", + "@solana/codecs-numbers": "6.5.0", + "@solana/errors": "6.5.0", + "@solana/functional": "6.5.0", + "@solana/instructions": "6.5.0", + "@solana/nominal-types": "6.5.0", + "@solana/rpc-types": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/transactions": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-6.5.0.tgz", + "integrity": "sha512-b3eJrrGmwpk64VLHjOrmXKAahPpba42WX/FqSUn4WRXPoQjga7Mb57yp+EaRVeQfjszKCkF+13yu+ni6iv2NFQ==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "6.5.0", + "@solana/codecs-core": "6.5.0", + "@solana/codecs-data-structures": "6.5.0", + "@solana/codecs-numbers": "6.5.0", + "@solana/codecs-strings": "6.5.0", + "@solana/errors": "6.5.0", + "@solana/functional": "6.5.0", + "@solana/instructions": "6.5.0", + "@solana/keys": "6.5.0", + "@solana/nominal-types": "6.5.0", + "@solana/rpc-types": "6.5.0", + "@solana/transaction-messages": "6.5.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@types/bun": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.3.11.tgz", + "integrity": "sha512-5vPne5QvtpjGpsGYXiFyycfpDF2ECyPcTSsFBMa0fraoxiQyMJ3SmuQIGhzPg2WJuWxVBoxWJ2kClYTcw/4fAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bun-types": "1.3.11" + } + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/node/node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/bun-types": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.3.11.tgz", + "integrity": "sha512-1KGPpoxQWl9f6wcZh57LvrPIInQMn2TQ7jsgxqpRzg+l0QPOFvJVH7HmvHo/AiPgwXy+/Thf6Ov3EdVn1vOabg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ky": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.3.tgz", + "integrity": "sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, + "node_modules/micro-key-producer": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/micro-key-producer/-/micro-key-producer-0.8.5.tgz", + "integrity": "sha512-aPvW8Dyp0My4Un3DL4WIwG8blHM7AwYL5VwKWXSHztxJxfVRlRaa/z77qGMP5OO3Zmq2Xje+dV9Be4keSTfVYA==", + "license": "MIT", + "dependencies": { + "@noble/ciphers": "^2.0.0", + "@noble/curves": "^2.0.0", + "@noble/hashes": "^2.0.0", + "@scure/base": "^2.0.0", + "micro-packed": "^0.8.0" + }, + "bin": { + "gpgkp": "bin/gpgkp.js" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/micro-packed": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/micro-packed/-/micro-packed-0.8.0.tgz", + "integrity": "sha512-AKb8znIvg9sooythbXzyFeChEY0SkW0C6iXECpy/ls0e5BtwXO45J9wD9SLzBztnS4XmF/5kwZknsq+jyynd/A==", + "license": "MIT", + "dependencies": { + "@scure/base": "2.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/oxlint": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.57.0.tgz", + "integrity": "sha512-DGFsuBX5MFZX9yiDdtKjTrYPq45CZ8Fft6qCltJITYZxfwYjVdGf/6wycGYTACloauwIPxUnYhBVeZbHvleGhw==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.57.0", + "@oxlint/binding-android-arm64": "1.57.0", + "@oxlint/binding-darwin-arm64": "1.57.0", + "@oxlint/binding-darwin-x64": "1.57.0", + "@oxlint/binding-freebsd-x64": "1.57.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.57.0", + "@oxlint/binding-linux-arm-musleabihf": "1.57.0", + "@oxlint/binding-linux-arm64-gnu": "1.57.0", + "@oxlint/binding-linux-arm64-musl": "1.57.0", + "@oxlint/binding-linux-ppc64-gnu": "1.57.0", + "@oxlint/binding-linux-riscv64-gnu": "1.57.0", + "@oxlint/binding-linux-riscv64-musl": "1.57.0", + "@oxlint/binding-linux-s390x-gnu": "1.57.0", + "@oxlint/binding-linux-x64-gnu": "1.57.0", + "@oxlint/binding-linux-x64-musl": "1.57.0", + "@oxlint/binding-openharmony-arm64": "1.57.0", + "@oxlint/binding-win32-arm64-msvc": "1.57.0", + "@oxlint/binding-win32-ia32-msvc": "1.57.0", + "@oxlint/binding-win32-x64-msvc": "1.57.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=0.15.0" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + } + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "license": "MIT" + }, + "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 + } + } + } + } +} diff --git a/src/commands/ChainCommand.ts b/src/commands/ChainCommand.ts new file mode 100644 index 0000000..304ea6a --- /dev/null +++ b/src/commands/ChainCommand.ts @@ -0,0 +1,751 @@ +import { Command } from "commander"; +import { Output } from "../lib/Output"; + +const TAIFOON_API = "https://api.taifoon.dev"; +const SEARCH_API = "https://scanner.taifoon.dev/search-api"; + +// Well-known testnet chain IDs — NEVER accept these +const TESTNET_CHAIN_IDS = new Set([ + 3, 4, 5, 42, 69, 97, 280, 300, 420, 919, 1442, 2522, 4002, 17000, 37111, + 43113, 44787, 80001, 80002, 84531, 84532, 168587773, 421613, 421614, + 534351, 59141, 999999999, 11155111, 11155420, +]); + +// Heuristics for testnet detection from chain name +const TESTNET_KEYWORDS = [ + "testnet", "sepolia", "goerli", "rinkeby", "ropsten", "kovan", + "devnet", "fuji", "alfajores", "mumbai", "amoy", "chiado", +]; + +// Finality type mapping — mirrors DA-API v5_proof_assembler.rs map_finality_type() +// Linked to TaifoonLightClientRegistry ConsensusType enum on devnet +const FINALITY_MAP: Record = { + // 0 = ETH_POS_CHECKPOINT + 1: { type: 0, name: "ETH_POS_CHECKPOINT", verifier: "EthPoS (Casper FFG)", note: "2 epoch finality (~12.8 min)" }, + 100: { type: 0, name: "ETH_POS_CHECKPOINT", verifier: "Gnosis Beacon Chain", note: "ETH2-style PoS" }, + // 1 = L2_OUTPUT_ROOT (OP Stack / zkSync / Scroll / rollups) + 10: { type: 1, name: "L2_OUTPUT_ROOT", verifier: "L2OutputOracle", note: "Anchored to Ethereum L1 finality" }, + 8453: { type: 1, name: "L2_OUTPUT_ROOT", verifier: "L2OutputOracle", note: "Anchored to Ethereum L1 finality" }, + 324: { type: 1, name: "L2_OUTPUT_ROOT", verifier: "ZkSyncDiamond", note: "ZK rollup, batch verified on L1" }, + 59144: { type: 1, name: "L2_OUTPUT_ROOT", verifier: "LineaRollup", note: "ZK rollup, batch verified on L1" }, + 534352:{ type: 1, name: "L2_OUTPUT_ROOT", verifier: "ScrollChain", note: "ZK rollup, batch verified on L1" }, + 81457: { type: 1, name: "L2_OUTPUT_ROOT", verifier: "L2OutputOracle", note: "Blast L2 output oracle" }, + 7777777:{ type: 1, name: "L2_OUTPUT_ROOT", verifier: "L2OutputOracle", note: "Zora L2" }, + 34443: { type: 1, name: "L2_OUTPUT_ROOT", verifier: "L2OutputOracle", note: "Mode L2" }, + 1135: { type: 1, name: "L2_OUTPUT_ROOT", verifier: "DisputeGameFactory", note: "Lisk OP Stack" }, + 130: { type: 1, name: "L2_OUTPUT_ROOT", verifier: "DisputeGameFactory", note: "Unichain OP Stack" }, + 252: { type: 1, name: "L2_OUTPUT_ROOT", verifier: "L2OutputOracle", note: "Fraxtal OP Stack" }, + 2741: { type: 1, name: "L2_OUTPUT_ROOT", verifier: "L2OutputOracle", note: "Abstract ZK rollup" }, + 957: { type: 1, name: "L2_OUTPUT_ROOT", verifier: "L2OutputOracle", note: "Lyra OP Stack" }, + // 2 = BSC_FAST_FINALITY + 56: { type: 2, name: "BSC_FAST_FINALITY", verifier: "BSC Fast Finality", note: "Parlia consensus, ~2 block finality" }, + // 3 = DEPTH_BASED + 21000000:{ type: 3, name: "DEPTH_BASED", verifier: "BitcoinPoWVerifierV2 (0x52f9...BA94)", confirmations: 6, note: "Nakamoto PoW, 6 confirms (~60 min)" }, + 137: { type: 3, name: "DEPTH_BASED", verifier: "Polygon PoS", confirmations: 128, note: "Tendermint BFT + L1 checkpoints" }, + 195: { type: 3, name: "DEPTH_BASED", verifier: "XLayer", confirmations: 64, note: "ZK batch confirmed" }, + // 4 = INSTANT (single-slot BFT) + 143: { type: 4, name: "INSTANT", verifier: "MonadBFTVerifier (0x6547...1718)", note: "MonadBFT (HotStuff), single-slot finality" }, + 1329: { type: 4, name: "INSTANT", verifier: "CometBFTVerifier", note: "Sei CometBFT, instant finality" }, + 43114:{ type: 4, name: "INSTANT", verifier: "AVAX Snowman", note: "Snowman consensus, instant finality" }, + 250: { type: 4, name: "INSTANT", verifier: "Fantom Lachesis", note: "DAG-based BFT, instant finality" }, + // 5 = HOTSHOT + 747: { type: 5, name: "HOTSHOT", verifier: "HotShotVerifier", note: "Flow EVM, HotStuff BFT" }, + 999: { type: 5, name: "HOTSHOT", verifier: "HotShotVerifier", note: "HyperEVM, Espresso-sequenced" }, + 1380012617:{ type: 5, name: "HOTSHOT", verifier: "ArbitrumOrbit", note: "RARI Chain, Arbitrum Orbit" }, + 33139:{ type: 5, name: "HOTSHOT", verifier: "ArbitrumOrbit", note: "ApeChain, Arbitrum Orbit" }, + // 7 = GRANDPA + 400: { type: 7, name: "GRANDPA", verifier: "GrandpaVerifier (0xb73D...7a1)", note: "Polkadot relay chain GRANDPA finality" }, + 401: { type: 7, name: "GRANDPA", verifier: "GrandpaVerifier", note: "Kusama relay chain GRANDPA finality" }, + 592: { type: 7, name: "GRANDPA_RELAY", verifier: "GrandpaVerifier (relay proof)", note: "Astar parachain via Polkadot relay" }, + 1284: { type: 7, name: "GRANDPA_RELAY", verifier: "GrandpaVerifier (relay proof)", note: "Moonbeam parachain via Polkadot relay" }, + 3338: { type: 7, name: "GRANDPA_RELAY", verifier: "GrandpaVerifier (relay proof)", note: "Peaq parachain via Polkadot relay" }, + // 11 = ARB_BOLD + 42161:{ type: 11, name: "ARB_BOLD", verifier: "ArbitrumRollupCore (0x5eF0...d35)", note: "BoLD dispute protocol, ~7 day challenge period" }, + // 12 = DPOS + 500: { type: 12, name: "TRON_DPOS", verifier: "TronDPoSVerifier (0x7A2B...0045)", note: "27 Super Representatives, DPoS" }, + // 14 = SOL_TOWER_BFT + 200: { type: 14, name: "SOL_TOWER_BFT", verifier: "SolanaPoHVerifier (0x19eD...9403)", note: "Tower BFT + PoH, slot-level 2/3 voting" }, +}; + +// Default finality for unknown EVM chains +const DEFAULT_FINALITY = { type: 3, name: "DEPTH_BASED", verifier: "Generic (requires new verifier deployment)", confirmations: 64, note: "Unknown consensus — using depth-based finality (64 confirms). Contact Taifoon to deploy a specialized verifier." }; + +// Non-EVM chain ID mapping +const NON_EVM_CHAINS: Record = { + solana: { chainId: 200, chainType: "solana" }, + bitcoin: { chainId: 21000000, chainType: "bitcoin" }, + polkadot: { chainId: 400, chainType: "polkadot" }, + kusama: { chainId: 401, chainType: "polkadot" }, + aptos: { chainId: 600, chainType: "aptos" }, + icp: { chainId: 223, chainType: "icp" }, + tron: { chainId: 728126428, chainType: "tron" }, +}; + +interface ChainInfo { + chainId: number; + chainType: string; + name?: string; + isTestnet: boolean; + rpc: string; +} + +interface RegisteredChain { + chain_id: number; + rpc: string; + rpc_pool: string[]; +} + +/** + * Derive chain ID from an EVM RPC endpoint + */ +async function deriveChainId(rpc: string): Promise<{ chainId: number; error?: string }> { + try { + const res = await fetch(rpc, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ jsonrpc: "2.0", method: "eth_chainId", id: 1 }), + signal: AbortSignal.timeout(10000), + }); + const data = await res.json() as any; + if (data.error) return { chainId: 0, error: `RPC error: ${data.error.message}` }; + const chainId = parseInt(data.result, 16); + if (isNaN(chainId) || chainId <= 0) return { chainId: 0, error: `Invalid chain ID from RPC: ${data.result}` }; + return { chainId }; + } catch (e: any) { + return { chainId: 0, error: `Cannot reach RPC: ${e.message}` }; + } +} + +/** + * Check if a chain ID is a known testnet + */ +function isTestnet(chainId: number, chainName?: string): boolean { + if (TESTNET_CHAIN_IDS.has(chainId)) return true; + if (chainName) { + const lower = chainName.toLowerCase(); + return TESTNET_KEYWORDS.some(kw => lower.includes(kw)); + } + return false; +} + +/** + * Try to get chain name from chainlist-style APIs or the RPC itself + */ +async function getChainName(chainId: number): Promise { + try { + const res = await fetch(`https://chainid.network/chains.json`, { + signal: AbortSignal.timeout(5000), + }); + const chains = await res.json() as any[]; + const match = chains.find((c: any) => c.chainId === chainId); + return match?.name; + } catch { + return undefined; + } +} + +/** + * Get currently registered chains from warmbed + */ +async function getRegisteredChains(): Promise> { + try { + const res = await fetch(`${SEARCH_API}/warmbed/chains/ready`, { + signal: AbortSignal.timeout(10000), + }); + const data = await res.json() as any; + const map = new Map(); + + // Response is { chains: [...], ... } + const chains = data.chains || data; + if (Array.isArray(chains)) { + for (const c of chains) { + map.set(c.chain_id, c); + } + } + return map; + } catch { + return new Map(); + } +} + +/** + * Check if block collection is active for a chain + */ +async function isCollecting(chainId: number): Promise { + try { + const res = await fetch(`${SEARCH_API}/collector/status`, { + signal: AbortSignal.timeout(10000), + }); + const data = await res.json() as any; + const chains = data.chains || data; + if (Array.isArray(chains)) { + return chains.some((c: any) => c.chain_id === chainId); + } + return false; + } catch { + return false; + } +} + +export class ChainCommand { + static register(program: Command) { + const chain = program + .command("chain") + .description("Chain integration — register, configure, and verify cross-chain proofs"); + + // ─── register-chain ─────────────────────────────────────── + chain + .command("register") + .description("Register a new chain with Taifoon") + .option("--chain-id ", "Chain ID (auto-derived from RPC if not provided)") + .option("--endpoint ", "RPC endpoint URL") + .option("--type ", "Chain type: evm, solana, bitcoin, polkadot, tron, aptos, icp", "evm") + .option("--name ", "Human-readable chain name") + .option("--dry-run", "Preview without submitting") + .action(async (options) => { + const chainType = options.type || "evm"; + let chainId = options.chainId ? parseInt(options.chainId) : 0; + let rpc = options.endpoint; + + console.log("🌀 Taifoon Chain Registration\n"); + + // ── Step 0: Early testnet check if chain-id provided ── + if (chainId && isTestnet(chainId)) { + console.error(`❌ Testnet chains are not supported.`); + console.error(` Chain ID ${chainId} is a known testnet.`); + console.error(` Taifoon only supports mainnet chains.`); + process.exit(1); + } + + // ── Step 1: Resolve chain ID ── + if (chainType === "evm") { + if (rpc && !chainId) { + console.log(`Deriving chain ID from ${rpc}...`); + const result = await deriveChainId(rpc); + if (result.error) { + console.error(`❌ ${result.error}`); + process.exit(1); + } + chainId = result.chainId; + console.log(` → Chain ID: ${chainId}`); + } else if (chainId && rpc) { + // Verify provided chain ID matches RPC + console.log(`Verifying chain ID ${chainId} against RPC...`); + const result = await deriveChainId(rpc); + if (result.error) { + console.error(`❌ ${result.error}`); + process.exit(1); + } + if (result.chainId !== chainId) { + console.error(`❌ Chain ID mismatch: provided ${chainId}, RPC returned ${result.chainId}`); + process.exit(1); + } + console.log(` → Verified ✓`); + } else if (!chainId) { + console.error("❌ Provide --chain-id or --endpoint (for auto-derivation)"); + process.exit(1); + } + } else { + // Non-EVM: lookup from known mapping + const known = NON_EVM_CHAINS[chainType]; + if (known && !chainId) { + chainId = known.chainId; + } + if (!chainId) { + console.error(`❌ Provide --chain-id for ${chainType} chains`); + process.exit(1); + } + } + + // ── Step 2: Testnet check ── + const chainName = options.name || await getChainName(chainId); + if (isTestnet(chainId, chainName)) { + console.error(`❌ Testnet chains are not supported.`); + console.error(` Chain ID ${chainId}${chainName ? ` (${chainName})` : ""} detected as testnet.`); + console.error(` Taifoon only supports mainnet chains.`); + process.exit(1); + } + console.log(` → Mainnet check: passed ✓`); + + // ── Step 3: Already registered? ── + const registered = await getRegisteredChains(); + if (registered.has(chainId)) { + const existing = registered.get(chainId)!; + console.log(`\n✅ Chain ${chainId}${chainName ? ` (${chainName})` : ""} is already registered!`); + console.log(` Active RPC: ${existing.rpc}`); + console.log(` Pool size: ${existing.rpc_pool?.length || 1} RPCs`); + + if (rpc && !existing.rpc_pool?.includes(rpc)) { + console.log(`\n Your endpoint is not in the pool yet.`); + console.log(` Run: jup chain add-rpc --chain-id ${chainId} --endpoint ${rpc}`); + } else { + console.log(`\n Nothing to do. Use 'jup chain configure' to adjust settings.`); + } + return; + } + + // ── Step 4: Submit registration ── + if (!rpc) { + console.error(`❌ --endpoint required for new chain registration`); + process.exit(1); + } + + // ── Step 5: Finality assessment ── + const finality = FINALITY_MAP[chainId] || DEFAULT_FINALITY; + + console.log(`\n Chain ID: ${chainId}`); + console.log(` Name: ${chainName || "Unknown"}`); + console.log(` Type: ${chainType}`); + console.log(` RPC: ${rpc}`); + console.log(` Finality: ${finality.name} (type ${finality.type})`); + console.log(` Verifier: ${finality.verifier}`); + if (finality.confirmations) { + console.log(` Confirms: ${finality.confirmations} blocks`); + } + console.log(` Note: ${finality.note}`); + + if (finality === DEFAULT_FINALITY) { + console.log(`\n ⚠️ No specialized light client verifier exists for chain ${chainId}.`); + console.log(` Taifoon will use DEPTH_BASED finality (${finality.confirmations} confirms).`); + console.log(` For faster finality, contact the Taifoon team to deploy a custom verifier.`); + console.log(` Registry: TaifoonLightClientRegistry (0xC38F...B73)`); + console.log(` See: https://github.com/taifoon-io/taifoon-light-client`); + } + + if (options.dryRun) { + console.log(`\n[DRY RUN] Would submit chain ${chainId} to Taifoon for approval`); + return; + } + + try { + const res = await fetch(`${SEARCH_API}/chain/submit`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + chain_id: chainId, + endpoint: rpc, + chain_type: chainType, + name: chainName, + submitter: "taifoon-cli", + finality_type: finality.name, + }), + }); + + const data = await res.json() as any; + + if (!data.ok) { + console.error(`❌ Submission failed: ${data.error}`); + process.exit(1); + } + + if (data.already_registered) { + console.log(`\n✅ ${data.message}`); + } else if (data.already_pending) { + console.log(`\n⏳ ${data.message}`); + console.log(` Track status: jup chain submission --id ${data.id}`); + } else { + console.log(`\n⏳ Chain ${chainId} (${data.chain_name}) submitted for approval!`); + console.log(` Submission ID: ${data.id}`); + console.log(` Status: PENDING — the Taifoon team has been notified.`); + console.log(`\n Track status: jup chain submission --id ${data.id}`); + console.log(`\nOnce approved:`); + console.log(` 1. Configure: jup chain configure --chain-id ${chainId} --interval 12s`); + console.log(` 2. Verify: jup chain verify --from ${chainId} --to 1`); + } + } catch (e: any) { + console.error(`❌ Submission failed: ${e.message}`); + process.exit(1); + } + }); + + // ─── add-rpc ────────────────────────────────────────────── + chain + .command("add-rpc") + .description("Add an RPC endpoint to an existing chain's pool") + .requiredOption("--chain-id ", "Chain ID") + .requiredOption("--endpoint ", "RPC endpoint URL") + .option("--dry-run", "Preview without submitting") + .action(async (options) => { + const chainId = parseInt(options.chainId); + const rpc = options.endpoint; + + console.log(`🌀 Adding RPC to chain ${chainId}\n`); + + // Verify RPC works for EVM + const result = await deriveChainId(rpc); + if (!result.error && result.chainId !== chainId) { + console.error(`❌ RPC returns chain ID ${result.chainId}, expected ${chainId}`); + process.exit(1); + } + + if (options.dryRun) { + console.log(`[DRY RUN] Would add ${rpc} to chain ${chainId}`); + return; + } + + try { + const res = await fetch(`${SEARCH_API}/rpc/submit`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + chain_id: chainId, + url: rpc, + chain_type: "evm", + contributor: "taifoon-cli", + }), + }); + + if (!res.ok) { + const text = await res.text(); + console.error(`❌ Failed: ${res.status} ${text}`); + process.exit(1); + } + + console.log(`✅ RPC added to chain ${chainId}`); + } catch (e: any) { + console.error(`❌ Failed: ${e.message}`); + process.exit(1); + } + }); + + // ─── configure ──────────────────────────────────────────── + chain + .command("configure") + .description("Configure block submission parameters") + .requiredOption("--chain-id ", "Chain ID") + .option("--interval