@wzrd_sol/goat-plugin 0.1.0 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../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 * 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":["PluginBase","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","Tool","createToolParameters","z","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","Tool","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","Tool","SolanaWalletClient","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","Tool","SolanaWalletClient","ComputeBudgetProgram","PublicKey","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","Tool","SolanaWalletClient","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"]}
1
+ {"version":3,"sources":["../src/wzrd.plugin.ts","../src/client.ts","../src/tools/infer.ts","../src/parameters.ts","../src/tools/report.ts","../src/tools/earn.ts","../src/tools/claim.ts","../src/tools/rewards.ts"],"sourcesContent":["/**\n * WzrdPlugin — GOAT SDK plugin for the WZRD Liquid Attention Protocol.\n *\n * Server-witnessed earn loop — 5 tools:\n * wzrd_earn — full earn cycle: infer + report + check rewards (one-shot)\n * wzrd_infer — server-witnessed inference (returns execution_id)\n * wzrd_report — report model pick with execution receipt (verified rewards)\n * wzrd_claim — claim CCM via gasless relay (0 SOL needed)\n * wzrd_rewards — check pending + lifetime CCM rewards\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 { WzrdClient, type WzrdClientOptions } from \"./client\";\nimport { InferTools } from \"./tools/infer\";\nimport { ReportTools } from \"./tools/report\";\nimport { EarnTools } from \"./tools/earn\";\nimport { ClaimTools } from \"./tools/claim\";\nimport { RewardsTools } from \"./tools/rewards\";\n\nexport class WzrdPlugin extends PluginBase {\n constructor(options?: WzrdClientOptions) {\n const client = new WzrdClient(options);\n super(\"wzrd\", [\n new EarnTools(client),\n new InferTools(client),\n new ReportTools(client),\n new ClaimTools(client),\n new RewardsTools(client),\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?: WzrdClientOptions) =>\n new WzrdPlugin(options);\n","/**\n * WzrdClient — WZRD API client for GOAT SDK plugins.\n *\n * Auth flow: challenge → sign (via GOAT SolanaWalletClient) → verify → Bearer token (24h TTL)\n * Earn flow: infer → report(execution_id) → claim\n *\n * Uses the GOAT wallet's signMessage() for Ed25519 signatures.\n * No external dependencies beyond the GOAT wallet types.\n */\n\nimport type { SolanaWalletClient } from \"@goat-sdk/wallet-solana\";\n\nconst DEFAULT_API = \"https://api.twzrd.xyz\";\nconst TOKEN_REFRESH_MARGIN_MS = 60 * 60 * 1000; // refresh 1h before expiry\n\nexport interface InferResult {\n execution_id: string;\n model: string;\n provider: string;\n quality_score: number;\n response: string;\n latency_ms: number;\n prompt_tokens?: number;\n completion_tokens?: number;\n}\n\nexport interface ReportResult {\n contribution_id: number;\n verification_state: string;\n quality_score: number | null;\n model_id: string;\n}\n\nexport interface RewardsBalance {\n pending_ccm: number;\n total_rewarded_ccm: number;\n rank: number | null;\n contribution_count: number;\n}\n\nexport interface ClaimResult {\n tx_sig: string | null;\n root_seq: number;\n cumulative_total: number;\n status: string;\n}\n\nexport interface LeaderboardResult {\n market_count: number;\n total_tvl: number;\n root: { root_seq: number };\n markets: Array<{\n market_id: number;\n metric: string;\n platform: string;\n velocity_ema: number;\n multiplier_bps: number;\n snapshot_count: number;\n }>;\n}\n\nexport interface WzrdClientOptions {\n apiUrl?: string;\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 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\nexport class WzrdClient {\n readonly apiUrl: string;\n\n // Cache auth tokens per wallet address\n private tokenCache = new Map<\n string,\n { token: string; expiresAt: number }\n >();\n\n constructor(options?: WzrdClientOptions) {\n this.apiUrl =\n options?.apiUrl?.trim() ||\n process.env.WZRD_API_URL?.trim() ||\n DEFAULT_API;\n }\n\n /** Ed25519 challenge → sign → verify → Bearer token */\n private async authenticate(\n walletClient: SolanaWalletClient,\n ): 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 // 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 // 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 // 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 this.tokenCache.set(address, {\n token,\n expiresAt: expires_at\n ? new Date(expires_at).getTime()\n : Date.now() + 23 * 60 * 60 * 1000,\n });\n\n return token;\n }\n\n /** Authenticated fetch helper */\n private async authedFetch(\n walletClient: SolanaWalletClient,\n path: string,\n init?: RequestInit,\n ): Promise<Response> {\n const token = await this.authenticate(walletClient);\n const headers = new Headers(init?.headers);\n headers.set(\"Authorization\", `Bearer ${token}`);\n headers.set(\"Content-Type\", \"application/json\");\n return fetch(`${this.apiUrl}${path}`, { ...init, headers });\n }\n\n /** Pick a model from the momentum signal — returns top model name */\n async pickModel(taskType?: string): Promise<string> {\n const res = await fetch(`${this.apiUrl}/v1/signals/momentum?limit=10&trending=true`);\n if (!res.ok) throw new Error(`Momentum fetch failed: ${res.status}`);\n const data = await res.json() as { models: Array<{ model: string }> };\n if (!data.models?.length) throw new Error(\"No models available in momentum feed\");\n return data.models[0].model;\n }\n\n /** Server-witnessed inference — WZRD calls the provider, grades quality */\n async infer(\n walletClient: SolanaWalletClient,\n prompt: string,\n model?: string,\n taskType?: string,\n ): Promise<InferResult> {\n const resolvedModel = model || (await this.pickModel(taskType));\n const res = await this.authedFetch(walletClient, \"/v1/agent/infer\", {\n method: \"POST\",\n body: JSON.stringify({\n model: resolvedModel,\n prompt,\n task_type: taskType || \"chat\",\n }),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`Infer failed (${res.status}): ${body}`);\n }\n return res.json() as Promise<InferResult>;\n }\n\n /** Report model pick with execution_id for verified rewards */\n async report(\n walletClient: SolanaWalletClient,\n params: {\n model_id: string;\n execution_id: string;\n task_type?: string;\n quality_score?: number;\n latency_ms?: number;\n },\n ): Promise<ReportResult> {\n const res = await this.authedFetch(walletClient, \"/v1/agent/report\", {\n method: \"POST\",\n body: JSON.stringify(params),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`Report failed (${res.status}): ${body}`);\n }\n return res.json() as Promise<ReportResult>;\n }\n\n /** Check pending + total rewards */\n async getRewards(walletClient: SolanaWalletClient): Promise<RewardsBalance> {\n const res = await this.authedFetch(walletClient, \"/v1/agent/earned\");\n if (!res.ok) throw new Error(`Rewards check failed: ${res.status}`);\n const data = (await res.json()) as Record<string, unknown>;\n const economy = data.economy as Record<string, unknown> | undefined;\n const routing = data.routing as Record<string, unknown> | undefined;\n return {\n pending_ccm: Number(economy?.pending_ccm ?? 0),\n total_rewarded_ccm: Number(economy?.earned_ccm ?? 0),\n rank: null,\n contribution_count: Number(routing?.lifetime_contributions ?? 0),\n };\n }\n\n /** Gasless CCM claim via server relay */\n async claimRelay(walletClient: SolanaWalletClient): Promise<ClaimResult> {\n const pubkey = walletClient.getAddress();\n const res = await this.authedFetch(\n walletClient,\n `/v1/claims/${pubkey}/relay`,\n { method: \"POST\" },\n );\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`Claim relay failed (${res.status}): ${body}`);\n }\n return res.json() as Promise<ClaimResult>;\n }\n\n /** Check claims status */\n async getClaimStatus(\n walletClient: SolanaWalletClient,\n ): Promise<{\n cumulative_total: number;\n claimed_total: number;\n claimable: number;\n }> {\n const pubkey = walletClient.getAddress();\n const res = await this.authedFetch(\n walletClient,\n `/v1/claims/${pubkey}`,\n );\n if (!res.ok) {\n if (res.status === 404) {\n return { cumulative_total: 0, claimed_total: 0, claimable: 0 };\n }\n throw new Error(`Claim status failed: ${res.status}`);\n }\n const data = (await res.json()) as {\n cumulative_total: number;\n claimed_total: number;\n };\n return { ...data, claimable: data.cumulative_total - data.claimed_total };\n }\n\n /** Public: fetch leaderboard (no auth) */\n async getLeaderboard(limit = 20): Promise<LeaderboardResult> {\n const res = await fetch(`${this.apiUrl}/v1/leaderboard?limit=${limit}`);\n if (!res.ok) throw new Error(`Leaderboard failed: ${res.status}`);\n return res.json() as Promise<LeaderboardResult>;\n }\n}\n","/**\n * wzrd_infer — Server-witnessed inference through WZRD.\n *\n * WZRD calls the AI provider (Gemini/Nous/OpenRouter), grades the response,\n * and returns an execution_id receipt. Pass this to wzrd_report for verified rewards.\n */\n\nimport { Tool } from \"@goat-sdk/core\";\nimport { SolanaWalletClient } from \"@goat-sdk/wallet-solana\";\nimport { InferParameters } from \"../parameters\";\nimport type { WzrdClient } from \"../client\";\n\nexport class InferTools {\n constructor(private readonly client: WzrdClient) {}\n\n @Tool({\n description:\n \"Run server-witnessed inference through WZRD. The server calls the AI provider, \" +\n \"grades quality, and returns an execution receipt (execution_id). \" +\n \"Use the execution_id with wzrd_report to earn verified CCM rewards. \" +\n \"If no model is specified, picks the top model from the leaderboard.\",\n })\n async wzrd_infer(\n walletClient: SolanaWalletClient,\n parameters: InferParameters,\n ) {\n const { prompt, model, task_type } = parameters;\n const taskType = task_type || \"chat\";\n\n const result = await this.client.infer(\n walletClient,\n prompt,\n model,\n taskType,\n );\n\n return {\n summary:\n `Inference complete. Model: ${result.model} (${result.provider}), ` +\n `quality: ${result.quality_score.toFixed(2)}, ${result.latency_ms}ms. ` +\n `execution_id: ${result.execution_id}`,\n execution_id: result.execution_id,\n model: result.model,\n provider: result.provider,\n quality_score: result.quality_score,\n latency_ms: result.latency_ms,\n response_preview: result.response.slice(0, 300),\n };\n }\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// ── Server-witnessed inference ───────────────────────────\n\nexport class InferParameters extends createToolParameters(\n z.object({\n prompt: z\n .string()\n .describe(\"The prompt to send for inference\"),\n model: z\n .string()\n .optional()\n .describe(\n \"Specific model to use (e.g. 'gemini-2.5-flash'). \" +\n \"If omitted, picks the top model from the leaderboard.\"\n ),\n task_type: z\n .enum([\"code\", \"chat\", \"reasoning\"])\n .optional()\n .describe(\n \"Task type for prompt classification: 'code', 'chat', or 'reasoning'. Default: 'chat'.\"\n ),\n })\n) {}\n\n// ── Report with execution receipt ────────────────────────\n\nexport class ReportParameters extends createToolParameters(\n z.object({\n model_id: z\n .string()\n .describe(\"Model ID from the infer result (e.g. 'gemini-2.5-flash')\"),\n execution_id: z\n .string()\n .describe(\"Execution receipt from WZRD_INFER — required for verified rewards\"),\n task_type: z\n .enum([\"code\", \"chat\", \"reasoning\"])\n .optional()\n .describe(\"Task type matching the inference request\"),\n quality_score: z\n .number()\n .min(0)\n .max(1)\n .optional()\n .describe(\"Quality score from the infer result (0-1)\"),\n latency_ms: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Latency in ms from the infer result\"),\n })\n) {}\n\n// ── Earn loop (one-shot) ─────────────────────────────────\n\nexport class EarnParameters extends createToolParameters(\n z.object({\n task_type: z\n .enum([\"code\", \"chat\", \"reasoning\"])\n .optional()\n .describe(\n \"Task type for the eval prompt: 'code', 'chat', or 'reasoning'. Default: 'code'.\"\n ),\n prompt: z\n .string()\n .optional()\n .describe(\n \"Custom prompt to use for inference. If omitted, a random eval prompt is selected.\"\n ),\n })\n) {}\n\n// ── Claim ────────────────────────────────────────────────\n\nexport class ClaimParameters extends createToolParameters(\n z.object({})\n) {}\n\n// ── Rewards check ────────────────────────────────────────\n\nexport class RewardsParameters extends createToolParameters(\n z.object({})\n) {}\n","/**\n * wzrd_report — Report a model pick with execution receipt for verified CCM rewards.\n *\n * Must be called after wzrd_infer. Pass the execution_id from the infer result\n * to get server-verified status and quality-weighted rewards.\n */\n\nimport { Tool } from \"@goat-sdk/core\";\nimport { SolanaWalletClient } from \"@goat-sdk/wallet-solana\";\nimport { ReportParameters } from \"../parameters\";\nimport type { WzrdClient } from \"../client\";\n\nexport class ReportTools {\n constructor(private readonly client: WzrdClient) {}\n\n @Tool({\n description:\n \"Report a model pick to WZRD with an execution_id from wzrd_infer. \" +\n \"Verified reports earn CCM rewards with a quality multiplier. \" +\n \"Requires: model_id and execution_id (both from wzrd_infer result).\",\n })\n async wzrd_report(\n walletClient: SolanaWalletClient,\n parameters: ReportParameters,\n ) {\n const result = await this.client.report(walletClient, {\n model_id: parameters.model_id,\n execution_id: parameters.execution_id,\n task_type: parameters.task_type,\n quality_score: parameters.quality_score,\n latency_ms: parameters.latency_ms,\n });\n\n return {\n summary:\n `Reported to WZRD. Verification: ${result.verification_state}, ` +\n `contribution #${result.contribution_id}, model: ${result.model_id}` +\n (result.quality_score != null\n ? `, quality: ${result.quality_score.toFixed(2)}`\n : \"\"),\n contribution_id: result.contribution_id,\n verification_state: result.verification_state,\n quality_score: result.quality_score,\n model_id: result.model_id,\n };\n }\n}\n","/**\n * wzrd_earn — Full earn cycle: infer → report → check rewards.\n *\n * Single tool that runs the complete server-witnessed earn loop.\n * For agents that want one-shot earning without managing execution_ids.\n */\n\nimport { Tool } from \"@goat-sdk/core\";\nimport { SolanaWalletClient } from \"@goat-sdk/wallet-solana\";\nimport { EarnParameters } from \"../parameters\";\nimport type { WzrdClient } from \"../client\";\n\nconst EVAL_PROMPTS: Record<string, string[]> = {\n code: [\n \"Write a Python function that checks if a binary tree is balanced. Include time complexity analysis.\",\n \"Implement a thread-safe LRU cache in Rust with O(1) get and put operations.\",\n \"Write a TypeScript generic function that deep-merges two objects, handling arrays and nested objects.\",\n ],\n chat: [\n \"Explain the difference between TCP and UDP to someone who has never programmed before.\",\n \"What are the tradeoffs between microservices and monolithic architecture?\",\n \"Describe how consensus works in proof-of-stake blockchains.\",\n ],\n reasoning: [\n \"A farmer has a fox, a chicken, and a bag of grain. He must cross a river in a boat that can only carry him and one item. How does he do it?\",\n \"If it takes 5 machines 5 minutes to make 5 widgets, how long does it take 100 machines to make 100 widgets?\",\n \"Three people check into a hotel room that costs $30. They each pay $10. The manager realizes the room should cost $25 and gives $5 to the bellboy to return. The bellboy keeps $2 and gives $1 back to each person. So each person paid $9 (total $27) plus the bellboy kept $2 (total $29). Where is the missing dollar?\",\n ],\n};\n\nfunction pickPrompt(taskType: string): string {\n const prompts = EVAL_PROMPTS[taskType] || EVAL_PROMPTS.chat;\n return prompts[Math.floor(Math.random() * prompts.length)];\n}\n\nexport class EarnTools {\n constructor(private readonly client: WzrdClient) {}\n\n @Tool({\n description:\n \"Run the full WZRD earn cycle: pick a prompt, run server-witnessed inference, \" +\n \"report the outcome, and check pending rewards. One tool call, complete loop. \" +\n \"Earns verified CCM rewards on Solana. Use task_type to control prompt category \" +\n \"(code/chat/reasoning) or provide a custom prompt.\",\n })\n async wzrd_earn(\n walletClient: SolanaWalletClient,\n parameters: EarnParameters,\n ) {\n const taskType = parameters.task_type || \"code\";\n const prompt = parameters.prompt || pickPrompt(taskType);\n const steps: string[] = [];\n\n // Step 1: Pick model + Infer\n steps.push(\"-> Picking model from leaderboard...\");\n const model = await this.client.pickModel(taskType);\n steps.push(`-> Running inference: ${model} (${taskType})...`);\n const infer = await this.client.infer(walletClient, prompt, model, taskType);\n steps.push(\n `OK Inference: ${infer.model} (${infer.provider}), ` +\n `quality ${infer.quality_score.toFixed(2)}, ${infer.latency_ms}ms`,\n );\n\n // Step 2: Report with execution_id\n steps.push(\"-> Reporting outcome...\");\n const report = await this.client.report(walletClient, {\n model_id: infer.model,\n execution_id: infer.execution_id,\n task_type: taskType,\n quality_score: infer.quality_score,\n latency_ms: infer.latency_ms,\n });\n steps.push(\n `OK Reported: ${report.verification_state}, contribution #${report.contribution_id}`,\n );\n\n // Step 3: Check rewards\n steps.push(\"-> Checking rewards...\");\n const rewards = await this.client.getRewards(walletClient);\n steps.push(\n `OK Rewards: ${(rewards.pending_ccm / 1e9).toFixed(2)} CCM pending, ` +\n `${(rewards.total_rewarded_ccm / 1e9).toFixed(2)} CCM lifetime`,\n );\n\n return {\n summary: `Earn cycle complete:\\n${steps.join(\"\\n\")}`,\n infer: {\n execution_id: infer.execution_id,\n model: infer.model,\n provider: infer.provider,\n quality_score: infer.quality_score,\n latency_ms: infer.latency_ms,\n },\n report: {\n contribution_id: report.contribution_id,\n verification_state: report.verification_state,\n },\n rewards: {\n pending_ccm: rewards.pending_ccm,\n total_rewarded_ccm: rewards.total_rewarded_ccm,\n contribution_count: rewards.contribution_count,\n },\n };\n }\n}\n","/**\n * wzrd_claim — Claim accrued CCM via gasless relay.\n *\n * Server pays all transaction fees. Agent needs 0 SOL.\n * Flow: 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 { WzrdClient } from \"../client\";\n\nexport class ClaimTools {\n constructor(private readonly client: WzrdClient) {}\n\n @Tool({\n description:\n \"Claim accrued CCM tokens via gasless relay. The server pays transaction fees — \" +\n \"no SOL needed. CCM accrues from verified inference reports (wzrd_earn/wzrd_report). \" +\n \"Call this periodically to harvest earned CCM to your wallet.\",\n })\n async wzrd_claim(\n walletClient: SolanaWalletClient,\n _parameters: ClaimParameters,\n ) {\n // Check if there's anything to claim\n const status = await this.client.getClaimStatus(walletClient);\n if (status.claimable <= 0) {\n return {\n success: true,\n summary:\n `No CCM to claim right now. ` +\n `Cumulative: ${formatCcm(status.cumulative_total)} CCM, ` +\n `already claimed: ${formatCcm(status.claimed_total)} CCM. ` +\n `Run wzrd_earn first to accrue rewards.`,\n claimable: 0,\n cumulative_total: status.cumulative_total,\n claimed_total: status.claimed_total,\n };\n }\n\n const result = await this.client.claimRelay(walletClient);\n\n if (result.status === \"already_claimed\") {\n return {\n success: true,\n summary: `Already claimed through root ${result.root_seq}.`,\n already_claimed: true,\n root_seq: result.root_seq,\n };\n }\n\n return {\n success: true,\n summary:\n `Claimed CCM via gasless relay. ` +\n `Cumulative: ${formatCcm(result.cumulative_total)} CCM. ` +\n `Root seq: ${result.root_seq}. ` +\n `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: status.claimable,\n explorer: result.tx_sig\n ? `https://orbmarkets.io/tx/${result.tx_sig}`\n : null,\n };\n }\n}\n\nfunction formatCcm(nativeAmount: number | bigint): string {\n return (Number(nativeAmount) / 1e9).toFixed(2);\n}\n","/**\n * wzrd_rewards — Check pending and lifetime CCM rewards.\n */\n\nimport { Tool } from \"@goat-sdk/core\";\nimport { SolanaWalletClient } from \"@goat-sdk/wallet-solana\";\nimport { RewardsParameters } from \"../parameters\";\nimport type { WzrdClient } from \"../client\";\n\nexport class RewardsTools {\n constructor(private readonly client: WzrdClient) {}\n\n @Tool({\n description:\n \"Check your pending CCM rewards, lifetime total, and contribution count. \" +\n \"Use this to see how much you've earned from WZRD inference before claiming.\",\n })\n async wzrd_rewards(\n walletClient: SolanaWalletClient,\n _parameters: RewardsParameters,\n ) {\n const rewards = await this.client.getRewards(walletClient);\n\n return {\n summary:\n `WZRD Rewards: ` +\n `${(rewards.pending_ccm / 1e9).toFixed(2)} CCM pending, ` +\n `${(rewards.total_rewarded_ccm / 1e9).toFixed(2)} CCM lifetime, ` +\n `${rewards.contribution_count} contributions` +\n (rewards.rank ? `, rank #${rewards.rank}` : \"\"),\n pending_ccm: rewards.pending_ccm,\n total_rewarded_ccm: rewards.total_rewarded_ccm,\n contribution_count: rewards.contribution_count,\n rank: rewards.rank,\n };\n }\n}\n"],"mappings":"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","names":["PluginBase","DEFAULT_API","TOKEN_REFRESH_MARGIN_MS","B58","toBase58","bytes","digits","byte","carry","j","length","push","out","b","i","hexToBytes","hex","clean","startsWith","slice","Uint8Array","parseInt","substring","WzrdClient","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","sigBase58","verifyRes","method","headers","body","JSON","stringify","pubkey","text","expires_at","set","getTime","authedFetch","path","init","Headers","pickModel","taskType","res","data","models","model","infer","prompt","resolvedModel","task_type","catch","report","params","getRewards","economy","routing","pending_ccm","Number","total_rewarded_ccm","earned_ccm","rank","contribution_count","lifetime_contributions","claimRelay","getClaimStatus","cumulative_total","claimed_total","claimable","getLeaderboard","limit","Tool","SolanaWalletClient","createToolParameters","z","InferParameters","createToolParameters","z","object","prompt","string","describe","model","optional","task_type","enum","ReportParameters","model_id","execution_id","quality_score","number","min","max","latency_ms","int","positive","EarnParameters","ClaimParameters","RewardsParameters","InferTools","client","wzrd_infer","walletClient","parameters","prompt","model","task_type","taskType","result","infer","summary","provider","quality_score","toFixed","latency_ms","execution_id","response_preview","response","slice","description","Tool","SolanaWalletClient","ReportTools","client","wzrd_report","walletClient","parameters","result","report","model_id","execution_id","task_type","quality_score","latency_ms","summary","verification_state","contribution_id","toFixed","description","Tool","SolanaWalletClient","EVAL_PROMPTS","code","chat","reasoning","pickPrompt","taskType","prompts","Math","floor","random","length","EarnTools","client","wzrd_earn","walletClient","parameters","task_type","prompt","steps","push","model","pickModel","infer","provider","quality_score","toFixed","latency_ms","report","model_id","execution_id","verification_state","contribution_id","rewards","getRewards","pending_ccm","total_rewarded_ccm","summary","join","contribution_count","description","Tool","SolanaWalletClient","ClaimTools","client","wzrd_claim","walletClient","_parameters","status","getClaimStatus","claimable","success","summary","formatCcm","cumulative_total","claimed_total","result","claimRelay","root_seq","already_claimed","tx_sig","slice","claimable_before","explorer","description","nativeAmount","Number","toFixed","Tool","SolanaWalletClient","RewardsTools","client","wzrd_rewards","walletClient","_parameters","rewards","getRewards","summary","pending_ccm","toFixed","total_rewarded_ccm","contribution_count","rank","description","WzrdPlugin","PluginBase","options","client","WzrdClient","EarnTools","InferTools","ReportTools","ClaimTools","RewardsTools","supportsChain","chain","type","wzrd"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@wzrd_sol/goat-plugin",
3
- "version": "0.1.0",
4
- "description": "WZRD Liquid Attention Protocol plugin for GOAT SDK — deposit USDC, claim CCM, track velocity signals",
3
+ "version": "0.2.0",
4
+ "description": "WZRD Liquid Attention Protocol plugin for GOAT SDK — server-witnessed inference, verified CCM rewards, gasless claims",
5
5
  "license": "MIT",
6
6
  "sideEffects": false,
7
7
  "main": "./dist/index.js",
@@ -15,14 +15,13 @@
15
15
  "scripts": {
16
16
  "build": "tsup",
17
17
  "clean": "rm -rf dist",
18
- "typecheck": "tsc --noEmit"
18
+ "typecheck": "tsc --noEmit",
19
+ "prepublishOnly": "npm run build",
20
+ "prepack": "npm run build"
19
21
  },
20
22
  "dependencies": {
21
23
  "@goat-sdk/core": "^0.5.0",
22
24
  "@goat-sdk/wallet-solana": "^0.3.1",
23
- "@solana/web3.js": "^1.98.4",
24
- "@wzrd_sol/sdk": "^0.1.0",
25
- "tweetnacl": "^1.0.3",
26
25
  "zod": "^3.23.8"
27
26
  },
28
27
  "peerDependencies": {
@@ -40,12 +39,15 @@
40
39
  "agents",
41
40
  "solana",
42
41
  "wzrd",
43
- "attention",
44
- "defi"
42
+ "ccm",
43
+ "inference",
44
+ "earn",
45
+ "attention"
45
46
  ],
46
47
  "homepage": "https://twzrd.xyz",
47
48
  "repository": {
48
49
  "type": "git",
49
- "url": "git+https://github.com/twzrd-sol/wzrd-final.git"
50
+ "url": "git+https://github.com/twzrd-sol/wzrd-velocity.git",
51
+ "directory": "agents/goat-plugin"
50
52
  }
51
53
  }