{"id":"9bc729e1-a7e8-46a3-8412-7fa4dd42f1b2","entityType":"agent","slug":"clawhub-goheesheng-thetanuts","name":"Thetanuts Openclaw","canonicalUrl":"https://www.xpersona.co/agent/clawhub-goheesheng-thetanuts","canonicalPath":"/agent/clawhub-goheesheng-thetanuts","generatedAt":"2026-10-12T19:27:25.672Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T23:42:08.153Z","emptyReason":null},"description":"Trade crypto options on Thetanuts Finance - orderbook fills, RFQ lifecycle, multi-strike structures, real-time WebSocket, wallet management, early settlement... Skill: Thetanuts Openclaw Owner: goheesheng Summary: Trade crypto options on Thetanuts Finance - orderbook fills, RFQ lifecycle, multi-strike structures, real-time WebSocket, wallet management, early settlement... Tags: latest:1.5.4 Version history: v1.5.4 | 2026-05-25T07:46:17.705Z | user Fix manifest updateUrl: now points at Thetanuts-Finance/thetanuts-openclaw (canonical) and the correct filename scripts/update.sh","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 974 downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s175jhk385dyt0nf67dscfct5x83n12p:thetanuts","sourceUrl":"https://clawhub.ai/goheesheng/thetanuts","homepage":"https://clawhub.ai/goheesheng/skills/thetanuts","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/goheesheng/thetanuts","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/goheesheng/skills/thetanuts","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Trade crypto options on Thetanuts Finance - orderbook fills, RFQ lifecycle, multi-strike structures, real-time WebSocket, wallet management, early settlement..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:42:08.153Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:42:08.153Z","emptyReason":null},"stars":null,"forks":null,"downloads":974,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.5.4","tractionLabel":"974 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:42:08.137Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T23:42:08.153Z","lastCrawledAt":"2026-10-11T23:42:08.137Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T23:42:08.137Z","lastVerifiedAt":null,"highlights":[{"version":"1.5.4","createdAt":"2026-05-25T07:46:17.705Z","changelog":"Fix manifest updateUrl: now points at Thetanuts-Finance/thetanuts-openclaw (canonical) and the correct filename scripts/update.sh. v1.5.3 had both wrong org (legacy fork) and wrong filename (update-from-manifest.sh — does not exist), making manifest-driven updates 404. No skill code or SDK changes vs 1.5.3.","fileCount":31,"zipByteSize":118057},{"version":"1.5.3","createdAt":"2026-05-25T06:06:24.717Z","changelog":"Bump @thetanuts-finance/thetanuts-client to 0.2.4. New client.collar module (pricing only; coordinator pending deployment), payable client.option.reclaimCollateral & client.loan.splitOption wrappers that auto-forward on-chain fees, deprecated zero-arg payout() (r12 settles automatically via notifyTradeSettled), trimmed referral/admin surface on optionFactory, removed VaultModule.trigger(). Skill scripts unaffected. See PR #3.","fileCount":30,"zipByteSize":116725},{"version":"1.5.2","createdAt":"2026-05-14T03:26:22.096Z","changelog":"thetanuts v1.5.2 - Updated onboarding instructions and option structure documentation in SKILL.md and README.md. - Minor adjustments to code organization in scripts/lib/load-seed.ts. - No user-facing feature or API changes; primarily documentation and internal structure updates.","fileCount":30,"zipByteSize":115126},{"version":"1.5.1","createdAt":"2026-05-14T03:22:44.687Z","changelog":"thetanuts v1.5.1 - Updated documentation (README.md, CLAUDE.md) for clarity and accuracy. - Minor manifest.json refinements; no breaking changes. - Small script update to scripts/approve-token.ts with minor improvements. - No functional changes to protocol or onboarding logic.","fileCount":30,"zipByteSize":115027},{"version":"1.5.0","createdAt":"2026-05-14T03:16:41.781Z","changelog":"- Startup update check is no longer automatic; code updates now require explicit user approval. - Onboarding flow now runs only safe, read-only wallet status checks automatically. - Users must manually trigger update.sh, and are shown the output before any code changes. - Security and wallet onboarding steps are unchanged, but update handling is now more cautious.","fileCount":30,"zipByteSize":114016},{"version":"1.4.0","createdAt":"2026-05-13T11:44:44.720Z","changelog":"Thetanuts Skill 1.4.0 - Added a new CLAUDE.md file to the repository. - Updated onboarding and security guidance in SKILL.md. - Improved and clarified step-by-step onboarding instructions and startup checks in documentation. - Enhanced package scripts (build-rfq.ts, fill-order.ts, onboard.sh) for improved reliability. - Updated package dependency versions in package.json and package-lock.json. - Documentation refinements for usage, setup, and security reminders.","fileCount":29,"zipByteSize":111837},{"version":"1.2.0","createdAt":"2026-05-01T10:45:51.934Z","changelog":"Initial ClawHub release","fileCount":28,"zipByteSize":108821}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s175jhk385dyt0nf67dscfct5x83n12p:thetanuts","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-goheesheng-thetanuts/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-goheesheng-thetanuts/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-goheesheng-thetanuts/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-goheesheng-thetanuts/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-goheesheng-thetanuts/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-goheesheng-thetanuts/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T19:27:25.671Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-goheesheng-thetanuts/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-goheesheng-thetanuts/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-goheesheng-thetanuts/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-goheesheng-thetanuts/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T23:42:08.153Z","emptyReason":null},"readme":"Skill: Thetanuts Openclaw\n\nOwner: goheesheng\n\nSummary: Trade crypto options on Thetanuts Finance - orderbook fills, RFQ lifecycle, multi-strike structures, real-time WebSocket, wallet management, early settlement...\n\nTags: latest:1.5.4\n\nVersion history:\n\nv1.5.4 | 2026-05-25T07:46:17.705Z | user\n\nFix manifest updateUrl: now points at Thetanuts-Finance/thetanuts-openclaw (canonical) and the correct filename scripts/update.sh. v1.5.3 had both wrong org (legacy fork) and wrong filename (update-from-manifest.sh — does not exist), making manifest-driven updates 404. No skill code or SDK changes vs 1.5.3.\n\nv1.5.3 | 2026-05-25T06:06:24.717Z | user\n\nBump @thetanuts-finance/thetanuts-client to 0.2.4. New client.collar module (pricing only; coordinator pending deployment), payable client.option.reclaimCollateral & client.loan.splitOption wrappers that auto-forward on-chain fees, deprecated zero-arg payout() (r12 settles automatically via notifyTradeSettled), trimmed referral/admin surface on optionFactory, removed VaultModule.trigger(). Skill scripts unaffected. See PR #3.\n\nv1.5.2 | 2026-05-14T03:26:22.096Z | auto\n\nthetanuts v1.5.2\n\n- Updated onboarding instructions and option structure documentation in SKILL.md and README.md.\n- Minor adjustments to code organization in scripts/lib/load-seed.ts.\n- No user-facing feature or API changes; primarily documentation and internal structure updates.\n\nv1.5.1 | 2026-05-14T03:22:44.687Z | auto\n\nthetanuts v1.5.1\n\n- Updated documentation (README.md, CLAUDE.md) for clarity and accuracy.\n- Minor manifest.json refinements; no breaking changes.\n- Small script update to scripts/approve-token.ts with minor improvements.\n- No functional changes to protocol or onboarding logic.\n\nv1.5.0 | 2026-05-14T03:16:41.781Z | auto\n\n- Startup update check is no longer automatic; code updates now require explicit user approval.\n- Onboarding flow now runs only safe, read-only wallet status checks automatically.\n- Users must manually trigger update.sh, and are shown the output before any code changes.\n- Security and wallet onboarding steps are unchanged, but update handling is now more cautious.\n\nv1.4.0 | 2026-05-13T11:44:44.720Z | auto\n\nThetanuts Skill 1.4.0\n\n- Added a new CLAUDE.md file to the repository.\n- Updated onboarding and security guidance in SKILL.md.\n- Improved and clarified step-by-step onboarding instructions and startup checks in documentation.\n- Enhanced package scripts (build-rfq.ts, fill-order.ts, onboard.sh) for improved reliability.\n- Updated package dependency versions in package.json and package-lock.json.\n- Documentation refinements for usage, setup, and security reminders.\n\nv1.2.0 | 2026-05-01T10:45:51.934Z | user\n\nInitial ClawHub release\n\nArchive index:\n\nArchive v1.5.4: 31 files, 118057 bytes\n\nFiles: CLAUDE.md (4323b), manifest.json (2544b), package-lock.json (198075b), package.json (940b), README.md (10581b), scripts/approve-token.ts (12450b), scripts/build-rfq.ts (11518b), scripts/calculate-payout.ts (5344b), scripts/check-orderbook.ts (11803b), scripts/check-rfq-fill.ts (7008b), scripts/create-wallet.ts (4119b), scripts/fetch-orders.ts (3152b), scripts/fill-order.ts (11172b), scripts/get-balance.ts (6912b), scripts/get-mm-pricing.ts (3228b), scripts/get-positions.ts (2972b), scripts/get-prices.ts (1245b), scripts/import-wallet.ts (3730b), scripts/lib/load-seed.ts (2399b), scripts/onboard.sh (5549b), scripts/send-transaction.ts (7077b), scripts/sign-message.ts (4108b), scripts/update.sh (6059b), scripts/wallet-balance.js (8082b), scripts/wallet-create.js (4529b), scripts/wallet-discover.js (3902b), scripts/wallet-import.js (5392b), scripts/wallet-select.js (6559b), skill-card.md (2492b), SKILL.md (82786b), _meta.json (128b)\n\nFile v1.5.4:SKILL.md\n\n---\nname: thetanuts\ndescription: Trade crypto options on Thetanuts Finance - orderbook fills, RFQ lifecycle, multi-strike structures, real-time WebSocket, wallet management, early settlement, referrer fees\nhomepage: https://github.com/Thetanuts-Finance/thetanuts-sdk\nuser-invocable: true\nmetadata: {\"openclaw\":{\"emoji\":\"📈\",\"install\":[{\"type\":\"node\",\"package\":\".\"}]}}\n---\n\n## First-Time Setup (Onboarding Flow)\n\n### Startup Checks\n\nOn a new conversation the agent should:\n\n```\nStep 1: Check wallet status (read-only, safe to run automatically)\n   └─> node scripts/wallet-discover.js\n\nStep 2: Interpret the result:\n   - configured: false → Enter ONBOARDING MODE\n   - configured: true  → Greet user with their address, proceed normally\n```\n\n### Updates (User-Initiated Only)\n\nThe agent must NEVER run `update.sh` automatically. Updates change code that signs\ntransactions, so they require explicit user consent each time.\n\nWhen the user asks to check for or apply updates:\n- Run `bash scripts/update.sh` and surface the full output to the user.\n- If a new version is available, summarize the diff/changelog and ask the user\n  to confirm before applying.\n- If already up to date, say so explicitly. Do not run code-changing commands\n  silently.\n\n### Onboarding Mode (No Wallet Detected)\n\nWhen no wallet is configured, guide the user through setup in this order:\n\n```\nNo wallet detected\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ \"Welcome to Thetanuts Options Trading!  │\n│  Let's get you set up in 3 steps.\"      │\n└─────────────────────────────────────────┘\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ Step 1: Create or import a wallet       │\n│ • New user → wallet-create.js           │\n│ • Have a seed? → wallet-import.js       │\n│                                         │\n│ WARN: Use a DEDICATED wallet.           │\n│ Never reuse your primary wallet seed.   │\n│ Custody stays LOCAL on your machine.    │\n└─────────────────────────────────────────┘\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ Step 2: Verify & fund the wallet        │\n│ • Run wallet-discover.js → show address │\n│ • Run wallet-balance.js --chain         │\n│   base-mainnet                          │\n│ • If zero balance: explain funding      │\n│   - Need ETH on Base for gas fees       │\n│   - Need USDC for PUT trades            │\n│   - Need WETH for CALL trades           │\n│   - Bridge via bridge.base.org          │\n└─────────────────────────────────────────┘\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ Step 3: Market overview & first trade   │\n│ • Fetch prices: get-prices.ts           │\n│ • WebSearch for market news             │\n│ • Ask risk preference (LOW/MED/HIGH)    │\n│ • Show first strategy recommendation    │\n└─────────────────────────────────────────┘\n```\n\n### Welcome Message (After Onboarding or Returning User)\n\nOnce wallet is configured, the agent MUST automatically:\n1. Show wallet address and balances (run `wallet-discover.js` + `wallet-balance.js`)\n2. Fetch current market prices (run `get-prices.ts`)\n3. Show a brief market snapshot with available option types\n\nPresent this without the user asking:\n\n```\nWelcome to Thetanuts Options Trading!\n\nYour wallet: 0x...\nChain: Base Mainnet\nBalances: X ETH (gas) | Y USDC | Z WETH\n\nLive Market:\n• ETH: $X,XXX (24h: +X.X%)\n• BTC: $XX,XXX (24h: +X.X%)\n\nAvailable options: PUT, CALL, spreads, butterflies, condors\n\nWhat would you like to do?\n• \"Show me ETH puts\"      → View available strikes and prices\n• \"Recommend a strategy\"  → I'll check market news and suggest based on your risk preference\n• \"Check my positions\"    → View open trades and P&L on expired ones\n\nNew to options? Just say \"teach me about options\"\n```\n\n### Security Reminders (shown during onboarding)\n\n- **DEDICATED WALLET**: Use a dedicated wallet seed for this integration. Never reuse your primary wallet.\n- **LOCAL CUSTODY**: Your seed phrase stays on your machine. The agent never sends it anywhere.\n- **TRANSACTIONS**: Irreversible once broadcast. Always verify before sending.\n- **APPROVALS**: Token approvals allow contracts to spend your tokens. Only approve trusted contracts.\n- **GAS**: Ensure wallet has ETH on Base for gas fees.\n- **RFQ KEYS**: Back up `.thetanuts-keys/` directory — lost keys cannot decrypt past offers.\n\n---\n\n# Thetanuts Options Trading\n\n## What is TNUT Agent?\n\nTNUT Agent is your AI-powered assistant for trading crypto options on Thetanuts Finance.\n\n**What it does:**\n- Manages local wallets safely (custody stays on your machine)\n- Accesses market intelligence (prices, orderbook, MM quotes)\n- Inspects options and positions\n- Prepares and executes trades through the Thetanuts protocol\n\n**Local-first design:**\n- Wallet custody stays LOCAL - your seed phrase never leaves your machine\n- Signing stays LOCAL - transactions are signed on your device\n- Backend provides intelligence, data, and routing support only\n\n**Capabilities:**\n| Category | What You Can Do |\n|----------|----------------|\n| Wallet | Create, import, check balances |\n| Market Data | Live prices, MM quotes, orderbook orders |\n| Trading | Fill orderbook orders, submit RFQs, approve tokens |\n| Positions | View open positions, calculate payoffs |\n\n---\n\n## Options 101\n\n### What are Options?\n\nOptions are contracts that give you the right (but not obligation) to buy or sell an asset at a specific price by a specific date.\n\n### PUT Options\n\nA **PUT** gives the holder the right to SELL at the strike price.\n\n| Action | You... | Profit When | Risk |\n|--------|--------|-------------|------|\n| **Buy PUT** | Pay premium upfront | Price drops below strike | Lose premium if price stays up |\n| **Sell PUT** | Receive premium | Price stays above strike | Lose if price drops below strike |\n\n**Example:**\n- ETH is at $2000\n- You BUY a $1900 PUT for $10 premium\n- If ETH drops to $1800 → Your PUT is worth $100 (profit: $90)\n- If ETH stays at $2000 → Your PUT expires worthless (loss: $10 premium)\n\n### CALL Options\n\nA **CALL** gives the holder the right to BUY at the strike price.\n\n| Action | You... | Profit When | Risk |\n|--------|--------|-------------|------|\n| **Buy CALL** | Pay premium upfront | Price rises above strike | Lose premium if price stays down |\n| **Sell CALL** | Receive premium | Price stays below strike | Lose if price rises above strike |\n\n**Example:**\n- ETH is at $2000\n- You BUY a $2100 CALL for $15 premium\n- If ETH rises to $2300 → Your CALL is worth $200 (profit: $185)\n- If ETH stays at $2000 → Your CALL expires worthless (loss: $15 premium)\n\n### Key Terms\n\n| Term | Definition |\n|------|------------|\n| **Strike** | The price at which the option can be exercised |\n| **Expiry** | When the option expires (settlement date, 8:00 UTC) |\n| **Premium** | The price paid for the option |\n| **Settlement** | Cash payment based on price difference at expiry |\n| **Collateral** | Funds locked to back the option (for sellers) |\n\n### Collateral Requirements by Option Type\n\n**IMPORTANT:** Different option types require different collateral tokens:\n\n| Option Type | Implementation | Collateral Required |\n|-------------|----------------|---------------------|\n| **PUT** | PUT | USDC (quote asset) |\n| **CALL** | INVERSE_CALL | WETH (base asset) |\n\n- **PUT options**: Collateral in USDC. Formula: `(collateral × 1e8) / strike`\n- **CALL options**: Collateral in WETH. Formula: `collateral / 1e12` (1 WETH = 1 contract)\n\nThe `build-rfq.ts` script automatically selects the correct collateral based on option type.\n\n---\n\n## Multi-Strike Option Structures\n\nBeyond vanilla PUT and CALL options, Thetanuts supports advanced multi-strike structures for sophisticated trading strategies.\n\n### All Option Types\n\n| Type | Strikes | Collateral | Description |\n|------|---------|------------|-------------|\n| **PUT** | 1 | USDC | Standard cash-settled put |\n| **INVERSE_CALL** | 1 | WETH | Cash-settled call (base collateral) |\n| **CALL_SPREAD** | 2 | USDC | Buy lower strike call, sell higher strike call |\n| **PUT_SPREAD** | 2 | USDC | Buy higher strike put, sell lower strike put |\n| **CALL_FLY** | 3 | USDC | Call butterfly - profit near middle strike |\n| **PUT_FLY** | 3 | USDC | Put butterfly - profit near middle strike |\n| **CALL_CONDOR** | 4 | USDC | Call condor - wider profit range |\n| **PUT_CONDOR** | 4 | USDC | Put condor - wider profit range |\n| **IRON_CONDOR** | 4 | USDC | Put spread + call spread (neutral) |\n| **PHYSICAL_CALL** | 1 | WETH | Physically settled call |\n| **PHYSICAL_PUT** | 1 | USDC | Physically settled put |\n\n### Strike Ordering Rules\n\n**CRITICAL:** Strikes must be ordered correctly or the RFQ will fail.\n\n| Structure | Type | Strike Order | Example |\n|-----------|------|--------------|---------|\n| Vanilla | PUT/CALL | N/A (1 strike) | `--strike 1900` |\n| Spread | PUT | Descending (high→low) | `--strikes 1900,1800` |\n| Spread | CALL | Ascending (low→high) | `--strikes 2000,2100` |\n| Butterfly | PUT | Descending | `--strikes 1900,1850,1800` |\n| Butterfly | CALL | Ascending | `--strikes 2000,2050,2100` |\n| Condor | ALL | Always ascending | `--strikes 1800,1900,2100,2200` |\n\n### Collateral Formulas by Structure (Human-Readable)\n\nThese are simplified formulas for quick estimation. For exact on-chain values, use `previewFillOrder()` or `client.utils.calculateCollateral()`.\n\n| Structure | Collateral | Simplified Formula | Example |\n|-----------|-----------|-------------------|---------|\n| **Vanilla PUT** | USDC | `collateral / strike` | $1900 USDC at $1900 strike = 1 contract |\n| **INVERSE_CALL** | WETH | `collateral` (1:1) | 1 WETH = 1 contract |\n| **CALL_SPREAD** | USDC | `collateral / (upper - lower)` | $100 USDC / $100 width = 1 contract |\n| **PUT_SPREAD** | USDC | `collateral / (upper - lower)` | $100 USDC / $100 width = 1 contract |\n| **Butterfly** | USDC | `collateral / (middle - lower)` | $50 USDC / $50 wing = 1 contract |\n| **Condor** | USDC | `collateral / (strike2 - strike1)` | $100 USDC / $100 inner width = 1 contract |\n| **IRON_CONDOR** | USDC | `collateral / max(K2-K1, K4-K3)` | Based on wider wing |\n| **PHYSICAL_CALL** | WETH | Same as INVERSE_CALL | 1 WETH = 1 contract |\n| **PHYSICAL_PUT** | USDC | Same as Vanilla PUT | collateral / strike |\n\n**Key rule:** Only INVERSE_CALL and PHYSICAL_CALL use WETH (base asset). **Everything else uses USDC** — including CALL_SPREAD, CALL_FLY, and CALL_CONDOR.\n\n### When to Use Each Structure\n\n| Structure | Market View | Risk Level | Risk/Reward | Best For |\n|-----------|-------------|------------|-------------|----------|\n| **PUT** | Bearish | HIGH | Large profit (up to strike - premium), lose premium | Strong downside conviction |\n| **CALL** | Bullish | HIGH | Unlimited profit, lose premium | Strong upside conviction |\n| **PUT_SPREAD** | Moderately bearish | MEDIUM | Capped profit/loss | Cheaper than vanilla put |\n| **CALL_SPREAD** | Moderately bullish | MEDIUM | Capped profit/loss | Cheaper than vanilla call |\n| **PUT_FLY** | Neutral/range-bound | LOW | High reward if pinned, tiny cost | Low cost, precise target |\n| **CALL_FLY** | Neutral/range-bound | LOW | High reward if pinned, tiny cost | Low cost, precise target |\n| **CONDOR** | Neutral/range-bound | MEDIUM | Lower reward, wider range | More forgiving than fly |\n| **IRON_CONDOR** | Neutral | LOW | Collect premium both sides | Range-bound markets |\n| **PHYSICAL_CALL** | Bullish (want delivery) | HIGH | Receive underlying asset | Physical settlement needed |\n| **PHYSICAL_PUT** | Bearish (want delivery) | HIGH | Deliver underlying asset | Physical settlement needed |\n\n### Risk-Categorized Strategy Recommendations\n\nWhen a user asks for a strategy recommendation, **FIRST ask about their risk preference**, then match to appropriate strategies within that tier.\n\n#### Step 1: Ask the User's Risk Level\n\nPresent these three options:\n\n| Risk Level | What It Means | Max Loss | Profit Potential |\n|------------|---------------|----------|-----------------|\n| **LOW** | Defined max loss, premium collection, high probability of small wins | Capped & known upfront | Capped but consistent |\n| **MEDIUM** | Spreads with balanced risk/reward, moderate probability | Capped at spread width | Capped at spread width |\n| **HIGH** | Full directional exposure, low probability of large wins | Full premium (buyer) or very large (seller) | Unlimited (buyer) |\n\n#### Step 2: Strategy Decision Tree by Risk Level\n\n```\nUser wants a strategy recommendation\n        │\n        ▼\n┌──────────────────────────────────┐\n│ Step 1: Check market news        │\n│ (WebSearch - see News section)   │\n└──────────────────────────────────┘\n        │\n        ▼\n┌──────────────────────────────────┐\n│ Step 2: Ask risk level           │\n│ LOW / MEDIUM / HIGH              │\n└──────────────────────────────────┘\n        │\n        ├── LOW RISK\n        │   │\n        │   ├── Neutral view ──────► IRON_CONDOR (sell)\n        │   │                        Collect premium both sides, profit if range-bound\n        │   │                        Max loss: spread width - premium\n        │   │                        Max gain: premium collected\n        │   │                        Win prob: ~60-70% (price stays in range)\n        │   │\n        │   ├── Slightly bullish ──► PUT_FLY (buy) or Sell PUT via orderbook\n        │   │                        Butterfly: tiny cost, big payout if pinned\n        │   │                        Max loss: premium paid (very small)\n        │   │                        Max gain: wing width - premium\n        │   │\n        │   ├── Slightly bearish ──► CALL_FLY (buy) or Sell CALL via orderbook\n        │   │                        Same as above, opposite direction\n        │   │\n        │   └── Range-bound ───────► Butterfly (CALL_FLY / PUT_FLY)\n        │                            Cheapest defined-risk play\n        │                            Max loss: premium paid (~$3-5/contract)\n        │                            Max gain: wing width (~$47-50/contract)\n        │\n        ├── MEDIUM RISK\n        │   │\n        │   ├── Bullish ──────────► CALL_SPREAD (buy)\n        │   │                       Cheaper than vanilla call, capped both sides\n        │   │                       Max loss: premium paid\n        │   │                       Max gain: spread width - premium\n        │   │                       Risk/Reward: typically 1:1 to 1:3\n        │   │\n        │   ├── Bearish ─────────► PUT_SPREAD (buy)\n        │   │                       Cheaper than vanilla put, capped both sides\n        │   │                       Max loss: premium paid\n        │   │                       Max gain: spread width - premium\n        │   │\n        │   └── Range-bound ─────► CONDOR (CALL_CONDOR / PUT_CONDOR)\n        │                          Wider profit range than butterfly\n        │                          Max loss: wing width - premium collected\n        │                          Max gain: premium collected (sell) or inner width (buy)\n        │\n        └── HIGH RISK\n            │\n            ├── Bullish ──────────► CALL (vanilla buy) / INVERSE_CALL\n            │                       Unlimited profit potential if price rises\n            │                       Max loss: full premium paid\n            │                       Max gain: unlimited\n            │\n            ├── Bearish ─────────► PUT (vanilla buy)\n            │                       Unlimited profit if price crashes\n            │                       Max loss: full premium paid\n            │                       Max gain: strike - premium (if price → 0)\n            │\n            └── Selling premium ──► Naked PUT sell or CALL sell\n                                    Collect premium, very large risk if wrong\n                                    Max loss: strike price (PUT) or unlimited (CALL)\n                                    Max gain: premium collected\n```\n\n#### Risk Summary Card (Always Show When Recommending)\n\nEvery strategy recommendation MUST include this card:\n\n```\n┌────────────────────────────────────────────────────┐\n│ Strategy:  [STRATEGY NAME]                         │\n│ Risk:      [LOW / MEDIUM / HIGH]                   │\n│ Direction: [BULLISH / BEARISH / NEUTRAL]           │\n├────────────────────────────────────────────────────┤\n│ Max Loss:  $[amount] ([description])               │\n│ Max Gain:  $[amount] ([description])               │\n│ Break-even: $[price]                               │\n│ Win Zone:  Price between $[low] and $[high]        │\n│ Collateral: [amount] [token]                       │\n└────────────────────────────────────────────────────┘\n```\n\n#### Collateral Efficiency Comparison\n\nDifferent structures give you different exposure per dollar of collateral:\n\n| Structure | $100 Collateral Gets You | Relative Efficiency | Risk Level |\n|-----------|-------------------------|---------------------|------------|\n| **Vanilla PUT** (at $2000 strike) | ~0.05 contracts | 1x (baseline) | HIGH |\n| **PUT_SPREAD** ($100 width) | 1 contract | **20x more** | MEDIUM |\n| **Butterfly** ($50 wing width) | 2 contracts | **40x more** | LOW |\n| **Condor** ($100 inner width) | 1 contract | **20x more** | MEDIUM |\n| **Iron Condor** ($100 inner width) | 1 contract | **20x more** | LOW |\n\n**Key Insight:** For users with small collateral (under $100), LOW and MEDIUM risk strategies (spreads, butterflies) provide significantly more market exposure than HIGH risk vanilla options.\n\n#### Strategy Selection Inputs\n\nWhen recommending a strategy, consider these inputs in order of priority:\n\n| Priority | Input | How to Determine | Impact on Recommendation |\n|----------|-------|-----------------|-------------------------|\n| **1** | **Risk Level** | Ask user: low, medium, or high? | PRIMARY filter — determines available strategies |\n| **2** | **Market View** | Ask user: bullish, bearish, or neutral? | Determines direction within risk tier |\n| **3** | **News/Events** | WebSearch for recent market events | Informs conviction level and timing |\n| **4** | **Collateral Size** | Check wallet balance | Small = prefer spreads/butterflies for efficiency |\n| **5** | **Conviction Level** | Ask: strong view or moderate? | High conviction may justify higher risk tier |\n| **6** | **Expiry Timeframe** | Check available expiries | Short-term neutral = butterfly, Longer = condor |\n\n### News & Events Integration\n\n**Before EVERY strategy recommendation, the agent MUST search for recent market-moving events.** This ensures context-aware recommendations, not purely technical ones.\n\n#### How to Fetch Market News\n\nUse WebSearch with these queries (run at least 2):\n\n| Query | Purpose |\n|-------|---------|\n| `\"crypto market news today\"` | General market sentiment |\n| `\"ethereum price catalyst\"` or `\"bitcoin price catalyst\"` | Asset-specific events |\n| `\"FOMC meeting crypto\"` or `\"CPI inflation crypto\"` | Macro events affecting crypto |\n| `\"crypto options expiry this week\"` | Options-specific events (pin risk, gamma squeeze) |\n| `\"ethereum upgrade\"` or `\"bitcoin ETF flows\"` | Protocol/regulatory catalysts |\n\nIf WebSearch returns a relevant article, use **WebFetch** to get deeper details.\n\n#### Translating News to Strategy\n\n| Event Type | Expected Impact | Suggested Direction | Risk Note |\n|------------|----------------|--------------------|--------------------|\n| Rate cut / dovish Fed | Bullish | CALL-side strategies | MEDIUM — market may \"sell the news\" |\n| Rate hike / hawkish Fed | Bearish | PUT-side strategies | MEDIUM — may already be priced in |\n| Major exchange hack/exploit | Bearish (short-term) | PUT-side strategies | HIGH — volatility spike |\n| ETF approval / large inflows | Bullish | CALL-side strategies | MEDIUM — catalyst may be priced in |\n| Protocol upgrade (successful) | Bullish for that asset | CALL-side strategies | LOW-MEDIUM |\n| Regulatory crackdown | Bearish | PUT-side or neutral | HIGH — uncertainty and fear |\n| Large options expiry (high OI) | Neutral → pin risk | Butterflies / Condors (LOW risk) | LOW — defined risk |\n| No significant news | Neutral / range-bound | Premium selling (Iron Condor) | LOW — collect theta decay |\n| Conflicting signals | Uncertain | Neutral structures or wait | Reduce size, use LOW risk |\n\n#### News-Informed Recommendation Template\n\nWhen presenting a strategy recommendation, always include market context:\n\n```\nMarket Context (from recent news):\n• [Event 1]: [brief description] → [bullish/bearish/neutral]\n• [Event 2]: [brief description] → [bullish/bearish/neutral]\n\nOverall market bias: [BULLISH / BEARISH / NEUTRAL / UNCERTAIN]\n\nBased on [RISK LEVEL] risk preference and current market conditions:\n[Strategy recommendation with Risk Summary Card]\n```\n\n---\n\n### Multi-Strike RFQ Examples\n\n**2-Strike Spread (CALL_SPREAD):**\n```bash\nnpx tsx scripts/build-rfq.ts \\\n  --underlying ETH \\\n  --type CALL \\\n  --strikes 2000,2100 \\\n  --expiry 1774684800 \\\n  --contracts 1 \\\n  --direction buy\n```\n*Buy $2000 call, sell $2100 call. Max profit = $100 - premium. Max loss = premium.*\n\n**3-Strike Butterfly (PUT_FLY):**\n```bash\nnpx tsx scripts/build-rfq.ts \\\n  --underlying ETH \\\n  --type PUT \\\n  --strikes 1900,1850,1800 \\\n  --expiry 1774684800 \\\n  --contracts 1 \\\n  --direction buy\n```\n*Profit maximized if ETH settles at $1850. Low cost, high reward if pinned.*\n\n**4-Strike Condor (IRON_CONDOR):**\n```bash\nnpx tsx scripts/build-rfq.ts \\\n  --underlying ETH \\\n  --type PUT \\\n  --strikes 1800,1900,2100,2200 \\\n  --expiry 1774684800 \\\n  --contracts 1 \\\n  --direction sell\n```\n*Sell iron condor. Collect premium if ETH stays between $1900-$2100.*\n\n---\n\n## OptionBook vs RFQ (Factory)\n\nThe SDK supports two trading systems. Choose based on your use case:\n\n| | **OptionBook** | **RFQ (Factory)** |\n|---|---|---|\n| **What** | Fill existing market-maker orders | Create custom options via sealed-bid auction |\n| **When to use** | Quick trades on listed options | Custom strikes, expiries, multi-leg structures |\n| **Structures** | Vanilla only | Vanilla, spread, butterfly, condor, iron condor |\n| **Key methods** | `fillOrder()`, `previewFillOrder()` | `buildRFQRequest()`, `requestForQuotation()` |\n| **Pricing** | Order prices from `fetchOrders()` | MM pricing from `getAllPricing()` |\n| **Data source** | Book indexer (`/api/v1/book/`) | Factory indexer (`/api/v1/factory/`) |\n| **User data** | `getUserPositionsFromIndexer()` | `getUserRfqs()`, `getUserOptionsFromRfq()` |\n| **Stats** | `getBookProtocolStats()`, `getBookDailyStats()` | `getFactoryProtocolStats()`, `getFactoryDailyStats()` |\n| **Collateral** | Paid upfront by taker | `collateralAmount = 0` (held by factory) |\n| **Settlement** | Cash only | Cash or physical |\n\n### Orderbook Trading\n\n**What it is:** Fill existing orders posted by market makers - instant execution.\n\n```\nYou → Fill existing order → Instant trade\n```\n\n**Best for:**\n- Standard strikes/expiries with existing liquidity\n- Quick trades when you see a good price\n- Smaller to medium sizes\n\n**How it works:**\n1. Fetch orderbook: `npx tsx scripts/fetch-orders.ts --type PUT`\n2. See available BIDs (buyers) and ASKs (sellers)\n3. Fill the order you want: `npx tsx scripts/fill-order.ts --order-index 0 --collateral 10 --execute` (reads `WDK_SEED` from `.env`)\n\n### RFQ (Request for Quote)\n\n**What it is:** Request a custom quote from market makers - they respond within 45 seconds.\n\n```\nYou → Submit RFQ → MM sees it → MM sends encrypted offer → You settle (or accept early)\n```\n\n**Best for:**\n- Custom strikes/expiries not on orderbook\n- No existing liquidity at your terms\n- Larger sizes (MMs may offer better pricing)\n- Multi-leg structures (spreads, butterflies, condors)\n\n**How it works:**\n1. Build RFQ: `npx tsx scripts/build-rfq.ts --underlying ETH --type PUT --strike 1900 --expiry <timestamp> --contracts 0.1 --direction buy`\n2. Send transaction with the returned `to` and `data`\n3. Wait up to 45 seconds for MM response\n4. Settle when offer received (or accept early - see Early Settlement)\n\n### Decision Matrix\n\n| Scenario | Use | Why |\n|----------|-----|-----|\n| \"I see a good price on orderbook\" | **Orderbook** | Instant execution |\n| \"Standard strike, liquidity exists\" | **Orderbook** | Faster, simpler |\n| \"Custom strike not on orderbook\" | **RFQ** | Only way to get it |\n| \"Large size trade\" | **RFQ** | May get better pricing |\n| \"Need it filled NOW\" | **Orderbook** | RFQ takes up to 6 min |\n| \"No orders at my strike\" | **RFQ** | Request custom quote |\n| \"Multi-leg structure\" | **RFQ** | Orderbook only supports vanilla |\n| \"Physical settlement\" | **RFQ** | Orderbook is cash-only |\n\n**Agent Decision Logic:**\n1. First, check orderbook for liquidity at your strike\n2. If liquidity exists → recommend Orderbook\n3. If no liquidity → recommend RFQ and explain why\n\n---\n\n## Agent Decision Logic (Orderbook-First)\n\nWhen a user wants to trade, the agent ALWAYS checks the orderbook first before recommending a trading method.\n\n### Decision Flowchart\n\n```\nUser wants to trade\n        │\n        ▼\n┌─────────────────────────┐\n│  check-orderbook.ts     │\n│  Check for liquidity    │\n└─────────────────────────┘\n        │\n        ▼\n┌─────────────────────────┐\n│ Exact strike match?     │\n└─────────────────────────┘\n    │           │\n   Yes          No\n    │           │\n    ▼           ▼\n┌─────────┐  ┌─────────────────┐\n│Orderbook│  │Nearby strikes?  │\n│  Fill   │  │(within ±5%)     │\n└─────────┘  └─────────────────┘\n                 │         │\n                Yes        No\n                 │         │\n                 ▼         ▼\n           ┌─────────┐  ┌─────┐\n           │Show     │  │ RFQ │\n           │options  │  │     │\n           └─────────┘  └─────┘\n```\n\n### How to Use check-orderbook.ts\n\nBefore recommending orderbook or RFQ, run:\n```bash\nnpx tsx scripts/check-orderbook.ts --underlying ETH --type PUT --strike 1900 --expiry 1774684800 --direction sell\n```\n\nThe script returns:\n- `recommendation`: \"orderbook\" or \"rfq\"\n- `reason`: Explanation of why\n- `orderbookOrders`: Matching orders with prices\n- `nearbyStrikes`: Alternative strikes if exact not found\n- `nextStep`: Command to run next\n\n### Example Scenarios\n\n**Scenario 1: Liquidity Found**\n```\nUser: \"Sell a PUT at $1900\"\nAgent: Runs check-orderbook.ts\nResult: {\n  \"recommendation\": \"orderbook\",\n  \"reason\": \"Found orderbook liquidity at strike $1900. Best bid: $8.08. Available: 75 contracts.\"\n}\nAgent: \"Found a buyer at $8.08/contract. Use orderbook for instant execution.\"\n```\n\n**Scenario 2: No Exact Match, Nearby Available**\n```\nUser: \"Sell a PUT at $1850\"\nAgent: Runs check-orderbook.ts\nResult: {\n  \"recommendation\": \"rfq\",\n  \"reason\": \"No orderbook liquidity at $1850. Nearby strikes: $1900 (+2.7%), $1925 (+4.1%)\"\n}\nAgent: \"No orders at $1850, but $1900 is available (+2.7%). Would you like that, or submit RFQ for $1850?\"\n```\n\n**Scenario 3: Partial Fill**\n```\nUser: \"Sell 100 contracts at $1900\"\nAgent: Runs check-orderbook.ts --size 100\nResult: {\n  \"recommendation\": \"orderbook\",\n  \"partialFillAvailable\": true,\n  \"partialSize\": 75,\n  \"reason\": \"Found 75 contracts (you requested 100). Partial fill available.\"\n}\nAgent: \"Only 75 contracts available on orderbook. Fill partial now, or use RFQ for full 100?\"\n```\n\n---\n\n## Trading Workflows\n\n### Workflow 1: Fill an Orderbook Order (Instant)\n\n```\nStep 1: Check wallet\n   └─> node scripts/wallet-discover.js\n\nStep 2: Check balance\n   └─> node scripts/wallet-balance.js --chain base-mainnet --tokens 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\n\nStep 3: Fetch orderbook\n   └─> npx tsx scripts/fetch-orders.ts --type PUT\n\nStep 4: Preview fill (see what you'll get)\n   └─> npx tsx scripts/fill-order.ts --order-index 0 --collateral 10\n\nStep 5: Execute fill (reads WDK_SEED from .env — never pass seed on CLI)\n   └─> npx tsx scripts/fill-order.ts --order-index 0 --collateral 10 --execute --wait\n```\n\n### Workflow 2: Submit an RFQ (Custom Terms)\n\n```\nStep 1: Check wallet & balance (same as above)\n\nStep 2: Get MM pricing to see market levels\n   └─> npx tsx scripts/get-mm-pricing.ts ETH --type PUT\n\nStep 3: Build RFQ with your terms\n   └─> npx tsx scripts/build-rfq.ts --underlying ETH --type PUT --strike 1900 --expiry 1774684800 --contracts 0.1 --direction buy\n\nStep 4: Approve tokens (if selling/first time — prefer exact amount over --max)\n   └─> npx tsx scripts/approve-token.ts --token 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 --spender 0x8118daD971dEbffB49B9280047659174128A8B94 --amount <exact> --wait\n   (For unlimited approvals, add --max --confirm-max. Seed read from WDK_SEED env.)\n\nStep 5: Send RFQ transaction (reads WDK_SEED from .env)\n   └─> npx tsx scripts/send-transaction.ts --to <from step 3> --data <from step 3> --wait\n\nStep 6: Wait for MM offer (up to 45 seconds)\n\nStep 7: Verify RFQ fill\n   └─> npx tsx scripts/check-rfq-fill.ts --address <wallet> --ticker <expected> --since <submission_timestamp>\n   └─> If filled: Shows position details\n   └─> If not filled: Shows suggestions for next steps\n```\n\n### Workflow 3: Check Positions\n\n```\nnpx tsx scripts/get-positions.ts 0xYourWalletAddress\n```\n\n### Workflow 3b: Portfolio Performance & ROI Review\n\nAfter trades expire, show the user their realized returns. This workflow uses existing scripts — no new tools needed.\n\n#### How to Calculate ROI\n\n```\nStep 1: Fetch all positions\n   └─> npx tsx scripts/get-positions.ts <wallet_address>\n\nStep 2: Categorize by status\n   - Settled/expired positions → REALIZED P&L\n   - Active/open positions → UNREALIZED (show separately)\n\nStep 3: For each expired position\n   - Use the pnlUsd field from get-positions.ts (if available)\n   - If pnlUsd is missing, calculate manually:\n     └─> For PUT/CALL: npx tsx scripts/calculate-payout.ts --type <PUT|CALL> --strike <strike> --settlement <settlement_price> --contracts <amount> [--is-buyer]\n     └─> For spreads/butterflies/condors: use client.option.calculatePayout(optionAddress, settlementPrice) on-chain\n         (Note: calculate-payout.ts only supports vanilla PUT/CALL — multi-strike payouts need the SDK on-chain method)\n\nStep 4: Aggregate and present using the template below\n```\n\n#### ROI Calculation Logic\n\n**For BUYERS (paid premium):**\n- Cost basis = premium paid (collateral committed)\n- Return = pnlUsd or calculated payout\n- ROI = (return / cost_basis) × 100%\n- Expired worthless → ROI = **-100%**\n- Example: Paid $10 premium, option settled for $25 payout → ROI = +150%\n\n**For SELLERS (received premium):**\n- Credit received = premium collected\n- Settlement cost = pnlUsd (negative = you paid out)\n- ROI = (net_pnl / collateral_locked) × 100%\n- Expired worthless for buyer (good for seller) → ROI = +(premium / collateral) × 100%\n- Example: Collected $8 premium on $100 collateral, expired OTM → ROI = +8%\n\n#### Portfolio Performance Summary Template\n\nPresent results in this format:\n\n```\nPortfolio Performance Summary\n══════════════════════════════════════════════════════════\nWallet: 0x...\nPeriod: [earliest expired trade] to [latest expired trade]\n\nREALIZED P&L (Expired Positions)\n┌──────────────────────┬──────┬─────────┬─────────┐\n│ Trade                │ Side │ P&L     │ ROI     │\n├──────────────────────┼──────┼─────────┼─────────┤\n│ ETH-28MAR-2000-P     │ SELL │ +$12.50 │ +6.25%  │\n│ ETH-28MAR-2100-C     │ BUY  │ -$8.00  │ -100%   │\n│ ETH-04APR-1900/1800  │ BUY  │ +$45.00 │ +150%   │\n├──────────────────────┼──────┼─────────┼─────────┤\n│ TOTAL                │      │ +$49.50 │         │\n└──────────────────────┴──────┴─────────┴─────────┘\n\nWin rate: 2/3 (66.7%)\nAverage P&L per trade: +$16.50\nBest trade:  ETH PUT_SPREAD (+$45.00, +150%)\nWorst trade: ETH CALL (-$8.00, expired worthless)\n\nOPEN POSITIONS\n┌──────────────────────┬──────┬───────────┬──────────┬────────┐\n│ Trade                │ Side │ Contracts │ Expiry   │ Status │\n├──────────────────────┼──────┼───────────┼──────────┼────────┤\n│ ETH-18APR-2000-P     │ BUY  │ 0.5       │ Apr 18   │ Active │\n└──────────────────────┴──────┴───────────┴──────────┴────────┘\n```\n\n#### When to Show Performance\n\n- User asks \"how are my trades doing?\", \"show my P&L\", \"what's my ROI?\"\n- User asks \"check my positions\" AND has expired positions → include ROI for expired ones\n- Proactively mention performance when user has recently expired positions they haven't reviewed\n- After any trade settles, offer to show the outcome: \"Your ETH PUT just expired. Want to see how it did?\"\n\n---\n\n### Workflow 4: Early Settlement (Accept MM Offer Before Deadline)\n\nAfter a market maker submits an encrypted offer to your RFQ, you can decrypt and accept it early — no need to wait for the full deadline.\n\n```\nStep 1: Submit RFQ (Workflow 2, Steps 1-5)\n\nStep 2: MM sends encrypted offer (within 45 seconds)\n\nStep 3: Decrypt the offer using your ECDH keypair\n   └─> Uses client.rfqKeys.decryptOffer()\n\nStep 4: Accept the offer early\n   └─> Uses client.optionFactory.encodeSettleQuotationEarly(quotationId, offerAmount, nonce, offeror)\n   └─> Send transaction with returned {to, data}\n```\n\n**Real examples:**\n- RFQ 784 (PUT BUTTERFLY $1700/$1800/$1900): MM offered at 04:05:45 UTC, early settle at 04:07:09 UTC (3 min before deadline)\n  - TX: `0x105f75cdfb64a3796100f6d667bc4f7fec3836d2b5aa5c43b66073a1b40964ee`\n- RFQ 785 (PUT CONDOR $1600/$1700/$1800/$1900): MM offered 0.003248 USDC, early settle at 04:15:00 UTC\n  - TX: `0xa89fb6dbad43b430399bbdec878927185e602b7df9b5390f71d2d11c33e4d850`\n\n### Workflow 5: Cancel RFQ & Claim Refund\n\nIf a user wants to cancel an active RFQ before it settles, or if no MM responded:\n\n```\n┌─────────────────────────────────────────────────────┐\n│ RFQ submitted                                       │\n│         │                                           │\n│         ▼                                           │\n│ ┌─────────────────────┐                             │\n│ │ MM responded?       │                             │\n│ └─────────────────────┘                             │\n│     │           │                                   │\n│    Yes          No                                  │\n│     │           │                                   │\n│     ▼           ▼                                   │\n│ ┌─────────┐  ┌──────────────────────────────┐       │\n│ │ Accept  │  │ RFQ expires with no offers   │       │\n│ │ or      │  │ → No collateral was locked   │       │\n│ │ Cancel? │  │ → Nothing to refund          │       │\n│ └─────────┘  └──────────────────────────────┘       │\n│   │     │                                           │\n│  Accept Cancel                                      │\n│   │     │                                           │\n│   ▼     ▼                                           │\n│ Settle  Cancel RFQ                                  │\n│         └─> cancelQuotation(quotationId)            │\n│         └─> Collateral returned to wallet           │\n└─────────────────────────────────────────────────────┘\n```\n\n#### Cancel an Active RFQ\n\n```typescript\n// Cancel before settlement — requester only\nconst { to, data } = client.optionFactory.encodeCancelQuotation(quotationId);\n// Send transaction with {to, data} via send-transaction.ts\n```\n\n#### Cancel an Offer (Market Maker Side)\n\n```typescript\n// MM cancels their offer before settlement\nconst { to, data } = client.optionFactory.encodeCancelOfferForQuotation(quotationId);\n```\n\n#### Check RFQ Status\n\n```typescript\n// Query current state of an RFQ\nconst quotation = await client.optionFactory.getQuotation(quotationId);\n// quotation status: 'active' | 'settled' | 'cancelled'\n// quotation.isActive — whether RFQ is still open\n// quotation.currentWinner — winning offeror's address\n```\n\n#### Refund Rules\n\n| Scenario | Collateral | What Happens |\n|----------|-----------|-------------|\n| **Buy RFQ, no MM responds** | No collateral locked by buyer | Nothing to refund — buyer only pays premium if settled |\n| **Buy RFQ, user cancels before settlement** | No collateral locked | RFQ cancelled, no action needed |\n| **Sell RFQ, no MM responds** | Collateral held by factory | RFQ expires, collateral returned automatically |\n| **Sell RFQ, user cancels before settlement** | Collateral held by factory | `cancelQuotation()` releases collateral back to wallet |\n| **Sell RFQ, settled** | Collateral locked in option | Collateral backs the option until expiry/settlement |\n| **Orderbook fill (buy or sell)** | Collateral paid/locked at fill | Irreversible — no cancellation for orderbook fills |\n\n**IMPORTANT:** Orderbook fills are INSTANT and IRREVERSIBLE. Only RFQs can be cancelled (before settlement).\n\n---\n\n### Buy vs Sell Order: Collateral & Token Flow\n\n**No ETH is sent as transaction value for option trades.** All collateral flows happen via ERC-20 token transfers (USDC, WETH). ETH is only used for gas fees.\n\n#### When BUYING Options\n\n```\nBuyer Flow:\n1. Premium is paid in collateral tokens (USDC for PUTs, WETH for CALLs)\n2. Token approval needed: approve-token.ts (one-time per token/spender)\n3. Collateral is transferred to the contract when the trade executes\n4. If RFQ: collateralAmount = 0 in the request (factory holds it)\n5. If Orderbook: collateral deducted at fill time\n\nWhat you PAY:   Premium (in USDC or WETH) + gas (in ETH)\nWhat you GET:   Option position (right to profit if price moves your way)\nAt expiry:      Payout if in-the-money, or nothing if out-of-the-money\n```\n\n#### When SELLING Options\n\n```\nSeller Flow:\n1. Collateral is LOCKED to back the option (USDC for PUTs, WETH for CALLs)\n2. Token approval needed: approve-token.ts (one-time per token/spender)\n3. Collateral transferred to contract and held until expiry\n4. Premium is received from buyer\n\nWhat you PAY:   Collateral lock (USDC or WETH) + gas (in ETH)\nWhat you GET:   Premium received upfront\nAt expiry:      Keep premium if OTM, or payout difference if ITM\n                Remaining collateral returned after settlement\n```\n\n#### Token Requirements Summary\n\n| Action | Collateral Token | Gas Token | Approval Needed |\n|--------|-----------------|-----------|-----------------|\n| **Buy PUT** | USDC (premium) | ETH | USDC → OptionFactory/OptionBook |\n| **Buy CALL** | WETH (premium) | ETH | WETH → OptionFactory/OptionBook |\n| **Sell PUT** | USDC (collateral lock) | ETH | USDC → OptionFactory/OptionBook |\n| **Sell CALL** | WETH (collateral lock) | ETH | WETH → OptionFactory/OptionBook |\n\n**Always check balance BEFORE trading:**\n```bash\n# Check USDC balance (for PUTs)\nnode scripts/wallet-balance.js --chain base-mainnet --tokens 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\n\n# Check WETH balance (for CALLs)\nnode scripts/wallet-balance.js --chain base-mainnet --tokens 0x4200000000000000000000000000000000000006\n\n# Check ETH balance (for gas)\nnode scripts/wallet-balance.js --chain base-mainnet\n```\n\n### Winner Selection & Payout by Option Type\n\nThe **winner** (`winningOfferor`) in an RFQ is always the market maker with the best offer price. Winner selection works the **same way for ALL option types** — PUT, CALL, spreads, butterflies, condors, iron condors, and physical options.\n\n#### Winner Fields in SDK\n\nThe winner address appears in three places depending on context:\n\n| Context | Field | When to Use |\n|---------|-------|-------------|\n| **On-chain state** | `QuotationState.currentWinner` | During active RFQ — the current best offeror |\n| **State API** | `StateRfq.winner` | After settlement — the final winning MM |\n| **Settlement event** | `QuotationSettledEvent.winningOfferor` | Emitted when RFQ settles |\n\n#### Payout Formulas by Option Type\n\n| Type | Buyer Payout Formula | Max Payout | Settlement |\n|------|---------------------|------------|------------|\n| **PUT** | `max(strike - price, 0) × contracts` | strike × contracts | Cash (USDC) |\n| **INVERSE_CALL** | `max(price - strike, 0) × contracts` | Unlimited | Cash (WETH) |\n| **CALL_SPREAD** | `min(max(price - K1, 0), K2 - K1) × contracts` | (K2 - K1) × contracts | Cash (USDC) |\n| **PUT_SPREAD** | `min(max(K1 - price, 0), K1 - K2) × contracts` | (K1 - K2) × contracts | Cash (USDC) |\n| **CALL_FLY** | Peaks at middle strike, 0 at wings | wing width × contracts | Cash (USDC) |\n| **PUT_FLY** | Peaks at middle strike, 0 at wings | wing width × contracts | Cash (USDC) |\n| **CALL_CONDOR** | Flat max between K2-K3, tapers at wings | inner width × contracts | Cash (USDC) |\n| **PUT_CONDOR** | Flat max between K2-K3, tapers at wings | inner width × contracts | Cash (USDC) |\n| **IRON_CONDOR** | Profit if price between K2-K3 | premium collected | Cash (USDC) |\n| **PHYSICAL_CALL** | Buyer receives underlying asset | N/A (delivery) | Physical |\n| **PHYSICAL_PUT** | Buyer delivers underlying, receives USDC | N/A (delivery) | Physical |\n\n#### SDK Payout Calculation Support\n\nThe SDK utility `client.utils.calculatePayout()` supports these types:\n\n```typescript\ntype PayoutType = 'call' | 'put' | 'call_spread' | 'put_spread';\n```\n\n**For butterflies, condors, and iron condors**: use `client.option.calculatePayout(optionAddress, settlementPrice)` which calculates on-chain for any option type, or use `client.option.simulatePayout()` for simulation.\n\n```typescript\n// For vanilla and spreads — use utility function\nconst payout = client.utils.calculatePayout({\n  type: 'call_spread',\n  strikes: [2000n * 10n**8n, 2100n * 10n**8n],\n  settlementPrice: 2050n * 10n**8n,\n  numContracts: 1n * 10n**18n,\n});\n\n// For butterflies, condors, iron condors — use on-chain calculation\nconst payout = await client.option.calculatePayout(optionAddress, settlementPrice);\n```\n\n#### Settlement Events\n\nWhen an option settles at expiry, these events are emitted:\n\n| Event | Fields | Description |\n|-------|--------|-------------|\n| `OptionExpiredEvent` | settlementPrice | Oracle records the final price |\n| `OptionPayoutEvent` | buyer, amountPaidOut | Buyer receives payout (if ITM) |\n| `CollateralReturnedEvent` | seller, amountReturned | Seller gets remaining collateral back |\n\n> **r12 settlement is automatic.** On the Base_r12 deployment, options no longer expose a zero-arg `payout()` write entrypoint — settlement fires from the factory's `notifyTradeSettled` callback once the oracle records the final price. SDK ≥ 0.2.4 throws `INVALID_PARAMS` on any legacy `payout()` call; check status with `client.option.getOptionInfo(optionAddress).settled` and read amounts with the view methods above. Reclaiming collateral after settlement uses `client.option.reclaimCollateral(optionAddress, ownedOption)` — the SDK auto-forwards `getReclaimFee()` as `msg.value`.\n\n#### Physical Settlement (PHYSICAL_CALL / PHYSICAL_PUT)\n\nPhysical options involve actual asset delivery instead of cash settlement:\n\n| Type | Buyer Pays | Buyer Receives | Seller Provides |\n|------|-----------|----------------|-----------------|\n| **PHYSICAL_CALL** | strike × contracts (USDC) | contracts of underlying (WETH) | WETH collateral |\n| **PHYSICAL_PUT** | contracts of underlying (WETH) | strike × contracts (USDC) | USDC collateral |\n\nThe SDK has dedicated builders for physical options:\n- `client.optionFactory.buildPhysicalRFQ()`\n- `client.optionFactory.buildPhysicalSpreadRFQ()`\n- `client.optionFactory.buildPhysicalButterflyRFQ()`\n- `client.optionFactory.buildPhysicalCondorRFQ()`\n\n---\n\n## Understanding Collateral vs Contracts\n\nWhen viewing orders, `availableAmount` represents the **maker's collateral budget**, not the number of contracts. The actual number of purchasable contracts depends on the option type and collateral requirements.\n\n### Collateral Formulas by Option Type (On-Chain)\n\nThese are the on-chain formulas using raw decimal values. For practical use, prefer `previewFillOrder()` which handles all conversions automatically.\n\n| Option Type | # Strikes | Collateral | On-Chain Formula | Example |\n|-------------|-----------|-----------|-----------------|---------|\n| **Vanilla PUT** | 1 | USDC | `(collateral × 1e8) / strike` | 10,000 USDC at $95k = 0.105 contracts |\n| **INVERSE_CALL** | 1 | WETH | `collateral / 1e12` | 1 WETH = 1 contract |\n| **CALL_SPREAD** | 2 | USDC | `(collateral × 1e8) / spreadWidth` | 10,000 USDC / $10k = 1 contract |\n| **PUT_SPREAD** | 2 | USDC | `(collateral × 1e8) / spreadWidth` | 10,000 USDC / $10k = 1 contract |\n| **BUTTERFLY** | 3 | USDC | `(collateral × 1e8) / maxSpread` | Based on widest strike range |\n| **CONDOR** | 4 | USDC | `(collateral × 1e8) / maxSpread` | Based on widest strike range |\n| **PHYSICAL_CALL** | 1 | WETH | Same as INVERSE_CALL | 1 WETH = 1 contract |\n| **PHYSICAL_PUT** | 1 | USDC | Same as Vanilla PUT | Same formula |\n\n**IMPORTANT: Only single-strike CALL options (INVERSE_CALL, PHYSICAL_CALL) use WETH collateral. ALL multi-strike structures use USDC, even CALL_SPREAD, CALL_FLY, and CALL_CONDOR.**\n\n### Using previewFillOrder\n\nAlways use `previewFillOrder()` to see the actual contract count before filling:\n\n```typescript\nconst order = orders[0];\n\n// Preview shows calculated max contracts based on collateral requirements\nconst preview = client.optionBook.previewFillOrder(order);\nconsole.log(`Max contracts: ${preview.maxContracts}`);\nconsole.log(`Collateral token: ${preview.collateralToken}`);\nconsole.log(`Price per contract: ${preview.pricePerContract}`);\n\n// Preview with specific premium amount\nconst preview10 = client.optionBook.previewFillOrder(order, 10_000000n); // 10 USDC premium\nconsole.log(`Contracts for 10 USDC: ${preview10.numContracts}`);\n```\n\n### Why This Matters\n\nFor a PUT option with a $95,000 strike:\n- **Maker provides**: 10,000 USDC collateral\n- **Max contracts**: 10,000 / 95,000 ≈ **0.105 contracts** (not 10,000!)\n\nThe `previewFillOrder()` method handles these calculations automatically for all option types.\n\n---\n\n## SDK Modules Reference\n\n| Module | Purpose | Requires Signer |\n|--------|---------|-----------------|\n| `client.erc20` | Token approvals, balances, transfers | Write ops only |\n| `client.optionBook` | Fill/cancel orders, get fees, preview fills | Write ops only |\n| `client.api` | Fetch orders, positions, stats | No |\n| `client.optionFactory` | RFQ lifecycle management | Write ops only |\n| `client.option` | Position management, payouts | Write ops only |\n| `client.events` | Query blockchain events (OfferMade, QuotationRequested) | No |\n| `client.ws` | Real-time WebSocket subscriptions | No |\n| `client.pricing` | Option pricing, Greeks | No |\n| `client.mmPricing` | Market maker pricing with fee adjustments | No |\n| `client.rfqKeys` | ECDH keypair management for sealed-bid RFQ encryption | No |\n| `client.collar` | Collar loans (capped-upside, zero-interest). Pricing/estimation works today; write methods throw `NETWORK_UNSUPPORTED` until `CollarLoanCoordinator` is deployed on Base. | Write ops only |\n| `client.utils` | Decimal conversions, payoffs | No |\n\n---\n\n## Referrer Fee Sharing\n\nThe SDK supports a **referrer address** for fee sharing on order fills. When a referrer is set, a portion of the trading fees is allocated to the referrer.\n\n```typescript\n// Option 1: Set referrer at client initialization (applies to all fills)\nconst client = new ThetanutsClient({\n  chainId: 8453,\n  provider,\n  signer,\n  referrer: '0x92b8ac05b63472d1D84b32bDFBBf3e1887331567',\n});\n\n// All fillOrder calls will use this referrer automatically\nawait client.optionBook.fillOrder(order);\n\n// Option 2: Pass referrer per fill call (overrides client default)\nawait client.optionBook.fillOrder(order, undefined, '0xYourReferrerAddress');\n\n// Option 3: Use encode methods (for viem/wagmi/AA wallets)\nconst { to, data } = client.optionBook.encodeFillOrder(\n  order,\n  collateralAmount,\n  '0x92b8ac05b63472d1D84b32bDFBBf3e1887331567'\n);\nconst hash = await walletClient.sendTransaction({ to, data });\n\n// Query referrer fee split\nconst feeBps = await client.optionBook.getReferrerFeeSplit('0x...');\nconsole.log(`Referrer fee: ${feeBps} bps`);\n\n// Query accumulated fees\nconst fees = await client.optionBook.getFees(usdcAddress, '0x...');\nconsole.log(`Accumulated fees: ${fees}`);\n```\n\nIf no referrer is provided, the zero address (`0x000...`) is used (no fee sharing).\n\n---\n\n## RFQ Key Management\n\nThe SDK uses ECDH (Elliptic Curve Diffie-Hellman) key pairs for encrypted offers in the RFQ system. Keys are automatically persisted based on your environment:\n\n| Environment | Default Storage | Persistence |\n|-------------|-----------------|-------------|\n| **Node.js** | `FileStorageProvider` | Keys saved to `.thetanuts-keys/` directory |\n| **Browser** | `LocalStorageProvider` | Keys saved to localStorage |\n\n### Automatic Key Management\n\n```typescript\n// Keys are automatically persisted - no configuration needed\nconst keyPair = await client.rfqKeys.getOrCreateKeyPair();\nconsole.log('Public Key:', keyPair.compressedPublicKey);\n// Keys are saved automatically and survive process restarts\n```\n\n### Key Backup Warning\n\n> **IMPORTANT**: Back up your RFQ private keys! Keys are stored in `.thetanuts-keys/` with secure permissions. If lost, you cannot decrypt offers made to your public key. There is no recovery mechanism.\n\n---\n\n## Real-Time WebSocket Subscriptions\n\nSubscribe to live updates for orders and prices:\n\n```typescript\nconst client = new ThetanutsClient({ chainId: 8453, provider });\n\n// 1. Connect\nawait client.ws.connect();\n\n// 2. Subscribe to order updates\nconst unsubOrders = client.ws.subscribeOrders((update) => {\n  console.log(`Order ${update.event}:`, update);\n});\n\n// 3. Subscribe to price updates for ETH\nconst unsubPrices = client.ws.subscribePrices((update) => {\n  console.log(`ETH price: $${update.price}`);\n}, 'ETH');\n\n// 4. Handle connection state changes\nconst unsubState = client.ws.onStateChange((state) => {\n  console.log(`WebSocket state: ${state}`);\n});\n\n// 5. Disconnect when done\n// unsubOrders(); unsubPrices(); unsubState();\n// client.ws.disconnect();\n```\n\nThe WebSocket module auto-reconnects by default (up to 10 attempts).\n\n---\n\n## Error Handling\n\nAll SDK methods throw `ThetanutsError` with typed error codes:\n\n```typescript\nimport { isThetanutsError, OrderExpiredError, InsufficientAllowanceError } from '@thetanuts-finance/thetanuts-client';\n\ntry {\n  await client.optionBook.fillOrder(order, 10_000000n);\n} catch (error) {\n  if (error instanceof OrderExpiredError) {\n    console.log('Order expired, fetching fresh orders...');\n    const freshOrders = await client.api.fetc\n\nFile v1.5.4:README.md\n\n# Thetanuts OpenClaw Skill\n\nOpenClaw skill for trading crypto options on [Thetanuts Finance](https://thetanuts.finance) with integrated wallet management.\n\n## For AI Agents\n\nThe agent instruction set lives in the locally installed `SKILL.md` (the file\nClawHub places next to this README). Read it from the install directory — do\nnot fetch it from the internet, since remote files can change after install\nand ClawHub's security review only covers the published artifact.\n\n`SKILL.md` contains the complete agent instruction set: onboarding flows,\ntrading workflows, strategy recommendation logic, risk-tiered decision trees,\nSDK reference, contract addresses, and example conversations. Read it fully\nbefore assisting users.\n\n## Features\n\n- **Wallet Management**: Create and import EVM/Solana wallets using Tether WDK\n- **Balance Queries**: Check native (ETH/SOL) and token balances (USDC, WETH, cbBTC)\n- **Transaction Execution**: Approve tokens and send transactions directly\n- **Options Trading**: Orderbook fills, RFQ lifecycle, MM pricing, multi-strike structures (spreads, butterflies, condors)\n- **Position Tracking**: Check user positions, calculate payoffs, portfolio ROI\n- **Market Intelligence**: News-informed strategy recommendations with risk-tiered suggestions\n\n## Prerequisites\n\n- [OpenClaw](https://docs.openclaw.ai/) installed and running\n- Node.js >= 18.0.0\n\n## Installation\n\n### Option A: Install from ClawHub (recommended)\n\n```bash\nclawhub install thetanuts\n```\n\nThen skip to Step 2 below.\n\nView on ClawHub: [clawhub.ai/goheesheng/thetanuts](https://clawhub.ai/goheesheng/thetanuts)\n\n### Option B: Clone from GitHub\n\n```bash\ncd ~/.openclaw/workspace/skills\ngit clone https://github.com/goheesheng/thetanuts-openclaw.git thetanuts\n```\n\n### Step 2: Run Onboarding\n\n```bash\ncd ~/.openclaw/workspace/skills/thetanuts\nbash scripts/onboard.sh\n```\n\nThis will:\n- Check prerequisites (node, npm)\n- Create WDK MCP runtime at `~/.openclaw/wdk-mcp`\n- Install project dependencies (for wallet scripts like `wallet-create.js`)\n- Install WDK MCP runtime dependencies\n\n### Step 3: Create or Import Wallet\n\n```bash\n# Create new dedicated wallet\nnode scripts/wallet-create.js\n\n# Or import existing seed\nnode scripts/wallet-import.js --seed-file /path/to/seed.txt\n```\n\n**⚠️ IMPORTANT**: Use a DEDICATED wallet for this integration. Never reuse your primary wallet seed phrase. Write your seed phrase on paper and store it offline (not in a text file, not in a chat, not in email).\n\n### Step 4: Reload OpenClaw\n\nStart a new session to load the skill:\n```\n/new\n```\n\nThe agent will automatically detect your wallet, show your address and balances, and display current ETH/BTC option prices. You're ready to trade.\n\n### Step 5: Fund Your Wallet\n\nBefore trading, you need tokens on Base network:\n\n- **ETH** (gas fees) - Bridge via [bridge.base.org](https://bridge.base.org)\n- **USDC** (for PUT options) - `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`\n- **WETH** (for CALL options) - `0x4200000000000000000000000000000000000006`\n\nOnce funded, just tell the agent what you want: \"Show me ETH puts\" or \"Recommend a strategy.\"\n\n## Updates\n\nCheck for and apply skill updates:\n\n```bash\nbash scripts/update.sh\n```\n\nOptional flags:\n- `REFRESH_WDK_DEPS=1` - Refresh dependencies from lockfile\n- `UPGRADE_WDK_DEPS=1` - Upgrade dependency versions\n\n**Note**: Updates NEVER modify wallet secrets (`.env`, `WDK_SEED`).\n\n## Usage\n\nOnce installed, you can ask questions like:\n\n- \"Create a new EVM wallet for me\"\n- \"Check my wallet balance\"\n- \"Show me ETH put options\"\n- \"I want to buy 0.1 ETH 2000 put expiring March 28\"\n- \"Check positions for 0x...\"\n\n**Seed handling**: The skill reads your seed only from the `WDK_SEED` value in\n`~/.openclaw/wdk-mcp/.env` (written there once by `wallet-create.js` or\n`wallet-import.js`). The scripts intentionally refuse to accept a seed phrase\nas a command-line argument — argv is visible to other processes via `ps`,\nshell history, and terminal logs, so any script that requires the seed loads\nit from the environment instead.\n\n## Wallet Management\n\nThe skill uses a centralized wallet stored in `~/.openclaw/wdk-mcp/.env`. This enables deterministic wallet operations without passing seed phrases in commands.\n\n### Wallet Scripts\n\n| Script | Description |\n|--------|-------------|\n| `wallet-discover.js` | Check if wallet is configured, show addresses |\n| `wallet-create.js` | Generate new BIP-39 seed and configure |\n| `wallet-import.js` | Import existing seed from file or stdin |\n| `wallet-select.js` | Set active wallet context (family, chain, index) |\n| `wallet-balance.js` | Query balances with chain-specific RPC |\n\n### Discover Wallet\n\n```bash\nnode scripts/wallet-discover.js\n```\n\n### Create Wallet\n\n```bash\nnode scripts/wallet-create.js\n```\n\n### Import Wallet\n\n```bash\n# From file\nnode scripts/wallet-import.js --seed-file /path/to/seed.txt\n\n# From stdin\nprintf '%s' \"$SEED\" | node scripts/wallet-import.js --stdin\n```\n\n### Select Wallet Context\n\n```bash\nnode scripts/wallet-select.js --family evm --chain base-mainnet --index 0\n```\n\n### Check Balance\n\n```bash\n# Native balance\nnode scripts/wallet-balance.js --chain base-mainnet --index 0\n\n# With token balance\nnode scripts/wallet-balance.js --chain base-mainnet --index 0 --tokens 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\n```\n\n## Supported Chains\n\n| Chain Slug | Family | Symbol | Chain ID |\n|------------|--------|--------|----------|\n| `ethereum-mainnet` | evm | ETH | 1 |\n| `base-mainnet` | evm | ETH | 8453 |\n| `bnb-smart-chain` | evm | BNB | 56 |\n| `solana-mainnet` | solana | SOL | - |\n\n## Legacy Wallet Scripts\n\nThe following TypeScript-based commands are available for backward compatibility:\n\n| Script | Description |\n|--------|-------------|\n| `create-wallet.ts` | Create new EVM or Solana wallet |\n| `import-wallet.ts` | Import existing wallet from seed phrase |\n| `get-balance.ts` | Get native and token balances |\n| `sign-message.ts` | Sign messages for authentication |\n| `approve-token.ts` | Approve ERC20 token spending |\n| `send-transaction.ts` | Sign and broadcast transactions |\n\n### Approve Token Spending\n\nApproval scripts read the seed from the `WDK_SEED` environment variable\n(loaded from `~/.openclaw/wdk-mcp/.env`). Passing a seed phrase as a CLI\nargument is rejected at script entry — see the global seed-handling note\nabove.\n\n```bash\n# Approve an exact USDC amount for Thetanuts (preferred over --max)\nnpx tsx scripts/approve-token.ts --token 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 \\\n  --spender 0x1aDcD391CF15Fb699Ed29B1D394F4A64106886e5 --amount 100 --wait\n\n# Unlimited approvals require explicit confirmation; the spender must also be\n# on the Thetanuts allowlist (override with --i-understand-risk only after\n# independently verifying the address).\nnpx tsx scripts/approve-token.ts --token 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 \\\n  --spender 0x1aDcD391CF15Fb699Ed29B1D394F4A64106886e5 --max --confirm-max --wait\n```\n\n### Send Transaction\n\n```bash\nnpx tsx scripts/send-transaction.ts --to 0x1aDcD391CF15Fb699Ed29B1D394F4A64106886e5 --data 0xb5da63e3... --wait\n```\n\n## Trading Scripts\n\n| Script | Description |\n|--------|-------------|\n| `get-prices.ts` | Get current BTC, ETH prices and protocol stats |\n| `get-mm-pricing.ts` | Get MM option pricing with filters |\n| `get-positions.ts` | Get user positions by wallet address |\n| `build-rfq.ts` | Build RFQ transaction data |\n| `fetch-orders.ts` | Fetch orderbook with filters |\n| `check-orderbook.ts` | Check orderbook liquidity before trading |\n| `fill-order.ts` | Fill an existing orderbook order |\n| `check-rfq-fill.ts` | Verify RFQ fill status after submission |\n| `calculate-payout.ts` | Calculate option payout at settlement |\n\n### Get Option Pricing\n\n```bash\nnpx tsx scripts/get-mm-pricing.ts ETH --type PUT\n```\n\n### Build RFQ\n\n```bash\nnpx tsx scripts/build-rfq.ts --underlying ETH --type PUT --strike 2000 --expiry 1774684800 --contracts 0.1 --direction buy\n```\n\n## Complete Trading Workflow\n\n1. **Create wallet** (or import existing):\n   ```bash\n   node scripts/wallet-create.js\n   ```\n\n2. **Check balance**:\n   ```bash\n   node scripts/wallet-balance.js --chain base-mainnet --tokens 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\n   ```\n\n3. **Approve USDC** for Thetanuts (one-time per token; prefer an exact amount):\n   ```bash\n   npx tsx scripts/approve-token.ts --token 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 --spender 0x1aDcD391CF15Fb699Ed29B1D394F4A64106886e5 --amount 100 --wait\n   ```\n\n4. **Check orderbook first** (always check liquidity before choosing a method):\n   ```bash\n   npx tsx scripts/check-orderbook.ts --underlying ETH --type PUT --strike 1900 --expiry 1774684800 --direction sell\n   ```\n\n5a. **If orderbook has liquidity** - fill directly:\n   ```bash\n   npx tsx scripts/fill-order.ts --order-index 0 --collateral 10 --execute --wait\n   ```\n\n5b. **If no orderbook liquidity** - submit an RFQ:\n   ```bash\n   npx tsx scripts/build-rfq.ts --underlying ETH --type PUT --strike 1900 --expiry 1774684800 --contracts 0.1 --direction buy\n   npx tsx scripts/send-transaction.ts --to <from-build-rfq> --data <from-build-rfq> --wait\n   ```\n\n6. **Verify fill** (for RFQ trades):\n   ```bash\n   npx tsx scripts/check-rfq-fill.ts --address <wallet> --ticker <expected> --since <submission_timestamp>\n   ```\n\n## Configuration\n\n```bash\n# EVM RPC (default: Base Mainnet)\nexport THETANUTS_RPC_URL=\"https://mainnet.base.org\"\n\n# Solana RPC (default: Mainnet)\nexport SOLANA_RPC_URL=\"https://api.mainnet-beta.solana.com\"\n```\n\n## Contract Addresses (Base)\n\n| Contract | Address |\n|----------|---------|\n| USDC | `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` |\n| WETH | `0x4200000000000000000000000000000000000006` |\n| cbBTC | `0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf` |\n| Thetanuts RFQ | `0x1aDcD391CF15Fb699Ed29B1D394F4A64106886e5` |\n\n## Security Considerations\n\n- **SEED PHRASES**: Save securely, never share. Scripts display seed only during creation.\n- **KEY DISPOSAL**: Wallet scripts automatically clear keys from memory after use.\n- **TRANSACTIONS**: Transactions are IRREVERSIBLE once broadcast. Verify before sending.\n- **APPROVALS**: Token approvals allow contracts to spend your tokens. Only approve trusted contracts.\n- **GAS**: Ensure wallet has ETH on Base network for gas fees.\n\n## License\n\nMIT\n\n## Links\n\n- [ClawHub: thetanuts](https://clawhub.ai/goheesheng/thetanuts)\n- [Thetanuts Finance](https://thetanuts.finance)\n- [Thetanuts SDK](https://github.com/Thetanuts-Finance/thetanuts-sdk)\n- [Tether WDK](https://docs.wdk.tether.io)\n- [OpenClaw Docs](https://docs.openclaw.ai/)\n\nFile v1.5.4:_meta.json\n\n{\n  \"ownerId\": \"kn79tkg34yw8sea1dpw2jsmh3s80dxwe\",\n  \"slug\": \"thetanuts\",\n  \"version\": \"1.5.4\",\n  \"publishedAt\": 1779695177705\n}\n\nFile v1.5.4:CLAUDE.md\n\n# Thetanuts OpenClaw Skill\n\n## Project Structure\n- `SKILL.md` - Agent instruction set (loaded by OpenClaw, 1800 lines)\n- `scripts/*.js` - Wallet management scripts (run with `node`)\n- `scripts/*.ts` - Trading scripts (run with `npx tsx`)\n- `scripts/onboard.sh` - Installs deps at project root AND `~/.openclaw/wdk-mcp/`\n- `manifest.json` - ClawHub publishing metadata\n\n## SDK Quirks (@thetanuts-finance/thetanuts-client, ^0.2.4)\n- `client.erc20.approve()` returns a TransactionReceipt, NOT TransactionResponse. Do not call `.wait()` on it.\n- `client.optionBook.fillOrder()` same — returns receipt, already waited internally.\n- r12 settlement is automatic via `notifyTradeSettled`. There is NO zero-arg `BaseOption.payout()` write call — SDK ≥ 0.2.4 throws `INVALID_PARAMS` on the legacy method. Read `client.option.getOptionInfo(addr).settled` for status; use `client.option.calculatePayout(addr, settlementPrice)` (view) for amounts.\n- `client.option.reclaimCollateral(optionAddress, ownedOption)` and `client.loan.reclaimCollateral(...)` are now payable — the SDK reads `getReclaimFee(ownedOption)` and forwards as `msg.value`. Don't call the raw contract or you'll forget the fee.\n- `client.loan.splitOption(optionAddress, amount)` is payable — SDK reads `getSplitFee()` and forwards as `msg.value`.\n- `client.collar` exists but the `CollarLoanCoordinator` is a zero address on Base — write methods throw `NETWORK_UNSUPPORTED` until collar-v12 deploys. Pricing/estimation (`estimateCollar`, `getCapStrikeOptions`) works today.\n- `client.optionFactory` lost referral/admin surface in 0.2.4: `getOfferSignature`, `getPendingFees`, `getReferralOwner`, `withdrawFees`, `renounceOwnership`, `transferOwnership` no longer exist.\n- `client.vault.trigger()` removed in 0.2.4.\n- `RFQBuilderParams.requesterPublicKey?: string` was added — `requestLoan()` auto-resolves it via `client.rfqKeys.getOrCreateKeyPair()`. Only set explicitly for viem/wagmi integrations using `encodeRequestLoan`.\n- `validateAddress(addr, field)` now RETURNS the EIP-55 checksummed form (previously returned void). Legacy ignore-return callsites still work.\n- `client.erc20.getBalance(token, address)` returns `Promise<bigint>`.\n- `client.erc20.getAllowance(token, owner, spender)` returns `Promise<bigint>`.\n- Strikes use 8 decimals internally. USDC uses 6, WETH uses 18.\n- `OrderWithSignature` has NO root-level `collateralToken` field. Use `order.rawApiData?.collateral` or `order.order?.collateralToken` (both are address strings).\n- `Order.strikePrice` is deprecated. Use `order.order.strikes?.[0]` going forward.\n- `RFQBuilderParams.requester` is typed `\\`0x${string}\\``. Cast string addresses with `as \\`0x${string}\\``.\n- `RFQBuilderParams.strikes` is `number | number[]`. The deprecated `strike` field still works but emits a warning — prefer passing `strikes: single` or `strikes: [...]`.\n- `optionFactory.encodeRequestForQuotation()` returns `{ to, data }` only — no `value` field. RFQ transactions are value-zero.\n\n## Dependencies\n- `@scure/bip39` must be a direct dependency — wallet scripts import it directly, not via WDK.\n- Two install targets: project root (for scripts) and `~/.openclaw/wdk-mcp/` (for MCP runtime).\n\n## Repo\n- GitHub: `Thetanuts-Finance/thetanuts-openclaw` (canonical; `goheesheng/thetanuts-openclaw` is the legacy fork)\n- ClawHub: `clawhub.ai/goheesheng/thetanuts`\n- Published with: `clawhub skill publish /absolute/path --slug thetanuts --version X.Y.Z`\n\n## Common Commands\n- `node scripts/wallet-create.js` - Create wallet (must have no existing WDK_SEED in .env)\n- `npx tsx scripts/fill-order.ts --order-index 0 --collateral 10 --execute --wait` - Fill order (reads `WDK_SEED` env from `.env`)\n- `npx tsx scripts/check-orderbook.ts --underlying ETH --type PUT --strike 1900 --expiry <ts> --direction sell` - Check liquidity\n- `bash scripts/onboard.sh` - Full setup (installs both dep targets)\n- `bash scripts/update.sh` - Check for manifest-based updates\n\n## Gotchas\n- Wallet scripts output JSON to stdout — this is intentional, the agent parses it.\n- `onboard.sh` changes directory during execution — use absolute paths when extending.\n- SKILL.md is 79KB — large but within OpenClaw limits.\n- All trading on Base Mainnet (chain ID 8453). ETH needed for gas, USDC for PUTs, WETH for CALLs.\n\nFile v1.5.4:skill-card.md\n\n## Description:\n\nTrade crypto options on Thetanuts Finance with orderbook fills, RFQ lifecycle support, multi-strike structures, real-time market data, wallet management, early settlement, and referrer fees.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[goheesheng](https://clawhub.ai/user/goheesheng)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to explore Thetanuts Finance crypto options markets, manage a local wallet, inspect balances and positions, build RFQs, prepare approvals, and execute supported orderbook or RFQ trading workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill handles wallet seeds and can prepare or run transaction-signing flows.\n\nMitigation: Use only a dedicated low-value wallet, treat the local .env seed as highly sensitive, and review transaction details before signing or broadcasting.\n\nRisk: The updater can change code that signs transactions.\n\nMitigation: Run updates only after explicit user consent and verify the update source and changes before applying them.\n\nRisk: Token approvals may allow contracts to spend more funds than the immediate trade requires.\n\nMitigation: Prefer exact approval amounts, verify spender addresses, and review approvals carefully before confirming.\n\n## Reference(s):\n\n- [ClawHub Skill Page](https://clawhub.ai/goheesheng/skills/thetanuts)\n- [Thetanuts Finance](https://thetanuts.finance)\n- [Thetanuts SDK](https://github.com/Thetanuts-Finance/thetanuts-sdk)\n- [Thetanuts OpenClaw Repository](https://github.com/Thetanuts-Finance/thetanuts-openclaw)\n- [Tether WDK](https://docs.wdk.tether.io)\n- [OpenClaw Docs](https://docs.openclaw.ai/)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and structured command output summaries]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May guide wallet, approval, RFQ, and trade execution flows; transaction-related actions require user review and explicit confirmation.]\n\n## Skill Version(s):\n\n1.5.4 (source: server release metadata and manifest.json)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.5.4:manifest.json\n\n{\n  \"name\": \"thetanuts\",\n  \"version\": \"1.5.4\",\n  \"description\": \"Thetanuts OpenClaw Skill - Trade crypto options with integrated wallet management\",\n  \"homepage\": \"https://github.com/Thetanuts-Finance/thetanuts-openclaw\",\n  \"updateUrl\": \"https://raw.githubusercontent.com/Thetanuts-Finance/thetanuts-openclaw/v1.5.4/scripts/update.sh\",\n  \"files\": [\n    \"SKILL.md\",\n    \"README.md\",\n    \"CLAUDE.md\",\n    \"manifest.json\",\n    \"scripts/onboard.sh\",\n    \"scripts/update.sh\",\n    \"scripts/lib/load-seed.ts\",\n    \"scripts/wallet-discover.js\",\n    \"scripts/wallet-create.js\",\n    \"scripts/wallet-import.js\",\n    \"scripts/wallet-select.js\",\n    \"scripts/wallet-balance.js\",\n    \"scripts/create-wallet.ts\",\n    \"scripts/import-wallet.ts\",\n    \"scripts/get-balance.ts\",\n    \"scripts/sign-message.ts\",\n    \"scripts/send-transaction.ts\",\n    \"scripts/approve-token.ts\",\n    \"scripts/get-prices.ts\",\n    \"scripts/get-mm-pricing.ts\",\n    \"scripts/get-positions.ts\",\n    \"scripts/build-rfq.ts\",\n    \"scripts/fetch-orders.ts\",\n    \"scripts/calculate-payout.ts\",\n    \"scripts/check-orderbook.ts\",\n    \"scripts/check-rfq-fill.ts\",\n    \"scripts/fill-order.ts\"\n  ],\n  \"checksums\": {\n    \"SKILL.md\": \"sha256:cf21d1351fc21f3d322916eecfc8826ae35a0532c335cf705eb6ad39c25616dd\",\n    \"README.md\": \"sha256:212863d465623fd69d7bb5157b715113b8ff24fa60a05654360aa779fb01152d\",\n    \"CLAUDE.md\": \"sha256:3926a0f1f4d0cdd18575ebc297ed17d28fd2b363c1802e96feeab96ee54b2909\",\n    \"scripts/onboard.sh\": \"sha256:be3780e37d1b5414985a813108201f3fd346592dc1cfda9c1b51913b84049ac0\",\n    \"scripts/update.sh\": \"sha256:de376b31d5f544e82d7db7e1e0080a462918b0213fc8310735eff12b277f5114\",\n    \"scripts/lib/load-seed.ts\": \"sha256:1d77aa17ad8b689afe679a472f6f37149a0ac893d92467fa6dd660a09a1c244c\",\n    \"scripts/approve-token.ts\": \"sha256:cd063f380d77f9d04323353142130331c3a1ca5f93547b92f78ad5a6b6f3d3eb\",\n    \"scripts/fill-order.ts\": \"sha256:596e230695cf1000bf26592d562df96bbca9943a7566d985876841515defa975\",\n    \"scripts/send-transaction.ts\": \"sha256:5ca54281bf1ad4fcb2405d2a5b485f2cd1235caabc0ebd2d27c08bf5c6a68070\",\n    \"scripts/import-wallet.ts\": \"sha256:f1d39a84c1f06ff6242f4713146080cb32de64cb0d656eb8cb75f4217ea83749\",\n    \"scripts/get-balance.ts\": \"sha256:b5a9dfcb3297611550ead4fd6da5c031e93d82c111a71e6c0820929997e9706c\",\n    \"scripts/sign-message.ts\": \"sha256:37a2d22a80030d90e782c15d2425812329b4a5ce2477394f0911fdbb0e3bee6d\",\n    \"scripts/check-orderbook.ts\": \"sha256:3f40d453eb4402212285c83e10810a6f98649403a42cf5330999562ca4727e76\"\n  },\n  \"lastUpdated\": \"2026-05-25T00:00:00.000Z\"\n}\n\nFile v1.5.4:package-lock.json\n\n{\n  \"name\": \"thetanuts-openclaw-skill\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"thetanuts-openclaw-skill\",\n      \"version\": \"1.0.0\",\n      \"dependencies\": {\n        \"@scure/bip39\": \"^1.5.4\",\n        \"@tetherto/wdk\": \"^1.0.0-beta.6\",\n        \"@tetherto/wdk-wallet-evm\": \"^1.0.0-beta.10\",\n        \"@tetherto/wdk-wallet-solana\": \"^1.0.0-beta.5\",\n        \"@thetanuts-finance/thetanuts-client\": \"^0.2.4\",\n        \"ethers\": \"^6.13.0\"\n      },\n      \"devDependencies\": {\n        \"@types/node\": \"^20.0.0\",\n        \"tsx\": \"^4.7.0\",\n        \"typescript\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18.0.0\"\n      }\n    },\n    \"node_modules/@adraffy/ens-normalize\": {\n      \"version\": \"1.10.1\",\n      \"resolved\": \"https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz\",\n      \"integrity\": \"sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@esbuild/aix-ppc64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz\",\n      \"integrity\": \"sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"aix\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz\",\n      \"integrity\": \"sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz\",\n      \"integrity\": \"sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-x64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz\",\n      \"integrity\": \"sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-arm64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz\",\n      \"integrity\": \"sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-x64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz\",\n      \"integrity\": \"sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-arm64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz\",\n      \"integrity\": \"sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-x64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz\",\n      \"integrity\": \"sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz\",\n      \"integrity\": \"sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz\",\n      \"integrity\": \"sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ia32\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz\",\n      \"integrity\": \"sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-loong64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz\",\n      \"integrity\": \"sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-mips64el\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz\",\n      \"integrity\": \"sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==\",\n      \"cpu\": [\n        \"mips64el\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ppc64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz\",\n      \"integrity\": \"sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-riscv64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz\",\n      \"integrity\": \"sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-s390x\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz\",\n      \"integrity\": \"sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-x64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz\",\n      \"integrity\": \"sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-arm64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz\",\n      \"integrity\": \"sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-x64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz\",\n      \"integrity\": \"sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-arm64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz\",\n      \"integrity\": \"sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-x64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz\",\n      \"integrity\": \"sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openharmony-arm64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz\",\n      \"integrity\": \"sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"openharmony\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/sunos-x64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz\",\n      \"integrity\": \"sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"sunos\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-arm64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz\",\n      \"integrity\": \"sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-ia32\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz\",\n      \"integrity\": \"sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-x64\": {\n      \"version\": \"0.27.4\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz\",\n      \"integrity\": \"sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@noble/ciphers\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz\",\n      \"integrity\": \"sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"^14.21.3 || >=16\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@noble/curves\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz\",\n      \"integrity\": \"sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@noble/hashes\": \"1.3.2\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@noble/hashes\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz\",\n      \"integrity\": \"sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 16\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@noble/secp256k1\": {\n      \"version\": \"2.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-2.2.3.tgz\",\n      \"integrity\": \"sha512-l7r5oEQym9Us7EAigzg30/PQAvynhMt2uoYtT3t26eGDVm9Yii5mZ5jWSWmZ/oSIR2Et0xfc6DXrG0bZ787V3w==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@scure/base\": {\n      \"version\": \"1.2.6\",\n      \"resolved\": \"https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz\",\n      \"integrity\": \"sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@scure/bip32\": {\n      \"version\": \"1.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz\",\n      \"integrity\": \"sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@noble/curves\": \"~1.9.0\",\n        \"@noble/hashes\": \"~1.8.0\",\n        \"@scure/base\": \"~1.2.5\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@scure/bip32/node_modules/@noble/curves\": {\n      \"version\": \"1.9.7\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz\",\n      \"integrity\": \"sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@noble/hashes\": \"1.8.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.21.3 || >=16\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@scure/bip32/node_modules/@noble/hashes\": {\n      \"version\": \"1.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz\",\n      \"integrity\": \"sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"^14.21.3 || >=16\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@scure/bip39\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz\",\n      \"integrity\": \"sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@noble/hashes\": \"~1.8.0\",\n        \"@scure/base\": \"~1.2.5\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@scure/bip39/node_modules/@noble/hashes\": {\n      \"version\": \"1.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz\",\n      \"integrity\": \"sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"^14.21.3 || >=16\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@solana-program/system\": {\n      \"version\": \"0.9.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana-program/system/-/system-0.9.0.tgz\",\n      \"integrity\": \"sha512-yu+i0SZ+c+0E9Cy+btoMiCbxRnP/FLQuv/Ba8l2klZApAiOX1Ja/2IGkctFV36fglsI7PwD9czkSkHm8og+QeA==\",\n      \"license\": \"Apache-2.0\",\n      \"peerDependencies\": {\n        \"@solana/kit\": \"^4.0\"\n      }\n    },\n    \"node_modules/@solana-program/token\": {\n      \"version\": \"0.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana-program/token/-/token-0.7.0.tgz\",\n      \"integrity\": \"sha512-Rx9vTsU15lLbjLmzrnLhPG4ZBlzkvyr7sRAH5ciA3dtSocpprkMEHQslDteE9+5rKkuYoIUl7Qki4l2IMY0P2w==\",\n      \"license\": \"Apache-2.0\",\n      \"peerDependencies\": {\n        \"@solana/kit\": \"^4.0\"\n      }\n    },\n    \"node_modules/@solana/accounts\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/accounts/-/accounts-4.0.0.tgz\",\n      \"integrity\": \"sha512-fxTtTk7PCJrigdzqhkc0eZYACVZpONKJZy4MkGvZzx5tCC7rUeDJvzau3IYACUCRaaAGPpkINHwYtp8weKsn8w==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/addresses\": \"4.0.0\",\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/codecs-strings\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\",\n        \"@solana/rpc-spec\": \"4.0.0\",\n        \"@solana/rpc-types\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/accounts/node_modules/@solana/addresses\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/addresses/-/addresses-4.0.0.tgz\",\n      \"integrity\": \"sha512-1OS4nU0HFZxHRxgUb6A72Qg0QbIz6Vu2AbB0j/YSxN4EI+S2BftA83Y6uXhTFDQjKuA+MtHjxe6edB3cs1Pqxw==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/assertions\": \"4.0.0\",\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/codecs-strings\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\",\n        \"@solana/nominal-types\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/accounts/node_modules/@solana/assertions\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/assertions/-/assertions-4.0.0.tgz\",\n      \"integrity\": \"sha512-QwtImPVM5JLEWOFpvHh+eKdvmxdNP6PW8FkmFFEVYR6VFDaZD/hbmSJlwt5p3L69sVmxJA0ughYgD/kkHM7fbg==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/accounts/node_modules/@solana/codecs-core\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-4.0.0.tgz\",\n      \"integrity\": \"sha512-28kNUsyIlhU3MO3/7ZLDqeJf2YAm32B4tnTjl5A9HrbBqsTZ+upT/RzxZGP1MMm7jnPuIKCMwmTpsyqyR6IUpw==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/accounts/node_modules/@solana/codecs-numbers\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-4.0.0.tgz\",\n      \"integrity\": \"sha512-z9zpjtcwzqT9rbkKVZpkWB5/0V7+6YRKs6BccHkGJlaDx8Pe/+XOvPi2rEdXPqrPd9QWb5Xp1iBfcgaDMyiOiA==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/accounts/node_modules/@solana/codecs-strings\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-4.0.0.tgz\",\n      \"integrity\": \"sha512-XvyD+sQ1zyA0amfxbpoFZsucLoe+yASQtDiLUGMDg5TZ82IHE3B7n82jE8d8cTAqi0HgqQiwU13snPhvg1O0Ow==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/codecs-numbers\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"fastestsmallesttextencoderdecoder\": \"^1.0.22\",\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/accounts/node_modules/@solana/errors\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/errors/-/errors-4.0.0.tgz\",\n      \"integrity\": \"sha512-3YEtvcMvtcnTl4HahqLt0VnaGVf7vVWOnt6/uPky5e0qV6BlxDSbGkbBzttNjxLXHognV0AQi3pjvrtfUnZmbg==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"chalk\": \"5.6.2\",\n        \"commander\": \"14.0.1\"\n      },\n      \"bin\": {\n        \"errors\": \"bin/cli.mjs\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/accounts/node_modules/@solana/nominal-types\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/nominal-types/-/nominal-types-4.0.0.tgz\",\n      \"integrity\": \"sha512-zIjHZY+5uboigbzsNhHmF3AlP/xACYxbB0Cb1VAI9i+eFShMeu/3VIrj7x1vbq9hfQKGSFHNFGFqQTivdzpbLw==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/accounts/node_modules/commander\": {\n      \"version\": \"14.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-14.0.1.tgz\",\n      \"integrity\": \"sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=20\"\n      }\n    },\n    \"node_modules/@solana/addresses\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/addresses/-/addresses-3.0.3.tgz\",\n      \"integrity\": \"sha512-AuMwKhJI89ANqiuJ/fawcwxNKkSeHH9CApZd2xelQQLS7X8uxAOovpcmEgiObQuiVP944s9ScGUT62Bdul9qYg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@solana/assertions\": \"3.0.3\",\n        \"@solana/codecs-core\": \"3.0.3\",\n        \"@solana/codecs-strings\": \"3.0.3\",\n        \"@solana/errors\": \"3.0.3\",\n        \"@solana/nominal-types\": \"3.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/assertions\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/assertions/-/assertions-3.0.3.tgz\",\n      \"integrity\": \"sha512-2qspxdbWp2y62dfCIlqeWQr4g+hE8FYSSwcaP6itwMwGRb8393yDGCJfI/znuzJh6m/XVWhMHIgFgsBwnevCmg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@solana/errors\": \"3.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/codecs\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs/-/codecs-3.0.3.tgz\",\n      \"integrity\": \"sha512-GOHwTlIQsCoJx9Ryr6cEf0FHKAQ7pY4aO4xgncAftrv0lveTQ1rPP2inQ1QT0gJllsIa8nwbfXAADs9nNJxQDA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@solana/codecs-core\": \"3.0.3\",\n        \"@solana/codecs-data-structures\": \"3.0.3\",\n        \"@solana/codecs-numbers\": \"3.0.3\",\n        \"@solana/codecs-strings\": \"3.0.3\",\n        \"@solana/options\": \"3.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/codecs-core\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-3.0.3.tgz\",\n      \"integrity\": \"sha512-emKykJ3h1DmnDOY29Uv9eJXP8E/FHzvlUBJ6te+5EbKdFjj7vdlKYPfDxOI6iGdXTY+YC/ELtbNBh6QwF2uEDQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@solana/errors\": \"3.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/codecs-data-structures\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-3.0.3.tgz\",\n      \"integrity\": \"sha512-R15cLp8riJvToXziW8lP6AMSwsztGhEnwgyGmll32Mo0Yjq+hduW2/fJrA/TJs6tA/OgTzMQjlxgk009EqZHCw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@solana/codecs-core\": \"3.0.3\",\n        \"@solana/codecs-numbers\": \"3.0.3\",\n        \"@solana/errors\": \"3.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/codecs-numbers\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-3.0.3.tgz\",\n      \"integrity\": \"sha512-pfXkH9J0glrM8qj6389GAn30+cJOxzXLR2FsPOHCUMXrqLhGjMMZAWhsQkpOQ37SGc/7EiQsT/gmyGC7gxHqJQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@solana/codecs-core\": \"3.0.3\",\n        \"@solana/errors\": \"3.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/codecs-strings\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-3.0.3.tgz\",\n      \"integrity\": \"sha512-VHBXnnTVtcQ1j+7Vrz+qSYo38no+jiHRdGnhFspRXEHNJbllzwKqgBE7YN3qoIXH+MKxgJUcwO5KHmdzf8Wn2A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@solana/codecs-core\": \"3.0.3\",\n        \"@solana/codecs-numbers\": \"3.0.3\",\n        \"@solana/errors\": \"3.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"fastestsmallesttextencoderdecoder\": \"^1.0.22\",\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/errors\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/errors/-/errors-3.0.3.tgz\",\n      \"integrity\": \"sha512-1l84xJlHNva6io62PcYfUamwWlc0eM95nHgCrKX0g0cLoC6D6QHYPCEbEVkR+C5UtP9JDgyQM8MFiv+Ei5tO9Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"chalk\": \"5.6.2\",\n        \"commander\": \"14.0.0\"\n      },\n      \"bin\": {\n        \"errors\": \"bin/cli.mjs\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/fast-stable-stringify\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-3.0.3.tgz\",\n      \"integrity\": \"sha512-ED0pxB6lSEYvg+vOd5hcuQrgzEDnOrURFgp1ZOY+lQhJkQU6xo+P829NcJZQVP1rdU2/YQPAKJKEseyfe9VMIw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/functional\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/functional/-/functional-3.0.3.tgz\",\n      \"integrity\": \"sha512-2qX1kKANn8995vOOh5S9AmF4ItGZcfbny0w28Eqy8AFh+GMnSDN4gqpmV2LvxBI9HibXZptGH3RVOMk82h1Mpw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instruction-plans\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/instruction-plans/-/instruction-plans-4.0.0.tgz\",\n      \"integrity\": \"sha512-FcyptPR5XmKoj1EyF9xARiqy2BuF+CfrIxTU0WQn5Tix/y7whKYz5CCFtBlWbwIcGxQftmG5tAlcidgnCb7jVw==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/errors\": \"4.0.0\",\n        \"@solana/instructions\": \"4.0.0\",\n        \"@solana/promises\": \"4.0.0\",\n        \"@solana/transaction-messages\": \"4.0.0\",\n        \"@solana/transactions\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instruction-plans/node_modules/@solana/addresses\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/addresses/-/addresses-4.0.0.tgz\",\n      \"integrity\": \"sha512-1OS4nU0HFZxHRxgUb6A72Qg0QbIz6Vu2AbB0j/YSxN4EI+S2BftA83Y6uXhTFDQjKuA+MtHjxe6edB3cs1Pqxw==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/assertions\": \"4.0.0\",\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/codecs-strings\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\",\n        \"@solana/nominal-types\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instruction-plans/node_modules/@solana/assertions\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/assertions/-/assertions-4.0.0.tgz\",\n      \"integrity\": \"sha512-QwtImPVM5JLEWOFpvHh+eKdvmxdNP6PW8FkmFFEVYR6VFDaZD/hbmSJlwt5p3L69sVmxJA0ughYgD/kkHM7fbg==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instruction-plans/node_modules/@solana/codecs-core\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-4.0.0.tgz\",\n      \"integrity\": \"sha512-28kNUsyIlhU3MO3/7ZLDqeJf2YAm32B4tnTjl5A9HrbBqsTZ+upT/RzxZGP1MMm7jnPuIKCMwmTpsyqyR6IUpw==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instruction-plans/node_modules/@solana/codecs-data-structures\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-4.0.0.tgz\",\n      \"integrity\": \"sha512-pvh+Oxz6UIbWxcgwvVwMJIV4nvZn3EHL5ZvCIPClE5Ep8K5sJ8RoRvOohqLcIv9LYn/EZNoXpCodREX/OYpsGw==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/codecs-numbers\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instruction-plans/node_modules/@solana/codecs-numbers\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-4.0.0.tgz\",\n      \"integrity\": \"sha512-z9zpjtcwzqT9rbkKVZpkWB5/0V7+6YRKs6BccHkGJlaDx8Pe/+XOvPi2rEdXPqrPd9QWb5Xp1iBfcgaDMyiOiA==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instruction-plans/node_modules/@solana/codecs-strings\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-4.0.0.tgz\",\n      \"integrity\": \"sha512-XvyD+sQ1zyA0amfxbpoFZsucLoe+yASQtDiLUGMDg5TZ82IHE3B7n82jE8d8cTAqi0HgqQiwU13snPhvg1O0Ow==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/codecs-numbers\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"fastestsmallesttextencoderdecoder\": \"^1.0.22\",\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instruction-plans/node_modules/@solana/errors\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/errors/-/errors-4.0.0.tgz\",\n      \"integrity\": \"sha512-3YEtvcMvtcnTl4HahqLt0VnaGVf7vVWOnt6/uPky5e0qV6BlxDSbGkbBzttNjxLXHognV0AQi3pjvrtfUnZmbg==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"chalk\": \"5.6.2\",\n        \"commander\": \"14.0.1\"\n      },\n      \"bin\": {\n        \"errors\": \"bin/cli.mjs\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instruction-plans/node_modules/@solana/functional\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/functional/-/functional-4.0.0.tgz\",\n      \"integrity\": \"sha512-duprxASuT0VXlHj3bLBdy9+ZpqdmCZhzCUmTsXps4UlDKr9PxSCQIQ+NK6OPhtBWOh1sNEcT1f1nY/MVqF/KHg==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instruction-plans/node_modules/@solana/keys\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/keys/-/keys-4.0.0.tgz\",\n      \"integrity\": \"sha512-aPz+LF9QK3EHjuklYBnnalcLVHUNz5s4m4DXNVGAtjJD7Q9zEu2dBUm9mRKwlLbQibNOEGa1m86HCjcboqXdjg==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/assertions\": \"4.0.0\",\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/codecs-strings\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\",\n        \"@solana/nominal-types\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instruction-plans/node_modules/@solana/nominal-types\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/nominal-types/-/nominal-types-4.0.0.tgz\",\n      \"integrity\": \"sha512-zIjHZY+5uboigbzsNhHmF3AlP/xACYxbB0Cb1VAI9i+eFShMeu/3VIrj7x1vbq9hfQKGSFHNFGFqQTivdzpbLw==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instruction-plans/node_modules/@solana/transaction-messages\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-4.0.0.tgz\",\n      \"integrity\": \"sha512-rQo0rRyvkrROFZHUT0uL3vqeBBtxTsNKDtx8pZo6BC3TgGA7V1MoSC3rVOLwYCK6rK5NJZiYNjmneHz/7hVpwQ==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/addresses\": \"4.0.0\",\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/codecs-data-structures\": \"4.0.0\",\n        \"@solana/codecs-numbers\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\",\n        \"@solana/functional\": \"4.0.0\",\n        \"@solana/instructions\": \"4.0.0\",\n        \"@solana/nominal-types\": \"4.0.0\",\n        \"@solana/rpc-types\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instruction-plans/node_modules/@solana/transactions\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/transactions/-/transactions-4.0.0.tgz\",\n      \"integrity\": \"sha512-bmHIIVTQq+Wlqg4es91Ew4KSbOrvdfPsKg/pVha8ZR77huwvfqQMxRyYF4zMQ+Fm3QXGFKOU0RPVKKYic15jBw==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/addresses\": \"4.0.0\",\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/codecs-data-structures\": \"4.0.0\",\n        \"@solana/codecs-numbers\": \"4.0.0\",\n        \"@solana/codecs-strings\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\",\n        \"@solana/functional\": \"4.0.0\",\n        \"@solana/instructions\": \"4.0.0\",\n        \"@solana/keys\": \"4.0.0\",\n        \"@solana/nominal-types\": \"4.0.0\",\n        \"@solana/rpc-types\": \"4.0.0\",\n        \"@solana/transaction-messages\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instruction-plans/node_modules/commander\": {\n      \"version\": \"14.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-14.0.1.tgz\",\n      \"integrity\": \"sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=20\"\n      }\n    },\n    \"node_modules/@solana/instructions\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/instructions/-/instructions-4.0.0.tgz\",\n      \"integrity\": \"sha512-/Lf3E+6mhe6EL7a3+9FY020yq71lVNgueplJGr221b4wP6ykwPVtoaAiNf+lIrRRYkW8DC81auhmjd2DYpND1w==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instructions/node_modules/@solana/codecs-core\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-4.0.0.tgz\",\n      \"integrity\": \"sha512-28kNUsyIlhU3MO3/7ZLDqeJf2YAm32B4tnTjl5A9HrbBqsTZ+upT/RzxZGP1MMm7jnPuIKCMwmTpsyqyR6IUpw==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instructions/node_modules/@solana/errors\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/errors/-/errors-4.0.0.tgz\",\n      \"integrity\": \"sha512-3YEtvcMvtcnTl4HahqLt0VnaGVf7vVWOnt6/uPky5e0qV6BlxDSbGkbBzttNjxLXHognV0AQi3pjvrtfUnZmbg==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"chalk\": \"5.6.2\",\n        \"commander\": \"14.0.1\"\n      },\n      \"bin\": {\n        \"errors\": \"bin/cli.mjs\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/instructions/node_modules/commander\": {\n      \"version\": \"14.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-14.0.1.tgz\",\n      \"integrity\": \"sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=20\"\n      }\n    },\n    \"node_modules/@solana/keys\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/keys/-/keys-3.0.3.tgz\",\n      \"integrity\": \"sha512-tp8oK9tMadtSIc4vF4aXXWkPd4oU5XPW8nf28NgrGDWGt25fUHIydKjkf2hPtMt9i1WfRyQZ33B5P3dnsNqcPQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@solana/assertions\": \"3.0.3\",\n        \"@solana/codecs-core\": \"3.0.3\",\n        \"@solana/codecs-strings\": \"3.0.3\",\n        \"@solana/errors\": \"3.0.3\",\n        \"@solana/nominal-types\": \"3.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/kit\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/kit/-/kit-4.0.0.tgz\",\n      \"integrity\": \"sha512-5c4qMRL+ciWewEtNZ2gX4wf4VpscZYXbWnU2kBiyQhWiqj8zzFIh6iCHbqMX/Myx3pOHfQs/m/iQCnQHPOag9Q==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/accounts\": \"4.0.0\",\n        \"@solana/addresses\": \"4.0.0\",\n        \"@solana/codecs\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\",\n        \"@solana/functional\": \"4.0.0\",\n        \"@solana/instruction-plans\": \"4.0.0\",\n        \"@solana/instructions\": \"4.0.0\",\n        \"@solana/keys\": \"4.0.0\",\n        \"@solana/programs\": \"4.0.0\",\n        \"@solana/rpc\": \"4.0.0\",\n        \"@solana/rpc-parsed-types\": \"4.0.0\",\n        \"@solana/rpc-spec-types\": \"4.0.0\",\n        \"@solana/rpc-subscriptions\": \"4.0.0\",\n        \"@solana/rpc-types\": \"4.0.0\",\n        \"@solana/signers\": \"4.0.0\",\n        \"@solana/sysvars\": \"4.0.0\",\n        \"@solana/transaction-confirmation\": \"4.0.0\",\n        \"@solana/transaction-messages\": \"4.0.0\",\n        \"@solana/transactions\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/kit/node_modules/@solana/addresses\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/addresses/-/addresses-4.0.0.tgz\",\n      \"integrity\": \"sha512-1OS4nU0HFZxHRxgUb6A72Qg0QbIz6Vu2AbB0j/YSxN4EI+S2BftA83Y6uXhTFDQjKuA+MtHjxe6edB3cs1Pqxw==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/assertions\": \"4.0.0\",\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/codecs-strings\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\",\n        \"@solana/nominal-types\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/kit/node_modules/@solana/assertions\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/assertions/-/assertions-4.0.0.tgz\",\n      \"integrity\": \"sha512-QwtImPVM5JLEWOFpvHh+eKdvmxdNP6PW8FkmFFEVYR6VFDaZD/hbmSJlwt5p3L69sVmxJA0ughYgD/kkHM7fbg==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/kit/node_modules/@solana/codecs\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs/-/codecs-4.0.0.tgz\",\n      \"integrity\": \"sha512-qh+Le1u9QBDPubqUrFU5BGX3Kyj7x0viO6z2SUuM0CSqYUvwE7w724LXwDA9QoEL5JkED1rB3bQg4M0bDrABpA==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/codecs-data-structures\": \"4.0.0\",\n        \"@solana/codecs-numbers\": \"4.0.0\",\n        \"@solana/codecs-strings\": \"4.0.0\",\n        \"@solana/options\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/kit/node_modules/@solana/codecs-core\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-4.0.0.tgz\",\n      \"integrity\": \"sha512-28kNUsyIlhU3MO3/7ZLDqeJf2YAm32B4tnTjl5A9HrbBqsTZ+upT/RzxZGP1MMm7jnPuIKCMwmTpsyqyR6IUpw==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/kit/node_modules/@solana/codecs-data-structures\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-4.0.0.tgz\",\n      \"integrity\": \"sha512-pvh+Oxz6UIbWxcgwvVwMJIV4nvZn3EHL5ZvCIPClE5Ep8K5sJ8RoRvOohqLcIv9LYn/EZNoXpCodREX/OYpsGw==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/codecs-numbers\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/kit/node_modules/@solana/codecs-numbers\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-4.0.0.tgz\",\n      \"integrity\": \"sha512-z9zpjtcwzqT9rbkKVZpkWB5/0V7+6YRKs6BccHkGJlaDx8Pe/+XOvPi2rEdXPqrPd9QWb5Xp1iBfcgaDMyiOiA==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/kit/node_modules/@solana/codecs-strings\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-4.0.0.tgz\",\n      \"integrity\": \"sha512-XvyD+sQ1zyA0amfxbpoFZsucLoe+yASQtDiLUGMDg5TZ82IHE3B7n82jE8d8cTAqi0HgqQiwU13snPhvg1O0Ow==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/codecs-numbers\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"fastestsmallesttextencoderdecoder\": \"^1.0.22\",\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/kit/node_modules/@solana/errors\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/errors/-/errors-4.0.0.tgz\",\n      \"integrity\": \"sha512-3YEtvcMvtcnTl4HahqLt0VnaGVf7vVWOnt6/uPky5e0qV6BlxDSbGkbBzttNjxLXHognV0AQi3pjvrtfUnZmbg==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"chalk\": \"5.6.2\",\n        \"commander\": \"14.0.1\"\n      },\n      \"bin\": {\n        \"errors\": \"bin/cli.mjs\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/kit/node_modules/@solana/fast-stable-stringify\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-4.0.0.tgz\",\n      \"integrity\": \"sha512-sNJRi0RQ93vkGQ9VyFTSGm6mfKLk0FWOFpJLcqyP0BNUK1CugBaUMnxAmGqNaVSCktJagTSLqAMi9k1VSdh+Cg==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/kit/node_modules/@solana/functional\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/functional/-/functional-4.0.0.tgz\",\n      \"integrity\": \"sha512-duprxASuT0VXlHj3bLBdy9+ZpqdmCZhzCUmTsXps4UlDKr9PxSCQIQ+NK6OPhtBWOh1sNEcT1f1nY/MVqF/KHg==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/kit/node_modules/@solana/keys\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/keys/-/keys-4.0.0.tgz\",\n      \"integrity\": \"sha512-aPz+LF9QK3EHjuklYBnnalcLVHUNz5s4m4DXNVGAtjJD7Q9zEu2dBUm9mRKwlLbQibNOEGa1m86HCjcboqXdjg==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@solana/assertions\": \"4.0.0\",\n        \"@solana/codecs-core\": \"4.0.0\",\n        \"@solana/codecs-strings\": \"4.0.0\",\n        \"@solana/errors\": \"4.0.0\",\n        \"@solana/nominal-types\": \"4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=5.3.3\"\n      }\n    },\n    \"node_modules/@solana/kit/node_modules/@solana/nominal-types\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@solana/nominal-types/-/nominal-types-4.0.0.tgz\",\n      \"integrity\": \"sha512-zIjHZY+5uboigbzsNhHmF3AlP/xACYxbB0Cb1VAI9i+eFShMeu/3VIrj7x1vbq9hfQKGSFHNFGFqQTivdzpbLw==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=20.\n\nFile v1.5.4:package.json\n\n{\n  \"name\": \"thetanuts-openclaw-skill\",\n  \"version\": \"1.0.0\",\n  \"description\": \"OpenClaw skill for trading crypto options on Thetanuts Finance\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"get-prices\": \"npx tsx scripts/get-prices.ts\",\n    \"get-mm-pricing\": \"npx tsx scripts/get-mm-pricing.ts\",\n    \"get-positions\": \"npx tsx scripts/get-positions.ts\",\n    \"build-rfq\": \"npx tsx scripts/build-rfq.ts\",\n    \"fetch-orders\": \"npx tsx scripts/fetch-orders.ts\",\n    \"calculate-payout\": \"npx tsx scripts/calculate-payout.ts\"\n  },\n  \"dependencies\": {\n    \"@scure/bip39\": \"^1.5.4\",\n    \"@tetherto/wdk\": \"^1.0.0-beta.6\",\n    \"@tetherto/wdk-wallet-evm\": \"^1.0.0-beta.10\",\n    \"@tetherto/wdk-wallet-solana\": \"^1.0.0-beta.5\",\n    \"@thetanuts-finance/thetanuts-client\": \"^0.2.4\",\n    \"ethers\": \"^6.13.0\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"^20.0.0\",\n    \"tsx\": \"^4.7.0\",\n    \"typescript\": \"^5.0.0\"\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n\nArchive v1.5.3: 30 files, 116725 bytes\n\nFiles: CLAUDE.md (4252b), manifest.json (2544b), package-lock.json (198075b), package.json (940b), README.md (10581b), scripts/approve-token.ts (12450b), scripts/build-rfq.ts (11518b), scripts/calculate-payout.ts (5344b), scripts/check-orderbook.ts (11803b), scripts/check-rfq-fill.ts (7008b), scripts/create-wallet.ts (4119b), scripts/fetch-orders.ts (3152b), scripts/fill-order.ts (11172b), scripts/get-balance.ts (6912b), scripts/get-mm-pricing.ts (3228b), scripts/get-positions.ts (2972b), scripts/get-prices.ts (1245b), scripts/import-wallet.ts (3730b), scripts/lib/load-seed.ts (2399b), scripts/onboard.sh (5549b), scripts/send-transaction.ts (7077b), scripts/sign-message.ts (4108b), scripts/update.sh (6059b), scripts/wallet-balance.js (8082b), scripts/wallet-create.js (4529b), scripts/wallet-discover.js (3902b), scripts/wallet-import.js (5392b), scripts/wallet-select.js (6559b), SKILL.md (82786b), _meta.json (128b)\n\nFile v1.5.3:SKILL.md\n\n---\nname: thetanuts\ndescription: Trade crypto options on Thetanuts Finance - orderbook fills, RFQ lifecycle, multi-strike structures, real-time WebSocket, wallet management, early settlement, referrer fees\nhomepage: https://github.com/Thetanuts-Finance/thetanuts-sdk\nuser-invocable: true\nmetadata: {\"openclaw\":{\"emoji\":\"📈\",\"install\":[{\"type\":\"node\",\"package\":\".\"}]}}\n---\n\n## First-Time Setup (Onboarding Flow)\n\n### Startup Checks\n\nOn a new conversation the agent should:\n\n```\nStep 1: Check wallet status (read-only, safe to run automatically)\n   └─> node scripts/wallet-discover.js\n\nStep 2: Interpret the result:\n   - configured: false → Enter ONBOARDING MODE\n   - configured: true  → Greet user with their address, proceed normally\n```\n\n### Updates (User-Initiated Only)\n\nThe agent must NEVER run `update.sh` automatically. Updates change code that signs\ntransactions, so they require explicit user consent each time.\n\nWhen the user asks to check for or apply updates:\n- Run `bash scripts/update.sh` and surface the full output to the user.\n- If a new version is available, summarize the diff/changelog and ask the user\n  to confirm before applying.\n- If already up to date, say so explicitly. Do not run code-changing commands\n  silently.\n\n### Onboarding Mode (No Wallet Detected)\n\nWhen no wallet is configured, guide the user through setup in this order:\n\n```\nNo wallet detected\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ \"Welcome to Thetanuts Options Trading!  │\n│  Let's get you set up in 3 steps.\"      │\n└─────────────────────────────────────────┘\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ Step 1: Create or import a wallet       │\n│ • New user → wallet-create.js           │\n│ • Have a seed? → wallet-import.js       │\n│                                         │\n│ WARN: Use a DEDICATED wallet.           │\n│ Never reuse your primary wallet seed.   │\n│ Custody stays LOCAL on your machine.    │\n└─────────────────────────────────────────┘\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ Step 2: Verify & fund the wallet        │\n│ • Run wallet-discover.js → show address │\n│ • Run wallet-balance.js --chain         │\n│   base-mainnet                          │\n│ • If zero balance: explain funding      │\n│   - Need ETH on Base for gas fees       │\n│   - Need USDC for PUT trades            │\n│   - Need WETH for CALL trades           │\n│   - Bridge via bridge.base.org          │\n└─────────────────────────────────────────┘\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ Step 3: Market overview & first trade   │\n│ • Fetch prices: get-prices.ts           │\n│ • WebSearch for market news             │\n│ • Ask risk preference (LOW/MED/HIGH)    │\n│ • Show first strategy recommendation    │\n└─────────────────────────────────────────┘\n```\n\n### Welcome Message (After Onboarding or Returning User)\n\nOnce wallet is configured, the agent MUST automatically:\n1. Show wallet address and balances (run `wallet-discover.js` + `wallet-balance.js`)\n2. Fetch current market prices (run `get-prices.ts`)\n3. Show a brief market snapshot with available option types\n\nPresent this without the user asking:\n\n```\nWelcome to Thetanuts Options Trading!\n\nYour wallet: 0x...\nChain: Base Mainnet\nBalances: X ETH (gas) | Y USDC | Z WETH\n\nLive Market:\n• ETH: $X,XXX (24h: +X.X%)\n• BTC: $XX,XXX (24h: +X.X%)\n\nAvailable options: PUT, CALL, spreads, butterflies, condors\n\nWhat would you like to do?\n• \"Show me ETH puts\"      → View available strikes and prices\n• \"Recommend a strategy\"  → I'll check market news and suggest based on your risk preference\n• \"Check my positions\"    → View open trades and P&L on expired ones\n\nNew to options? Just say \"teach me about options\"\n```\n\n### Security Reminders (shown during onboarding)\n\n- **DEDICATED WALLET**: Use a dedicated wallet seed for this integration. Never reuse your primary wallet.\n- **LOCAL CUSTODY**: Your seed phrase stays on your machine. The agent never sends it anywhere.\n- **TRANSACTIONS**: Irreversible once broadcast. Always verify before sending.\n- **APPROVALS**: Token approvals allow contracts to spend your tokens. Only approve trusted contracts.\n- **GAS**: Ensure wallet has ETH on Base for gas fees.\n- **RFQ KEYS**: Back up `.thetanuts-keys/` directory — lost keys cannot decrypt past offers.\n\n---\n\n# Thetanuts Options Trading\n\n## What is TNUT Agent?\n\nTNUT Agent is your AI-powered assistant for trading crypto options on Thetanuts Finance.\n\n**What it does:**\n- Manages local wallets safely (custody stays on your machine)\n- Accesses market intelligence (prices, orderbook, MM quotes)\n- Inspects options and positions\n- Prepares and executes trades through the Thetanuts protocol\n\n**Local-first design:**\n- Wallet custody stays LOCAL - your seed phrase never leaves your machine\n- Signing stays LOCAL - transactions are signed on your device\n- Backend provides intelligence, data, and routing support only\n\n**Capabilities:**\n| Category | What You Can Do |\n|----------|----------------|\n| Wallet | Create, import, check balances |\n| Market Data | Live prices, MM quotes, orderbook orders |\n| Trading | Fill orderbook orders, submit RFQs, approve tokens |\n| Positions | View open positions, calculate payoffs |\n\n---\n\n## Options 101\n\n### What are Options?\n\nOptions are contracts that give you the right (but not obligation) to buy or sell an asset at a specific price by a specific date.\n\n### PUT Options\n\nA **PUT** gives the holder the right to SELL at the strike price.\n\n| Action | You... | Profit When | Risk |\n|--------|--------|-------------|------|\n| **Buy PUT** | Pay premium upfront | Price drops below strike | Lose premium if price stays up |\n| **Sell PUT** | Receive premium | Price stays above strike | Lose if price drops below strike |\n\n**Example:**\n- ETH is at $2000\n- You BUY a $1900 PUT for $10 premium\n- If ETH drops to $1800 → Your PUT is worth $100 (profit: $90)\n- If ETH stays at $2000 → Your PUT expires worthless (loss: $10 premium)\n\n### CALL Options\n\nA **CALL** gives the holder the right to BUY at the strike price.\n\n| Action | You... | Profit When | Risk |\n|--------|--------|-------------|------|\n| **Buy CALL** | Pay premium upfront | Price rises above strike | Lose premium if price stays down |\n| **Sell CALL** | Receive premium | Price stays below strike | Lose if price rises above strike |\n\n**Example:**\n- ETH is at $2000\n- You BUY a $2100 CALL for $15 premium\n- If ETH rises to $2300 → Your CALL is worth $200 (profit: $185)\n- If ETH stays at $2000 → Your CALL expires worthless (loss: $15 premium)\n\n### Key Terms\n\n| Term | Definition |\n|------|------------|\n| **Strike** | The price at which the option can be exercised |\n| **Expiry** | When the option expires (settlement date, 8:00 UTC) |\n| **Premium** | The price paid for the option |\n| **Settlement** | Cash payment based on price difference at expiry |\n| **Collateral** | Funds locked to back the option (for sellers) |\n\n### Collateral Requirements by Option Type\n\n**IMPORTANT:** Different option types require different collateral tokens:\n\n| Option Type | Implementation | Collateral Required |\n|-------------|----------------|---------------------|\n| **PUT** | PUT | USDC (quote asset) |\n| **CALL** | INVERSE_CALL | WETH (base asset) |\n\n- **PUT options**: Collateral in USDC. Formula: `(collateral × 1e8) / strike`\n- **CALL options**: Collateral in WETH. Formula: `collateral / 1e12` (1 WETH = 1 contract)\n\nThe `build-rfq.ts` script automatically selects the correct collateral based on option type.\n\n---\n\n## Multi-Strike Option Structures\n\nBeyond vanilla PUT and CALL options, Thetanuts supports advanced multi-strike structures for sophisticated trading strategies.\n\n### All Option Types\n\n| Type | Strikes | Collateral | Description |\n|------|---------|------------|-------------|\n| **PUT** | 1 | USDC | Standard cash-settled put |\n| **INVERSE_CALL** | 1 | WETH | Cash-settled call (base collateral) |\n| **CALL_SPREAD** | 2 | USDC | Buy lower strike call, sell higher strike call |\n| **PUT_SPREAD** | 2 | USDC | Buy higher strike put, sell lower strike put |\n| **CALL_FLY** | 3 | USDC | Call butterfly - profit near middle strike |\n| **PUT_FLY** | 3 | USDC | Put butterfly - profit near middle strike |\n| **CALL_CONDOR** | 4 | USDC | Call condor - wider profit range |\n| **PUT_CONDOR** | 4 | USDC | Put condor - wider profit range |\n| **IRON_CONDOR** | 4 | USDC | Put spread + call spread (neutral) |\n| **PHYSICAL_CALL** | 1 | WETH | Physically settled call |\n| **PHYSICAL_PUT** | 1 | USDC | Physically settled put |\n\n### Strike Ordering Rules\n\n**CRITICAL:** Strikes must be ordered correctly or the RFQ will fail.\n\n| Structure | Type | Strike Order | Example |\n|-----------|------|--------------|---------|\n| Vanilla | PUT/CALL | N/A (1 strike) | `--strike 1900` |\n| Spread | PUT | Descending (high→low) | `--strikes 1900,1800` |\n| Spread | CALL | Ascending (low→high) | `--strikes 2000,2100` |\n| Butterfly | PUT | Descending | `--strikes 1900,1850,1800` |\n| Butterfly | CALL | Ascending | `--strikes 2000,2050,2100` |\n| Condor | ALL | Always ascending | `--strikes 1800,1900,2100,2200` |\n\n### Collateral Formulas by Structure (Human-Readable)\n\nThese are simplified formulas for quick estimation. For exact on-chain values, use `previewFillOrder()` or `client.utils.calculateCollateral()`.\n\n| Structure | Collateral | Simplified Formula | Example |\n|-----------|-----------|-------------------|---------|\n| **Vanilla PUT** | USDC | `collateral / strike` | $1900 USDC at $1900 strike = 1 contract |\n| **INVERSE_CALL** | WETH | `collateral` (1:1) | 1 WETH = 1 contract |\n| **CALL_SPREAD** | USDC | `collateral / (upper - lower)` | $100 USDC / $100 width = 1 contract |\n| **PUT_SPREAD** | USDC | `collateral / (upper - lower)` | $100 USDC / $100 width = 1 contract |\n| **Butterfly** | USDC | `collateral / (middle - lower)` | $50 USDC / $50 wing = 1 contract |\n| **Condor** | USDC | `collateral / (strike2 - strike1)` | $100 USDC / $100 inner width = 1 contract |\n| **IRON_CONDOR** | USDC | `collateral / max(K2-K1, K4-K3)` | Based on wider wing |\n| **PHYSICAL_CALL** | WETH | Same as INVERSE_CALL | 1 WETH = 1 contract |\n| **PHYSICAL_PUT** | USDC | Same as Vanilla PUT | collateral / strike |\n\n**Key rule:** Only INVERSE_CALL and PHYSICAL_CALL use WETH (base asset). **Everything else uses USDC** — including CALL_SPREAD, CALL_FLY, and CALL_CONDOR.\n\n### When to Use Each Structure\n\n| Structure | Market View | Risk Level | Risk/Reward | Best For |\n|-----------|-------------|------------|-------------|----------|\n| **PUT** | Bearish | HIGH | Large profit (up to strike - premium), lose premium | Strong downside conviction |\n| **CALL** | Bullish | HIGH | Unlimited profit, lose premium | Strong upside conviction |\n| **PUT_SPREAD** | Moderately bearish | MEDIUM | Capped profit/loss | Cheaper than vanilla put |\n| **CALL_SPREAD** | Moderately bullish | MEDIUM | Capped profit/loss | Cheaper than vanilla call |\n| **PUT_FLY** | Neutral/range-bound | LOW | High reward if pinned, tiny cost | Low cost, precise target |\n| **CALL_FLY** | Neutral/range-bound | LOW | High reward if pinned, tiny cost | Low cost, precise target |\n| **CONDOR** | Neutral/range-bound | MEDIUM | Lower reward, wider range | More forgiving than fly |\n| **IRON_CONDOR** | Neutral | LOW | Collect premium both sides | Range-bound markets |\n| **PHYSICAL_CALL** | Bullish (want delivery) | HIGH | Receive underlying asset | Physical settlement needed |\n| **PHYSICAL_PUT** | Bearish (want delivery) | HIGH | Deliver underlying asset | Physical settlement needed |\n\n### Risk-Categorized Strategy Recommendations\n\nWhen a user asks for a strategy recommendation, **FIRST ask about their risk preference**, then match to appropriate strategies within that tier.\n\n#### Step 1: Ask the User's Risk Level\n\nPresent these three options:\n\n| Risk Level | What It Means | Max Loss | Profit Potential |\n|------------|---------------|----------|-----------------|\n| **LOW** | Defined max loss, premium collection, high probability of small wins | Capped & known upfront | Capped but consistent |\n| **MEDIUM** | Spreads with balanced risk/reward, moderate probability | Capped at spread width | Capped at spread width |\n| **HIGH** | Full directional exposure, low probability of large wins | Full premium (buyer) or very large (seller) | Unlimited (buyer) |\n\n#### Step 2: Strategy Decision Tree by Risk Level\n\n```\nUser wants a strategy recommendation\n        │\n        ▼\n┌──────────────────────────────────┐\n│ Step 1: Check market news        │\n│ (WebSearch - see News section)   │\n└──────────────────────────────────┘\n        │\n        ▼\n┌──────────────────────────────────┐\n│ Step 2: Ask risk level           │\n│ LOW / MEDIUM / HIGH              │\n└──────────────────────────────────┘\n        │\n        ├── LOW RISK\n        │   │\n        │   ├── Neutral view ──────► IRON_CONDOR (sell)\n        │   │                        Collect premium both sides, profit if range-bound\n        │   │                        Max loss: spread width - premium\n        │   │                        Max gain: premium collected\n        │   │                        Win prob: ~60-70% (price stays in range)\n        │   │\n        │   ├── Slightly bullish ──► PUT_FLY (buy) or Sell PUT via orderbook\n        │   │                        Butterfly: tiny cost, big payout if pinned\n        │   │                        Max loss: premium paid (very small)\n        │   │                        Max gain: wing width - premium\n        │   │\n        │   ├── Slightly bearish ──► CALL_FLY (buy) or Sell CALL via orderbook\n        │   │                        Same as above, opposite direction\n        │   │\n        │   └── Range-bound ───────► Butterfly (CALL_FLY / PUT_FLY)\n        │                            Cheapest defined-risk play\n        │                            Max loss: premium paid (~$3-5/contract)\n        │                            Max gain: wing width (~$47-50/contract)\n        │\n        ├── MEDIUM RISK\n        │   │\n        │   ├── Bullish ──────────► CALL_SPREAD (buy)\n        │   │                       Cheaper than vanilla call, capped both sides\n        │   │                       Max loss: premium paid\n        │   │                       Max gain: spread width - premium\n        │   │                       Risk/Reward: typically 1:1 to 1:3\n        │   │\n        │   ├── Bearish ─────────► PUT_SPREAD (buy)\n        │   │                       Cheaper than vanilla put, capped both sides\n        │   │                       Max loss: premium paid\n        │   │                       Max gain: spread width - premium\n        │   │\n        │   └── Range-bound ─────► CONDOR (CALL_CONDOR / PUT_CONDOR)\n        │                          Wider profit range than butterfly\n        │                          Max loss: wing width - premium collected\n        │                          Max gain: premium collected (sell) or inner width (buy)\n        │\n        └── HIGH RISK\n            │\n            ├── Bullish ──────────► CALL (vanilla buy) / INVERSE_CALL\n            │                       Unlimited profit potential if price rises\n            │                       Max loss: full premium paid\n            │                       Max gain: unlimited\n            │\n            ├── Bearish ─────────► PUT (vanilla buy)\n            │                       Unlimited profit if price crashes\n            │                       Max loss: full premium paid\n            │                       Max gain: strike - premium (if price → 0)\n            │\n            └── Selling premium ──► Naked PUT sell or CALL sell\n                                    Collect premium, very large risk if wrong\n                                    Max loss: strike price (PUT) or unlimited (CALL)\n                                    Max gain: premium collected\n```\n\n#### Risk Summary Card (Always Show When Recommending)\n\nEvery strategy recommendation MUST include this card:\n\n```\n┌────────────────────────────────────────────────────┐\n│ Strategy:  [STRATEGY NAME]                         │\n│ Risk:      [LOW / MEDIUM / HIGH]                   │\n│ Direction: [BULLISH / BEARISH / NEUTRAL]           │\n├────────────────────────────────────────────────────┤\n│ Max Loss:  $[amount] ([description])               │\n│ Max Gain:  $[amount] ([description])               │\n│ Break-even: $[price]                               │\n│ Win Zone:  Price between $[low] and $[high]        │\n│ Collateral: [amount] [token]                       │\n└────────────────────────────────────────────────────┘\n```\n\n#### Collateral Efficiency Comparison\n\nDifferent structures give you different exposure per dollar of collateral:\n\n| Structure | $100 Collateral Gets You | Relative Efficiency | Risk Level |\n|-----------|-------------------------|---------------------|------------|\n| **Vanilla PUT** (at $2000 strike) | ~0.05 contracts | 1x (baseline) | HIGH |\n| **PUT_SPREAD** ($100 width) | 1 contract | **20x more** | MEDIUM |\n| **Butterfly** ($50 wing width) | 2 contracts | **40x more** | LOW |\n| **Condor** ($100 inner width) | 1 contract | **20x more** | MEDIUM |\n| **Iron Condor** ($100 inner width) | 1 contract | **20x more** | LOW |\n\n**Key Insight:** For users with small collateral (under $100), LOW and MEDIUM risk strategies (spreads, butterflies) provide significantly more market exposure than HIGH risk vanilla options.\n\n#### Strategy Selection Inputs\n\nWhen recommending a strategy, consider these inputs in order of priority:\n\n| Priority | Input | How to Determine | Impact on Recommendation |\n|----------|-------|-----------------|-------------------------|\n| **1** | **Risk Level** | Ask user: low, medium, or high? | PRIMARY filter — determines available strategies |\n| **2** | **Market View** | Ask user: bullish, bearish, or neutral? | Determines direction within risk tier |\n| **3** | **News/Events** | WebSearch for recent market events | Informs conviction level and timing |\n| **4** | **Collateral Size** | Check wallet balance | Small = prefer spreads/butterflies for efficiency |\n| **5** | **Conviction Level** | Ask: strong view or moderate? | High conviction may justify higher risk tier |\n| **6** | **Expiry Timeframe** | Check available expiries | Short-term neutral = butterfly, Longer = condor |\n\n### News & Events Integration\n\n**Before EVERY strategy recommendation, the agent MUST search for recent market-moving events.** This ensures context-aware recommendations, not purely technical ones.\n\n#### How to Fetch Market News\n\nUse WebSearch with these queries (run at least 2):\n\n| Query | Purpose |\n|-------|---------|\n| `\"crypto market news today\"` | General market sentiment |\n| `\"ethereum price catalyst\"` or `\"bitcoin price catalyst\"` | Asset-specific events |\n| `\"FOMC meeting crypto\"` or `\"CPI inflation crypto\"` | Macro events affecting crypto |\n| `\"crypto options expiry this week\"` | Options-specific events (pin risk, gamma squeeze) |\n| `\"ethereum upgrade\"` or `\"bitcoin ETF flows\"` | Protocol/regulatory catalysts |\n\nIf WebSearch returns a relevant article, use **WebFetch\n\nArchive v1.5.2: 30 files, 115126 bytes\n\nFiles: CLAUDE.md (2738b), manifest.json (2544b), package-lock.json (193902b), package.json (940b), README.md (10581b), scripts/approve-token.ts (12450b), scripts/build-rfq.ts (11518b), scripts/calculate-payout.ts (5344b), scripts/check-orderbook.ts (11803b), scripts/check-rfq-fill.ts (7008b), scripts/create-wallet.ts (4119b), scripts/fetch-orders.ts (3152b), scripts/fill-order.ts (11172b), scripts/get-balance.ts (6912b), scripts/get-mm-pricing.ts (3228b), scripts/get-positions.ts (2972b), scripts/get-prices.ts (1245b), scripts/import-wallet.ts (3730b), scripts/lib/load-seed.ts (2399b), scripts/onboard.sh (5549b), scripts/send-transaction.ts (7077b), scripts/sign-message.ts (4108b), scripts/update.sh (6059b), scripts/wallet-balance.js (8082b), scripts/wallet-create.js (4529b), scripts/wallet-discover.js (3902b), scripts/wallet-import.js (5392b), scripts/wallet-select.js (6559b), SKILL.md (81986b), _meta.json (128b)\n\nArchive v1.5.1: 30 files, 115027 bytes\n\nFiles: CLAUDE.md (2738b), manifest.json (2544b), package-lock.json (193902b), package.json (940b), README.md (10454b), scripts/approve-token.ts (12450b), scripts/build-rfq.ts (11518b), scripts/calculate-payout.ts (5344b), scripts/check-orderbook.ts (11803b), scripts/check-rfq-fill.ts (7008b), scripts/create-wallet.ts (4119b), scripts/fetch-orders.ts (3152b), scripts/fill-order.ts (11172b), scripts/get-balance.ts (6912b), scripts/get-mm-pricing.ts (3228b), scripts/get-positions.ts (2972b), scripts/get-prices.ts (1245b), scripts/import-wallet.ts (3730b), scripts/lib/load-seed.ts (2268b), scripts/onboard.sh (5549b), scripts/send-transaction.ts (7077b), scripts/sign-message.ts (4108b), scripts/update.sh (6059b), scripts/wallet-balance.js (8082b), scripts/wallet-create.js (4529b), scripts/wallet-discover.js (3902b), scripts/wallet-import.js (5392b), scripts/wallet-select.js (6559b), SKILL.md (81986b), _meta.json (128b)\n\nArchive v1.5.0: 30 files, 114016 bytes\n\nFiles: CLAUDE.md (2716b), manifest.json (2234b), package-lock.json (193902b), package.json (940b), README.md (10472b), scripts/approve-token.ts (9840b), scripts/build-rfq.ts (11518b), scripts/calculate-payout.ts (5344b), scripts/check-orderbook.ts (11803b), scripts/check-rfq-fill.ts (7008b), scripts/create-wallet.ts (4119b), scripts/fetch-orders.ts (3152b), scripts/fill-order.ts (11172b), scripts/get-balance.ts (6912b), scripts/get-mm-pricing.ts (3228b), scripts/get-positions.ts (2972b), scripts/get-prices.ts (1245b), scripts/import-wallet.ts (3730b), scripts/lib/load-seed.ts (2268b), scripts/onboard.sh (5549b), scripts/send-transaction.ts (7077b), scripts/sign-message.ts (4108b), scripts/update.sh (6059b), scripts/wallet-balance.js (8082b), scripts/wallet-create.js (4529b), scripts/wallet-discover.js (3902b), scripts/wallet-import.js (5392b), scripts/wallet-select.js (6559b), SKILL.md (81986b), _meta.json (128b)\n\nArchive v1.4.0: 29 files, 111837 bytes\n\nFiles: CLAUDE.md (2716b), manifest.json (1226b), package-lock.json (193854b), package.json (940b), README.md (9603b), scripts/approve-token.ts (8999b), scripts/build-rfq.ts (11518b), scripts/calculate-payout.ts (5344b), scripts/check-orderbook.ts (11773b), scripts/check-rfq-fill.ts (7008b), scripts/create-wallet.ts (4119b), scripts/fetch-orders.ts (3152b), scripts/fill-order.ts (11385b), scripts/get-balance.ts (7672b), scripts/get-mm-pricing.ts (3228b), scripts/get-positions.ts (2972b), scripts/get-prices.ts (1245b), scripts/import-wallet.ts (4534b), scripts/onboard.sh (5549b), scripts/send-transaction.ts (7833b), scripts/sign-message.ts (4741b), scripts/update.sh (6059b), scripts/wallet-balance.js (8082b), scripts/wallet-create.js (4529b), scripts/wallet-discover.js (3902b), scripts/wallet-import.js (5392b), scripts/wallet-select.js (6559b), SKILL.md (81655b), _meta.json (128b)\n\nArchive v1.2.0: 28 files, 108821 bytes\n\nFiles: manifest.json (1226b), package-lock.json (193854b), package.json (940b), README.md (9337b), scripts/approve-token.ts (8999b), scripts/build-rfq.ts (11542b), scripts/calculate-payout.ts (5344b), scripts/check-orderbook.ts (11773b), scripts/check-rfq-fill.ts (7008b), scripts/create-wallet.ts (4119b), scripts/fetch-orders.ts (3152b), scripts/fill-order.ts (11246b), scripts/get-balance.ts (7672b), scripts/get-mm-pricing.ts (3228b), scripts/get-positions.ts (2972b), scripts/get-prices.ts (1245b), scripts/import-wallet.ts (4534b), scripts/onboard.sh (5549b), scripts/send-transaction.ts (7833b), scripts/sign-message.ts (4741b), scripts/update.sh (6059b), scripts/wallet-balance.js (8082b), scripts/wallet-create.js (4529b), scripts/wallet-discover.js (3902b), scripts/wallet-import.js (5392b), scripts/wallet-select.js (6559b), SKILL.md (79077b), _meta.json (128b)","readmeExcerpt":"Skill: Thetanuts Openclaw Owner: goheesheng Summary: Trade crypto options on Thetanuts Finance - orderbook fills, RFQ lifecycle, multi-strike structures, real-time WebSocket, wallet management, early settlement... Tags: latest:1.5.4 Version history: v1.5.4 | 2026-05-25T07:46:17.705Z | user Fix manifest updateUrl: now points at Thetanuts-Finance/thetanuts-openclaw (canonical) and the correct filename scripts/update.sh","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"Step 1: Check wallet status (read-only, safe to run automatically)\n   └─> node scripts/wallet-discover.js\n\nStep 2: Interpret the result:\n   - configured: false → Enter ONBOARDING MODE\n   - configured: true  → Greet user with their address, proceed normally"},{"language":"text","snippet":"No wallet detected\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ \"Welcome to Thetanuts Options Trading!  │\n│  Let's get you set up in 3 steps.\"      │\n└─────────────────────────────────────────┘\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ Step 1: Create or import a wallet       │\n│ • New user → wallet-create.js           │\n│ • Have a seed? → wallet-import.js       │\n│                                         │\n│ WARN: Use a DEDICATED wallet.           │\n│ Never reuse your primary wallet seed.   │\n│ Custody stays LOCAL on your machine.    │\n└─────────────────────────────────────────┘\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ Step 2: Verify & fund the wallet        │\n│ • Run wallet-discover.js → show address │\n│ • Run wallet-balance.js --chain         │\n│   base-mainnet                          │\n│ • If zero balance: explain funding      │\n│   - Need ETH on Base for gas fees       │\n│   - Need USDC for PUT trades            │\n│   - Need WETH for CALL trades           │\n│   - Bridge via bridge.base.org          │\n└─────────────────────────────────────────┘\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ Step 3: Market overview & first trade   │\n│ • Fetch prices: get-prices.ts           │\n│ • WebSearch for market news             │\n│ • Ask risk preference (LOW/MED/HIGH)    │\n│ • Show first strategy recommendation    │\n└─────────────────────────────────────────┘"},{"language":"text","snippet":"Welcome to Thetanuts Options Trading!\n\nYour wallet: 0x...\nChain: Base Mainnet\nBalances: X ETH (gas) | Y USDC | Z WETH\n\nLive Market:\n• ETH: $X,XXX (24h: +X.X%)\n• BTC: $XX,XXX (24h: +X.X%)\n\nAvailable options: PUT, CALL, spreads, butterflies, condors\n\nWhat would you like to do?\n• \"Show me ETH puts\"      → View available strikes and prices\n• \"Recommend a strategy\"  → I'll check market news and suggest based on your risk preference\n• \"Check my positions\"    → View open trades and P&L on expired ones\n\nNew to options? Just say \"teach me about options\""},{"language":"text","snippet":"User wants a strategy recommendation\n        │\n        ▼\n┌──────────────────────────────────┐\n│ Step 1: Check market news        │\n│ (WebSearch - see News section)   │\n└──────────────────────────────────┘\n        │\n        ▼\n┌──────────────────────────────────┐\n│ Step 2: Ask risk level           │\n│ LOW / MEDIUM / HIGH              │\n└──────────────────────────────────┘\n        │\n        ├── LOW RISK\n        │   │\n        │   ├── Neutral view ──────► IRON_CONDOR (sell)\n        │   │                        Collect premium both sides, profit if range-bound\n        │   │                        Max loss: spread width - premium\n        │   │                        Max gain: premium collected\n        │   │                        Win prob: ~60-70% (price stays in range)\n        │   │\n        │   ├── Slightly bullish ──► PUT_FLY (buy) or Sell PUT via orderbook\n        │   │                        Butterfly: tiny cost, big payout if pinned\n        │   │                        Max loss: premium paid (very small)\n        │   │                        Max gain: wing width - premium\n        │   │\n        │   ├── Slightly bearish ──► CALL_FLY (buy) or Sell CALL via orderbook\n        │   │                        Same as above, opposite direction\n        │   │\n        │   └── Range-bound ───────► Butterfly (CALL_FLY / PUT_FLY)\n        │                            Cheapest defined-risk play\n        │                            Max loss: premium paid (~$3-5/contract)\n        │                            Max gain: wing width (~$47-50/contract)\n        │\n        ├── MEDIUM RISK\n        │   │\n        │   ├── Bullish ──────────► CALL_SPREAD (buy)\n        │   │                       Cheaper than vanilla call, capped both sides\n        │   │                       Max loss: premium paid\n        │   │                       Max gain: spread width - premium\n        │   │                       Risk/Reward: typically 1:1 to 1:3\n        │   │\n        │   ├── Bearish ─────────► PUT_SPREAD (buy)\n   "},{"language":"text","snippet":"┌────────────────────────────────────────────────────┐\n│ Strategy:  [STRATEGY NAME]                         │\n│ Risk:      [LOW / MEDIUM / HIGH]                   │\n│ Direction: [BULLISH / BEARISH / NEUTRAL]           │\n├────────────────────────────────────────────────────┤\n│ Max Loss:  $[amount] ([description])               │\n│ Max Gain:  $[amount] ([description])               │\n│ Break-even: $[price]                               │\n│ Win Zone:  Price between $[low] and $[high]        │\n│ Collateral: [amount] [token]                       │\n└────────────────────────────────────────────────────┘"},{"language":"text","snippet":"Market Context (from recent news):\n• [Event 1]: [brief description] → [bullish/bearish/neutral]\n• [Event 2]: [brief description] → [bullish/bearish/neutral]\n\nOverall market bias: [BULLISH / BEARISH / NEUTRAL / UNCERTAIN]\n\nBased on [RISK LEVEL] risk preference and current market conditions:\n[Strategy recommendation with Risk Summary Card]"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: thetanuts\ndescription: Trade crypto options on Thetanuts Finance - orderbook fills, RFQ lifecycle, multi-strike structures, real-time WebSocket, wallet management, early settlement, referrer fees\nhomepage: https://github.com/Thetanuts-Finance/thetanuts-sdk\nuser-invocable: true\nmetadata: {\"openclaw\":{\"emoji\":\"📈\",\"install\":[{\"type\":\"node\",\"package\":\".\"}]}}\n---\n\n## First-Time Setup (Onboarding Flow)\n\n### Startup Checks\n\nOn a new conversation the agent should:\n\n```\nStep 1: Check wallet status (read-only, safe to run automatically)\n   └─> node scripts/wallet-discover.js\n\nStep 2: Interpret the result:\n   - configured: false → Enter ONBOARDING MODE\n   - configured: true  → Greet user with their address, proceed normally\n```\n\n### Updates (User-Initiated Only)\n\nThe agent must NEVER run `update.sh` automatically. Updates change code that signs\ntransactions, so they require explicit user consent each time.\n\nWhen the user asks to check for or apply updates:\n- Run `bash scripts/update.sh` and surface the full output to the user.\n- If a new version is available, summarize the diff/changelog and ask the user\n  to confirm before applying.\n- If already up to date, say so explicitly. Do not run code-changing commands\n  silently.\n\n### Onboarding Mode (No Wallet Detected)\n\nWhen no wallet is configured, guide the user through setup in this order:\n\n```\nNo wallet detected\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ \"Welcome to Thetanuts Options Trading!  │\n│  Let's get you set up in 3 steps.\"      │\n└─────────────────────────────────────────┘\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ Step 1: Create or import a wallet       │\n│ • New user → wallet-create.js           │\n│ • Have a seed? → wallet-import.js       │\n│                                         │\n│ WARN: Use a DEDICATED wallet.           │\n│ Never reuse your primary wallet seed.   │\n│ Custody stays LOCAL on your machine.    │\n└─────────────────────────────────────────┘\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ Step 2: Verify & fund the wallet        │\n│ • Run wallet-discover.js → show address │\n│ • Run wallet-balance.js --chain         │\n│   base-mainnet                          │\n│ • If zero balance: explain funding      │\n│   - Need ETH on Base for gas fees       │\n│   - Need USDC for PUT trades            │\n│   - Need WETH for CALL trades           │\n│   - Bridge via bridge.base.org          │\n└─────────────────────────────────────────┘\n      │\n      ▼\n┌─────────────────────────────────────────┐\n│ Step 3: Market overview & first trade   │\n│ • Fetch prices: get-prices.ts           │\n│ • WebSearch for market news             │\n│ • Ask risk preference (LOW/MED/HIGH)    │\n│ • Show first strategy recommendation    │\n└─────────────────────────────────────────┘\n```\n\n### Welcome Message (After Onboarding or Returning User)\n\nOnce wallet is configured, the agent MUST automatically:\n1. Show wallet address and balances (run `wallet-discover.js` + `wall"},{"path":"README.md","content":"# Thetanuts OpenClaw Skill\n\nOpenClaw skill for trading crypto options on [Thetanuts Finance](https://thetanuts.finance) with integrated wallet management.\n\n## For AI Agents\n\nThe agent instruction set lives in the locally installed `SKILL.md` (the file\nClawHub places next to this README). Read it from the install directory — do\nnot fetch it from the internet, since remote files can change after install\nand ClawHub's security review only covers the published artifact.\n\n`SKILL.md` contains the complete agent instruction set: onboarding flows,\ntrading workflows, strategy recommendation logic, risk-tiered decision trees,\nSDK reference, contract addresses, and example conversations. Read it fully\nbefore assisting users.\n\n## Features\n\n- **Wallet Management**: Create and import EVM/Solana wallets using Tether WDK\n- **Balance Queries**: Check native (ETH/SOL) and token balances (USDC, WETH, cbBTC)\n- **Transaction Execution**: Approve tokens and send transactions directly\n- **Options Trading**: Orderbook fills, RFQ lifecycle, MM pricing, multi-strike structures (spreads, butterflies, condors)\n- **Position Tracking**: Check user positions, calculate payoffs, portfolio ROI\n- **Market Intelligence**: News-informed strategy recommendations with risk-tiered suggestions\n\n## Prerequisites\n\n- [OpenClaw](https://docs.openclaw.ai/) installed and running\n- Node.js >= 18.0.0\n\n## Installation\n\n### Option A: Install from ClawHub (recommended)\n\n```bash\nclawhub install thetanuts\n```\n\nThen skip to Step 2 below.\n\nView on ClawHub: [clawhub.ai/goheesheng/thetanuts](https://clawhub.ai/goheesheng/thetanuts)\n\n### Option B: Clone from GitHub\n\n```bash\ncd ~/.openclaw/workspace/skills\ngit clone https://github.com/goheesheng/thetanuts-openclaw.git thetanuts\n```\n\n### Step 2: Run Onboarding\n\n```bash\ncd ~/.openclaw/workspace/skills/thetanuts\nbash scripts/onboard.sh\n```\n\nThis will:\n- Check prerequisites (node, npm)\n- Create WDK MCP runtime at `~/.openclaw/wdk-mcp`\n- Install project dependencies (for wallet scripts like `wallet-create.js`)\n- Install WDK MCP runtime dependencies\n\n### Step 3: Create or Import Wallet\n\n```bash\n# Create new dedicated wallet\nnode scripts/wallet-create.js\n\n# Or import existing seed\nnode scripts/wallet-import.js --seed-file /path/to/seed.txt\n```\n\n**⚠️ IMPORTANT**: Use a DEDICATED wallet for this integration. Never reuse your primary wallet seed phrase. Write your seed phrase on paper and store it offline (not in a text file, not in a chat, not in email).\n\n### Step 4: Reload OpenClaw\n\nStart a new session to load the skill:\n```\n/new\n```\n\nThe agent will automatically detect your wallet, show your address and balances, and display current ETH/BTC option prices. You're ready to trade.\n\n### Step 5: Fund Your Wallet\n\nBefore trading, you need tokens on Base network:\n\n- **ETH** (gas fees) - Bridge via [bridge.base.org](https://bridge.base.org)\n- **USDC** (for PUT options) - `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`\n- **WETH** (for CALL options) - `0x4200000000000000000"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn79tkg34yw8sea1dpw2jsmh3s80dxwe\",\n  \"slug\": \"thetanuts\",\n  \"version\": \"1.5.4\",\n  \"publishedAt\": 1779695177705\n}"},{"path":"CLAUDE.md","content":"# Thetanuts OpenClaw Skill\n\n## Project Structure\n- `SKILL.md` - Agent instruction set (loaded by OpenClaw, 1800 lines)\n- `scripts/*.js` - Wallet management scripts (run with `node`)\n- `scripts/*.ts` - Trading scripts (run with `npx tsx`)\n- `scripts/onboard.sh` - Installs deps at project root AND `~/.openclaw/wdk-mcp/`\n- `manifest.json` - ClawHub publishing metadata\n\n## SDK Quirks (@thetanuts-finance/thetanuts-client, ^0.2.4)\n- `client.erc20.approve()` returns a TransactionReceipt, NOT TransactionResponse. Do not call `.wait()` on it.\n- `client.optionBook.fillOrder()` same — returns receipt, already waited internally.\n- r12 settlement is automatic via `notifyTradeSettled`. There is NO zero-arg `BaseOption.payout()` write call — SDK ≥ 0.2.4 throws `INVALID_PARAMS` on the legacy method. Read `client.option.getOptionInfo(addr).settled` for status; use `client.option.calculatePayout(addr, settlementPrice)` (view) for amounts.\n- `client.option.reclaimCollateral(optionAddress, ownedOption)` and `client.loan.reclaimCollateral(...)` are now payable — the SDK reads `getReclaimFee(ownedOption)` and forwards as `msg.value`. Don't call the raw contract or you'll forget the fee.\n- `client.loan.splitOption(optionAddress, amount)` is payable — SDK reads `getSplitFee()` and forwards as `msg.value`.\n- `client.collar` exists but the `CollarLoanCoordinator` is a zero address on Base — write methods throw `NETWORK_UNSUPPORTED` until collar-v12 deploys. Pricing/estimation (`estimateCollar`, `getCapStrikeOptions`) works today.\n- `client.optionFactory` lost referral/admin surface in 0.2.4: `getOfferSignature`, `getPendingFees`, `getReferralOwner`, `withdrawFees`, `renounceOwnership`, `transferOwnership` no longer exist.\n- `client.vault.trigger()` removed in 0.2.4.\n- `RFQBuilderParams.requesterPublicKey?: string` was added — `requestLoan()` auto-resolves it via `client.rfqKeys.getOrCreateKeyPair()`. Only set explicitly for viem/wagmi integrations using `encodeRequestLoan`.\n- `validateAddress(addr, field)` now RETURNS the EIP-55 checksummed form (previously returned void). Legacy ignore-return callsites still work.\n- `client.erc20.getBalance(token, address)` returns `Promise<bigint>`.\n- `client.erc20.getAllowance(token, owner, spender)` returns `Promise<bigint>`.\n- Strikes use 8 decimals internally. USDC uses 6, WETH uses 18.\n- `OrderWithSignature` has NO root-level `collateralToken` field. Use `order.rawApiData?.collateral` or `order.order?.collateralToken` (both are address strings).\n- `Order.strikePrice` is deprecated. Use `order.order.strikes?.[0]` going forward.\n- `RFQBuilderParams.requester` is typed `\\`0x${string}\\``. Cast string addresses with `as \\`0x${string}\\``.\n- `RFQBuilderParams.strikes` is `number | number[]`. The deprecated `strike` field still works but emits a warning — prefer passing `strikes: single` or `strikes: [...]`.\n- `optionFactory.encodeRequestForQuotation()` returns `{ to, data }` only — no `value` field. RFQ transactions are value-zero.\n\n## De"},{"path":"skill-card.md","content":"## Description:\n\nTrade crypto options on Thetanuts Finance with orderbook fills, RFQ lifecycle support, multi-strike structures, real-time market data, wallet management, early settlement, and referrer fees.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[goheesheng](https://clawhub.ai/user/goheesheng)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to explore Thetanuts Finance crypto options markets, manage a local wallet, inspect balances and positions, build RFQs, prepare approvals, and execute supported orderbook or RFQ trading workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill handles wallet seeds and can prepare or run transaction-signing flows.\n\nMitigation: Use only a dedicated low-value wallet, treat the local .env seed as highly sensitive, and review transaction details before signing or broadcasting.\n\nRisk: The updater can change code that signs transactions.\n\nMitigation: Run updates only after explicit user consent and verify the update source and changes before applying them.\n\nRisk: Token approvals may allow contracts to spend more funds than the immediate trade requires.\n\nMitigation: Prefer exact approval amounts, verify spender addresses, and review approvals carefully before confirming.\n\n## Reference(s):\n\n- [ClawHub Skill Page](https://clawhub.ai/goheesheng/skills/thetanuts)\n- [Thetanuts Finance](https://thetanuts.finance)\n- [Thetanuts SDK](https://github.com/Thetanuts-Finance/thetanuts-sdk)\n- [Thetanuts OpenClaw Repository](https://github.com/Thetanuts-Finance/thetanuts-openclaw)\n- [Tether WDK](https://docs.wdk.tether.io)\n- [OpenClaw Docs](https://docs.openclaw.ai/)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and structured command output summaries]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May guide wallet, approval, RFQ, and trade execution flows; transaction-related actions require user review and explicit confirmation.]\n\n## Skill Version(s):\n\n1.5.4 (source: server release metadata and manifest.json)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Trade crypto options on Thetanuts Finance - orderbook fills, RFQ lifecycle, multi-strike structures, real-time WebSocket, wallet management, early settlement... Skill: Thetanuts Openclaw Owner: goheesheng Summary: Trade crypto options on Thetanuts Finance - orderbook fills, RFQ lifecycle, multi-strike structures, real-time WebSocket, wallet management, early settlement... Tags: latest:1.5.4 Version history: v1.5.4 | 2026-05-25T07:46:17.705Z | user Fix manifest updateUrl: now points at Thetanuts-Finance/thetanuts-openclaw (canonical) and the correct filename scripts/update.sh","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1844,"uniquenessScore":47,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T23:42:08.153Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T23:42:08.153Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T19:27:25.672Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}