@wzrd_sol/goat-plugin 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/wzrd.plugin.ts","../src/wzrd.service.ts","../src/tools/leaderboard.ts","../src/parameters.ts","../src/tools/velocity.ts","../src/tools/portfolio.ts","../src/tools/deposit.ts","../src/tools/claim.ts"],"sourcesContent":["/**\n * @wzrd_sol/goat-plugin\n *\n * WZRD Liquid Attention Protocol plugin for GOAT SDK.\n *\n * Quick start:\n * import { wzrd } from \"@wzrd_sol/goat-plugin\";\n *\n * const tools = getOnChainTools({\n * wallet: solana({ connection, keypair }),\n * plugins: [wzrd()],\n * });\n *\n * 5 tools:\n * wzrd_get_leaderboard — browse attention markets (public)\n * wzrd_get_velocity_signal — classify signal strength (public)\n * wzrd_get_portfolio — view positions + CCM earned (auth)\n * wzrd_deposit — deposit USDC → mint vLOFI (wallet)\n * wzrd_claim — claim CCM via gasless relay (auth)\n */\n\nexport { WzrdPlugin, wzrd } from \"./wzrd.plugin\";\nexport { WzrdApiClient } from \"./wzrd.service\";\nexport type { WzrdApiClientOptions } from \"./wzrd.service\";\nexport * from \"./parameters\";\n","/**\n * WzrdPlugin — GOAT SDK plugin for the WZRD Liquid Attention Protocol.\n *\n * Exposes 5 tools:\n * wzrd_get_leaderboard — browse attention markets (public)\n * wzrd_get_velocity_signal — classify signal strength (public)\n * wzrd_get_portfolio — view positions + CCM earned (wallet required)\n * wzrd_deposit — deposit USDC into market (wallet required)\n * wzrd_claim — claim CCM via gasless relay (wallet required)\n *\n * Usage:\n * import { wzrd } from \"@wzrd_sol/goat-plugin\";\n * import { getOnChainTools } from \"@goat-sdk/adapter-vercel-ai\";\n *\n * const tools = getOnChainTools({\n * wallet: solana({ connection, keypair }),\n * plugins: [wzrd()],\n * });\n *\n * The plugin is Solana-only. It rejects non-Solana chains at registration time.\n */\n\nimport { type Chain, PluginBase } from \"@goat-sdk/core\";\nimport { WzrdApiClient, type WzrdApiClientOptions } from \"./wzrd.service\";\nimport { LeaderboardTools } from \"./tools/leaderboard\";\nimport { VelocityTools } from \"./tools/velocity\";\nimport { PortfolioTools } from \"./tools/portfolio\";\nimport { DepositTools } from \"./tools/deposit\";\nimport { ClaimTools } from \"./tools/claim\";\n\nexport class WzrdPlugin extends PluginBase {\n constructor(options?: WzrdApiClientOptions) {\n const api = new WzrdApiClient(options);\n super(\"wzrd\", [\n new LeaderboardTools(api),\n new VelocityTools(api),\n new PortfolioTools(api),\n new DepositTools(api),\n new ClaimTools(api),\n ]);\n }\n\n supportsChain = (chain: Chain) => chain.type === \"solana\";\n}\n\n/**\n * Factory function — standard GOAT plugin pattern.\n *\n * @param options.apiUrl - Override WZRD API URL (default: https://api.twzrd.xyz)\n */\nexport const wzrd = (options?: WzrdApiClientOptions) =>\n new WzrdPlugin(options);\n","/**\n * WzrdApiClient — shared API client used by all WZRD GOAT tools.\n *\n * Handles:\n * - Ed25519 challenge/verify authentication with the WZRD API\n * - Token caching with expiry-aware refresh\n * - Base URL resolution (env var or constructor param)\n *\n * The GOAT wallet client provides the signing capability. We use tweetnacl\n * for Ed25519 signatures since the GOAT SolanaWalletClient exposes signMessage().\n */\n\nimport type { SolanaWalletClient } from \"@goat-sdk/wallet-solana\";\n\nconst DEFAULT_API_URL = \"https://api.twzrd.xyz\";\nconst TOKEN_REFRESH_MARGIN_MS = 5 * 60 * 1000;\n\nexport interface WzrdApiClientOptions {\n apiUrl?: string;\n}\n\nexport class WzrdApiClient {\n readonly apiUrl: string;\n\n // Cache auth tokens per wallet address to avoid re-auth on every tool call\n private tokenCache = new Map<\n string,\n { token: string; expiresAt: number }\n >();\n\n constructor(options?: WzrdApiClientOptions) {\n this.apiUrl =\n options?.apiUrl?.trim() ||\n process.env.WZRD_API_URL?.trim() ||\n DEFAULT_API_URL;\n }\n\n /**\n * Authenticate with the WZRD API using the GOAT wallet client.\n *\n * Flow:\n * 1. GET /v1/agent/challenge — receive nonce\n * 2. Sign canonical message with wallet's signMessage()\n * 3. POST /v1/agent/verify — receive bearer token (24h TTL)\n *\n * Returns a cached bearer token if still valid.\n */\n async authenticate(walletClient: SolanaWalletClient): Promise<string> {\n const address = walletClient.getAddress();\n\n // Check cache\n const cached = this.tokenCache.get(address);\n if (cached && Date.now() < cached.expiresAt - TOKEN_REFRESH_MARGIN_MS) {\n return cached.token;\n }\n\n // Step 1: Challenge\n const challengeRes = await fetch(\n `${this.apiUrl}/v1/agent/challenge`\n );\n if (!challengeRes.ok) {\n throw new Error(`WZRD auth challenge failed: ${challengeRes.status}`);\n }\n const { nonce } = (await challengeRes.json()) as { nonce: string };\n\n // Step 2: Sign the canonical auth message\n const message = `wzrd-agent-auth v1 | wallet:${address} | nonce:${nonce}`;\n const { signature: sigHex } = await walletClient.signMessage(message);\n\n // Convert hex signature to base58 for the verify endpoint\n const sigBytes = hexToBytes(sigHex);\n const sigBase58 = toBase58(sigBytes);\n\n // Step 3: Verify\n const verifyRes = await fetch(`${this.apiUrl}/v1/agent/verify`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n pubkey: address,\n nonce,\n signature: sigBase58,\n }),\n });\n if (!verifyRes.ok) {\n throw new Error(\n `WZRD auth verify failed: ${verifyRes.status} ${await verifyRes.text()}`\n );\n }\n\n const { token, expires_at } = (await verifyRes.json()) as {\n token: string;\n expires_at: string;\n };\n\n // Cache\n this.tokenCache.set(address, {\n token,\n expiresAt: new Date(expires_at).getTime(),\n });\n\n return token;\n }\n}\n\n// ── Base58 encoder (zero-dependency) ─────────────────────\n\nconst B58 = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n\nfunction toBase58(bytes: Uint8Array): string {\n const digits = [0];\n for (const byte of bytes) {\n let carry = byte;\n for (let j = 0; j < digits.length; j++) {\n carry += digits[j] << 8;\n digits[j] = carry % 58;\n carry = (carry / 58) | 0;\n }\n while (carry > 0) {\n digits.push(carry % 58);\n carry = (carry / 58) | 0;\n }\n }\n let out = \"\";\n for (const b of bytes) {\n if (b !== 0) break;\n out += \"1\";\n }\n for (let i = digits.length - 1; i >= 0; i--) out += B58[digits[i]];\n return out;\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n // Handle 0x prefix\n const clean = hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n const bytes = new Uint8Array(clean.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(clean.substring(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n","/**\n * wzrd_get_leaderboard — public tool, no wallet required.\n *\n * Fetches the WZRD attention market leaderboard ranked by velocity EMA.\n * Returns market IDs, velocity, multiplier, TVL, platform, and root anchor.\n */\n\nimport { Tool } from \"@goat-sdk/core\";\nimport { GetLeaderboardParameters } from \"../parameters\";\nimport type { WzrdApiClient } from \"../wzrd.service\";\n\nexport class LeaderboardTools {\n constructor(private readonly api: WzrdApiClient) {}\n\n @Tool({\n description:\n \"Fetch the WZRD attention market leaderboard. Shows AI models and open-source \" +\n \"projects ranked by real-time velocity (download/star momentum). Returns market IDs, \" +\n \"velocity EMA, multiplier, TVL, and platform. \" +\n \"Use this to find the highest-attention markets before depositing.\",\n })\n async wzrd_get_leaderboard(parameters: GetLeaderboardParameters) {\n const limit = parameters.limit ?? 20;\n const params = new URLSearchParams({ limit: String(limit) });\n if (parameters.platform) params.set(\"platform\", parameters.platform);\n\n const res = await fetch(\n `${this.api.apiUrl}/v1/leaderboard?${params}`\n );\n if (!res.ok) {\n throw new Error(`Leaderboard request failed: ${res.status}`);\n }\n\n const data = await res.json();\n const markets = data.markets ?? [];\n\n const summary = markets\n .map(\n (m: any, i: number) =>\n `${i + 1}. ${m.metric} — ${formatVelocity(m.velocity_ema)} velocity ` +\n `(${m.platform}) | ${m.multiplier_bps / 10000}x multiplier | ` +\n `${m.position_count} positions | market_id=${m.market_id}`\n )\n .join(\"\\n\");\n\n return {\n summary: `WZRD Leaderboard (${markets.length} markets, root_seq=${data.root?.root_seq ?? \"N/A\"}):\\n${summary}`,\n markets,\n root: data.root,\n total_positions: data.total_positions,\n total_tvl_usdc: data.total_tvl_usdc,\n };\n }\n}\n\nfunction formatVelocity(v: number): string {\n if (v >= 1_000_000) return `${(v / 1_000_000).toFixed(1)}M`;\n if (v >= 1_000) return `${(v / 1_000).toFixed(0)}K`;\n return v.toFixed(0);\n}\n","/**\n * Zod parameter schemas for all WZRD GOAT tools.\n *\n * Each class extends createToolParameters() — the GOAT decorator system\n * reads the schema from the prototype at registration time via reflect-metadata.\n */\n\nimport { createToolParameters } from \"@goat-sdk/core\";\nimport { z } from \"zod\";\n\n// ── Public tools (no wallet required) ─────────────────────\n\nexport class GetLeaderboardParameters extends createToolParameters(\n z.object({\n limit: z\n .number()\n .int()\n .min(1)\n .max(50)\n .optional()\n .describe(\"Number of markets to return (default 20, max 50)\"),\n platform: z\n .string()\n .optional()\n .describe(\n \"Filter by platform: 'huggingface', 'github', or omit for all\"\n ),\n })\n) {}\n\nexport class GetVelocitySignalParameters extends createToolParameters(\n z.object({\n platform: z\n .string()\n .optional()\n .describe(\"Filter by platform: 'huggingface', 'github'\"),\n min_signal: z\n .enum([\"BREAKOUT\", \"MOMENTUM\", \"EMERGING\", \"STABLE\", \"COOLING\", \"WEAK\"])\n .optional()\n .describe(\n \"Minimum signal tier to include. BREAKOUT is strongest, WEAK is lowest. \" +\n \"Only markets at or above this tier are returned.\"\n ),\n })\n) {}\n\n// ── Authenticated tools (require wallet) ──────────────────\n\nexport class GetPortfolioParameters extends createToolParameters(\n z.object({})\n) {}\n\nexport class DepositParameters extends createToolParameters(\n z.object({\n market_id: z\n .number()\n .int()\n .min(1)\n .describe(\n \"Market ID to deposit into (get from wzrd_get_leaderboard)\"\n ),\n amount_usdc: z\n .number()\n .positive()\n .max(100)\n .describe(\"Amount of USDC to deposit (e.g. 0.01). Max 100 per deposit.\"),\n priority_fee: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n \"Priority fee in micro-lamports (default 50000). Higher = faster inclusion.\"\n ),\n })\n) {}\n\nexport class ClaimParameters extends createToolParameters(\n z.object({\n execute: z\n .boolean()\n .optional()\n .describe(\n \"If false, only check claimable amount without executing. Default true.\"\n ),\n })\n) {}\n","/**\n * wzrd_get_velocity_signal — public tool, no wallet required.\n *\n * Analyzes attention velocity across markets and classifies each into signal tiers:\n * BREAKOUT (p90+), MOMENTUM (p70-90), EMERGING (new + above median),\n * STABLE (p40-70), COOLING (p20-40), WEAK (<p20).\n */\n\nimport { Tool } from \"@goat-sdk/core\";\nimport { GetVelocitySignalParameters } from \"../parameters\";\nimport type { WzrdApiClient } from \"../wzrd.service\";\n\ntype SignalTier =\n | \"BREAKOUT\"\n | \"MOMENTUM\"\n | \"EMERGING\"\n | \"STABLE\"\n | \"COOLING\"\n | \"WEAK\";\n\ninterface MarketSignal {\n market_id: number;\n metric: string;\n platform: string;\n velocity_ema: number;\n signal: SignalTier;\n percentile: number;\n}\n\nexport class VelocityTools {\n constructor(private readonly api: WzrdApiClient) {}\n\n @Tool({\n description:\n \"Analyze attention velocity across WZRD markets. Classifies each market into \" +\n \"signal tiers: BREAKOUT (top 10%), MOMENTUM (70-90th percentile), EMERGING \" +\n \"(new + above median), STABLE, COOLING, WEAK. \" +\n \"Use this to find the best deposit opportunities — BREAKOUT and MOMENTUM \" +\n \"markets have the strongest attention momentum.\",\n })\n async wzrd_get_velocity_signal(parameters: GetVelocitySignalParameters) {\n const params = new URLSearchParams({ limit: \"50\" });\n if (parameters.platform) params.set(\"platform\", parameters.platform);\n\n const res = await fetch(\n `${this.api.apiUrl}/v1/leaderboard?${params}`\n );\n if (!res.ok) {\n throw new Error(`Leaderboard request failed: ${res.status}`);\n }\n\n const data = await res.json();\n const markets: any[] = data.markets ?? [];\n\n if (markets.length === 0) {\n return { summary: \"No markets found.\", signals: [] };\n }\n\n // Sort ascending by velocity for percentile calculation\n const sorted = [...markets].sort(\n (a, b) => a.velocity_ema - b.velocity_ema\n );\n\n const signals: MarketSignal[] = markets.map((m) => {\n const rank = sorted.findIndex((s) => s.market_id === m.market_id);\n const percentile = ((rank + 1) / sorted.length) * 100;\n return {\n market_id: m.market_id,\n metric: m.metric,\n platform: m.platform,\n velocity_ema: m.velocity_ema,\n signal: classify(m, percentile),\n percentile: Math.round(percentile),\n };\n });\n\n // Filter by min_signal if specified\n const tierOrder: SignalTier[] = [\n \"BREAKOUT\",\n \"MOMENTUM\",\n \"EMERGING\",\n \"STABLE\",\n \"COOLING\",\n \"WEAK\",\n ];\n const minIdx = parameters.min_signal\n ? tierOrder.indexOf(parameters.min_signal)\n : tierOrder.length;\n const filtered =\n minIdx < tierOrder.length\n ? signals.filter((s) => tierOrder.indexOf(s.signal) <= minIdx)\n : signals;\n\n // Group by tier for readable output\n const grouped = new Map<SignalTier, MarketSignal[]>();\n for (const s of filtered) {\n const arr = grouped.get(s.signal) ?? [];\n arr.push(s);\n grouped.set(s.signal, arr);\n }\n\n const lines: string[] = [];\n for (const tier of tierOrder) {\n const group = grouped.get(tier);\n if (!group?.length) continue;\n lines.push(`${tier}:`);\n for (const s of group) {\n lines.push(\n ` ${s.metric} (${formatVelocity(s.velocity_ema)} velocity, p${s.percentile}) [${s.platform}]`\n );\n }\n }\n\n const medianIdx = Math.floor(sorted.length / 2);\n const medianVelocity = sorted[medianIdx]?.velocity_ema ?? 0;\n\n return {\n summary: `Velocity analysis (${markets.length} markets, median ${formatVelocity(medianVelocity)}):\\n${lines.join(\"\\n\")}`,\n signals: filtered,\n median_velocity: medianVelocity,\n };\n }\n}\n\nfunction classify(m: any, percentile: number): SignalTier {\n if (percentile >= 90) return \"BREAKOUT\";\n if (percentile >= 70) return \"MOMENTUM\";\n if (m.snapshot_count < 300 && percentile >= 50) return \"EMERGING\";\n if (percentile >= 40) return \"STABLE\";\n if (percentile >= 20) return \"COOLING\";\n return \"WEAK\";\n}\n\nfunction formatVelocity(v: number): string {\n if (v >= 1_000_000) return `${(v / 1_000_000).toFixed(1)}M`;\n if (v >= 1_000) return `${(v / 1_000).toFixed(0)}K`;\n return v.toFixed(0);\n}\n","/**\n * wzrd_get_portfolio — requires SolanaWalletClient (for identity).\n *\n * Fetches the authenticated agent's portfolio: positions, vLOFI balances,\n * CCM earned, and per-market multiplier.\n */\n\nimport { Tool } from \"@goat-sdk/core\";\nimport { SolanaWalletClient } from \"@goat-sdk/wallet-solana\";\nimport { GetPortfolioParameters } from \"../parameters\";\nimport type { WzrdApiClient } from \"../wzrd.service\";\n\nexport class PortfolioTools {\n constructor(private readonly api: WzrdApiClient) {}\n\n @Tool({\n description:\n \"View your WZRD portfolio — all positions, vLOFI balances, and CCM earned. \" +\n \"Shows each market you're deposited in, your multiplier, settlement status, \" +\n \"and aggregate totals. Use this to decide when to claim or deposit more.\",\n })\n async wzrd_get_portfolio(\n walletClient: SolanaWalletClient,\n parameters: GetPortfolioParameters\n ) {\n const token = await this.api.authenticate(walletClient);\n\n const res = await fetch(`${this.api.apiUrl}/v1/portfolio`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!res.ok) {\n throw new Error(`Portfolio request failed: ${res.status}`);\n }\n\n const portfolio = await res.json();\n const positions = portfolio.positions ?? [];\n\n const lines = positions.map(\n (p: any) =>\n `Market #${p.market_id} (${p.metric}): ${formatUsdc(p.usdc_deposited)} USDC, ` +\n `${formatUsdc(p.vlofi_minted)} vLOFI, ${p.multiplier_bps / 10000}x multiplier` +\n (p.is_settled ? \" [SETTLED]\" : \"\")\n );\n\n return {\n summary:\n `Portfolio (${positions.length} positions):\\n${lines.join(\"\\n\")}\\n` +\n `Total: ${formatUsdc(portfolio.total_deposited_usdc)} USDC deposited, ` +\n `${formatUsdc(portfolio.total_vlofi)} vLOFI, ` +\n `${formatCcm(portfolio.total_ccm_earned)} CCM earned`,\n positions,\n total_deposited_usdc: portfolio.total_deposited_usdc,\n total_vlofi: portfolio.total_vlofi,\n total_ccm_earned: portfolio.total_ccm_earned,\n };\n }\n}\n\nfunction formatUsdc(nativeAmount: number | bigint): string {\n return (Number(nativeAmount) / 1_000_000).toFixed(4);\n}\n\nfunction formatCcm(nativeAmount: number | bigint): string {\n return (Number(nativeAmount) / 1_000_000).toFixed(4);\n}\n","/**\n * wzrd_deposit — requires SolanaWalletClient.\n *\n * Deposits USDC into a WZRD attention market to mint vLOFI tokens.\n * Uses @wzrd_sol/sdk for instruction building. The GOAT wallet client\n * handles signing and sending.\n */\n\nimport { Tool } from \"@goat-sdk/core\";\nimport { SolanaWalletClient } from \"@goat-sdk/wallet-solana\";\nimport {\n ComputeBudgetProgram,\n PublicKey,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { DepositParameters } from \"../parameters\";\nimport type { WzrdApiClient } from \"../wzrd.service\";\n\nconst CONFIRM_TIMEOUT_MS = 60_000;\n\ntype WzrdSdk = typeof import(\"@wzrd_sol/sdk\");\n\nexport class DepositTools {\n constructor(private readonly api: WzrdApiClient) {}\n\n @Tool({\n description:\n \"Deposit USDC into a WZRD attention market to mint vLOFI tokens. \" +\n \"vLOFI represents your position in the market. As the underlying AI model \" +\n \"gains attention (downloads, stars), your multiplier increases and you earn \" +\n \"more CCM on each merkle root publication. \" +\n \"Requires: market_id (from wzrd_get_leaderboard) and amount_usdc. \" +\n \"The deposit is atomic — USDC is transferred and vLOFI is minted in one transaction.\",\n })\n async wzrd_deposit(\n walletClient: SolanaWalletClient,\n parameters: DepositParameters\n ) {\n const { market_id, amount_usdc, priority_fee = 50_000 } = parameters;\n const connection = walletClient.getConnection();\n const payer = new PublicKey(walletClient.getAddress());\n const amountNative = BigInt(Math.round(amount_usdc * 1_000_000));\n const t0 = Date.now();\n\n const sdk = await loadSdk();\n const {\n createDepositMarketIx,\n fetchMarketVault,\n fetchOnChainPosition,\n fetchTokenBalance,\n getAta,\n TOKEN_PROGRAM_ID,\n } = sdk;\n\n // ── Pre-flight checks ──────────────────────────────\n\n const vault = await fetchMarketVault(connection, market_id);\n if (!vault) {\n return {\n success: false,\n error:\n `Market ${market_id} is listed but does not have an on-chain vault yet. ` +\n \"Pick a market with an initialized vault before depositing.\",\n market_id,\n reason: \"missing_vault\",\n };\n }\n\n const existing = await fetchOnChainPosition(connection, payer, market_id);\n if (existing && existing.depositedAmount > 0n && !existing.settled) {\n return {\n success: false,\n error: `Position already exists in market ${market_id}. Cannot double-deposit.`,\n market_id,\n deposited_amount: existing.depositedAmount.toString(),\n };\n }\n\n const usdcAta = getAta(payer, vault.depositMint, TOKEN_PROGRAM_ID);\n const usdcBalance = await fetchTokenBalance(connection, usdcAta);\n if (usdcBalance < amountNative) {\n return {\n success: false,\n error: `Insufficient USDC: have ${formatUsdc(usdcBalance)}, need ${amount_usdc.toFixed(4)}`,\n market_id,\n required_native: amountNative.toString(),\n balance_native: usdcBalance.toString(),\n };\n }\n\n const solBalance = await connection.getBalance(payer);\n if (solBalance < 10_000) {\n return {\n success: false,\n error: `Insufficient SOL for tx fees: ${solBalance} lamports`,\n market_id,\n sol_balance_lamports: solBalance,\n };\n }\n\n // ── Build + send transaction ───────────────────────\n\n let ixs;\n try {\n ixs = await createDepositMarketIx(\n connection,\n payer,\n market_id,\n amountNative\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"MarketVault not found\")) {\n return {\n success: false,\n error: `Market ${market_id} vault not found on-chain.`,\n market_id,\n reason: \"missing_vault\",\n };\n }\n throw error;\n }\n\n ixs.unshift(\n ComputeBudgetProgram.setComputeUnitLimit({ units: 300_000 }),\n ComputeBudgetProgram.setComputeUnitPrice({ microLamports: priority_fee })\n );\n\n // Use GOAT's wallet client sendTransaction which handles signing\n const { hash } = await walletClient.sendTransaction({\n instructions: ixs,\n });\n\n const elapsed = Date.now() - t0;\n return {\n success: true,\n summary: `Deposited ${amount_usdc.toFixed(4)} USDC into Market #${market_id}. Tx: ${hash.slice(0, 16)}... (${elapsed}ms)`,\n signature: hash,\n market_id,\n amount_usdc,\n elapsed_ms: elapsed,\n explorer: `https://solscan.io/tx/${hash}`,\n };\n }\n}\n\nasync function loadSdk(): Promise<WzrdSdk> {\n try {\n return await import(\"@wzrd_sol/sdk\");\n } catch (error) {\n // Monorepo fallback: resolve relative to this file\n const fallbackUrl = new URL(\"../../../../../sdk/dist/index.js\", import.meta.url);\n try {\n return (await import(fallbackUrl.href)) as WzrdSdk;\n } catch {\n throw error;\n }\n }\n}\n\nfunction formatUsdc(nativeAmount: number | bigint): string {\n return (Number(nativeAmount) / 1_000_000).toFixed(4);\n}\n","/**\n * wzrd_claim — requires SolanaWalletClient (for identity, not signing).\n *\n * Claims accrued CCM tokens via the gasless relay. The WZRD server pays\n * transaction fees — the agent only needs to authenticate via Ed25519.\n *\n * Flow: authenticate → check claimable → relay claim → receive CCM.\n */\n\nimport { Tool } from \"@goat-sdk/core\";\nimport { SolanaWalletClient } from \"@goat-sdk/wallet-solana\";\nimport { ClaimParameters } from \"../parameters\";\nimport type { WzrdApiClient } from \"../wzrd.service\";\n\nexport class ClaimTools {\n constructor(private readonly api: WzrdApiClient) {}\n\n @Tool({\n description:\n \"Claim accrued CCM tokens from your WZRD positions. Uses the gasless relay — \" +\n \"the server pays transaction fees, so you don't need SOL to claim. \" +\n \"CCM accrues based on your velocity multiplier and is distributed via \" +\n \"merkle proofs published on-chain every ~10 minutes. \" +\n \"Set execute=false to check claimable amount without claiming.\",\n })\n async wzrd_claim(\n walletClient: SolanaWalletClient,\n parameters: ClaimParameters\n ) {\n const pubkey = walletClient.getAddress();\n\n // Authenticate with WZRD API using Ed25519 challenge/verify\n const token = await this.api.authenticate(walletClient);\n\n // Check claimable amount\n const claimsRes = await fetch(\n `${this.api.apiUrl}/v1/claims/${pubkey}`,\n { headers: { Authorization: `Bearer ${token}` } }\n );\n if (!claimsRes.ok) {\n throw new Error(`Claims check failed: ${claimsRes.status}`);\n }\n const claims = await claimsRes.json();\n const claimable = claims.cumulative_total - claims.claimed_total;\n\n if (claimable <= 0) {\n return {\n success: true,\n summary: `No CCM to claim. Cumulative: ${formatCcm(claims.cumulative_total)}, already claimed: ${formatCcm(claims.claimed_total)}.`,\n claimable: 0,\n cumulative_total: claims.cumulative_total,\n claimed_total: claims.claimed_total,\n };\n }\n\n if (parameters.execute === false) {\n return {\n success: true,\n summary: `${formatCcm(claimable)} CCM claimable (${formatCcm(claims.cumulative_total)} cumulative, ${formatCcm(claims.claimed_total)} claimed). Root seq: ${claims.root_seq}. Set execute=true to claim.`,\n claimable,\n cumulative_total: claims.cumulative_total,\n claimed_total: claims.claimed_total,\n root_seq: claims.root_seq,\n };\n }\n\n // Execute gasless relay claim\n const relayRes = await fetch(\n `${this.api.apiUrl}/v1/claims/${pubkey}/relay`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n if (!relayRes.ok) {\n throw new Error(\n `Relay claim failed: ${relayRes.status} ${await relayRes.text()}`\n );\n }\n const result = await relayRes.json();\n\n if (result.status === \"already_claimed\") {\n return {\n success: true,\n summary: `Already claimed through root ${result.root_seq}. Claimed total: ${formatCcm(result.claimed_total ?? claims.claimed_total)} CCM.`,\n already_claimed: true,\n root_seq: result.root_seq,\n };\n }\n\n return {\n success: true,\n summary: `Claimed CCM via gasless relay. Cumulative: ${formatCcm(result.cumulative_total)}. Root seq: ${result.root_seq}. Tx: ${result.tx_sig?.slice(0, 16)}...`,\n cumulative_total: result.cumulative_total,\n root_seq: result.root_seq,\n tx_sig: result.tx_sig,\n claimable_before: claimable,\n explorer: result.tx_sig\n ? `https://solscan.io/tx/${result.tx_sig}`\n : null,\n };\n }\n}\n\nfunction formatCcm(nativeAmount: number | bigint): string {\n return (Number(nativeAmount) / 1_000_000).toFixed(4);\n}\n"],"mappings":"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","names":["import_core","DEFAULT_API_URL","TOKEN_REFRESH_MARGIN_MS","WzrdApiClient","apiUrl","tokenCache","Map","options","trim","process","env","WZRD_API_URL","authenticate","walletClient","address","getAddress","cached","get","Date","now","expiresAt","token","challengeRes","fetch","ok","Error","status","nonce","json","message","signature","sigHex","signMessage","sigBytes","hexToBytes","sigBase58","toBase58","verifyRes","method","headers","body","JSON","stringify","pubkey","text","expires_at","set","getTime","B58","bytes","digits","byte","carry","j","length","push","out","b","i","hex","clean","startsWith","slice","Uint8Array","parseInt","substring","import_core","GetLeaderboardParameters","createToolParameters","z","object","limit","number","int","min","max","optional","describe","platform","string","GetVelocitySignalParameters","min_signal","enum","GetPortfolioParameters","DepositParameters","market_id","amount_usdc","positive","priority_fee","ClaimParameters","execute","boolean","LeaderboardTools","api","wzrd_get_leaderboard","parameters","limit","params","URLSearchParams","String","platform","set","res","fetch","apiUrl","ok","Error","status","data","json","markets","summary","map","m","i","metric","formatVelocity","velocity_ema","multiplier_bps","position_count","market_id","join","length","root","root_seq","total_positions","total_tvl_usdc","description","v","toFixed","import_core","VelocityTools","api","wzrd_get_velocity_signal","parameters","params","URLSearchParams","limit","platform","set","res","fetch","apiUrl","ok","Error","status","data","json","markets","length","summary","signals","sorted","sort","a","b","velocity_ema","map","m","rank","findIndex","s","market_id","percentile","metric","signal","classify","Math","round","tierOrder","minIdx","min_signal","indexOf","filtered","filter","grouped","Map","arr","get","push","lines","tier","group","formatVelocity","medianIdx","floor","medianVelocity","join","median_velocity","description","snapshot_count","v","toFixed","import_core","PortfolioTools","api","wzrd_get_portfolio","walletClient","parameters","token","authenticate","res","fetch","apiUrl","headers","Authorization","ok","Error","status","portfolio","json","positions","lines","map","p","market_id","metric","formatUsdc","usdc_deposited","vlofi_minted","multiplier_bps","is_settled","summary","length","join","total_deposited_usdc","total_vlofi","formatCcm","total_ccm_earned","description","nativeAmount","Number","toFixed","import_core","import_wallet_solana","DepositTools","api","wzrd_deposit","walletClient","parameters","market_id","amount_usdc","priority_fee","connection","getConnection","payer","PublicKey","getAddress","amountNative","BigInt","Math","round","t0","Date","now","sdk","loadSdk","createDepositMarketIx","fetchMarketVault","fetchOnChainPosition","fetchTokenBalance","getAta","TOKEN_PROGRAM_ID","vault","success","error","reason","existing","depositedAmount","settled","deposited_amount","toString","usdcAta","depositMint","usdcBalance","formatUsdc","toFixed","required_native","balance_native","solBalance","getBalance","sol_balance_lamports","ixs","message","Error","String","includes","unshift","ComputeBudgetProgram","setComputeUnitLimit","units","setComputeUnitPrice","microLamports","hash","sendTransaction","instructions","elapsed","summary","slice","signature","elapsed_ms","explorer","description","fallbackUrl","URL","url","href","nativeAmount","Number","import_core","import_wallet_solana","ClaimTools","api","wzrd_claim","walletClient","parameters","pubkey","getAddress","token","authenticate","claimsRes","fetch","apiUrl","headers","Authorization","ok","Error","status","claims","json","claimable","cumulative_total","claimed_total","success","summary","formatCcm","execute","root_seq","relayRes","method","text","result","already_claimed","tx_sig","slice","claimable_before","explorer","description","nativeAmount","Number","toFixed","WzrdPlugin","PluginBase","options","api","WzrdApiClient","LeaderboardTools","VelocityTools","PortfolioTools","DepositTools","ClaimTools","supportsChain","chain","type","wzrd"]}